Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理。

值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言。

值栈:ValueStack一种数据结构,操作数据的方式为:先进后出

OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技术底层采用反射实现。

一:数据的提交方式

1,<form>表单提交

<form action="/user/login_Login.action" method="post" >
用户代码:<inputname="usercode" type="text" ><br>
用户密码:<inputname="userpswd" type="password"><br>
<inputtype="submit" value="登录">
</form>

2,url的方式

http://localhost.egov.com/user/login_Login.action?usercode=admin&userpswd=admin

3,超链接

<a href="/user/delete.action?usercode=admin">删除</a>  

4,异步提交

ajax异步提交数据

二:数据存储

数据的存储依赖于框架提供的拦截器功能,拦截器可以对请求进行拦截,获取所有的请求参数,循环遍历设置到值栈中。框架默认将被请求的Action对象存放到值栈的栈顶。Struts2框架提供三种方式将参数存入值栈

1,属性驱动模式

Action中需要提供参数名称的set方法,框架会通过拦截器将请求参数获取到之后,会循环遍历将参数设置到值栈(栈顶对象)中。

<input name="usercode" type="text" >
Ognl.setValue("usercode",action,"admin");//此时根对象是action

2,模型驱动模式

必须要实现模型驱动接口,属于侵入性开发方式,不推荐使用

需要定义数据模型的类,将属性封装到数据模型类中,Action中只需要定义模型对象的类型属性(必须创建对象赋值),模型对象的get/set属性并不是必须的。

Action类需要实现ModelDriven接口,重写getModel()方法。

<inputname="usercode" type="text" ><br>表单依然是模型对象的属性名称作为参数名称
Ognl.setValue("usercode",user,"admin");//此时根(栈顶)对象是user对象

3,域驱动模式

与属性驱动的原理是类似,也是通过参数拦截器,将请求参数获取后循环设置到值栈中。

在Action对象中定义模型对象属性,并提供get/set方法;

在表单元素中增加模型对象属性的名称

<inputname="user.usercode" type="text" >
Ognl.setValue("user.usercode",action,"admin");//此时根对象是action

三:数据的传递

框架将Http对象和包装后的Map集合对象都存放到ActionContext上下文对象集合中。所以可以根据ActionContext来获取想要使用的对象。

1,获取HTTP对象

   ActionContext ac = ActionContext.getContext(); //上下文对象相当于request范围
(1) HttpServletRequest request =(HttpServletRequest)ac.get(StrutsStatics.HTTP_REQUEST); HttpSession session = request.getSession(false); ServletContext application = session.getServletContext();
ServletContext application = ac.get(StrutsStatics.SERVLET_CONTEXT); (2) HttpServletRequest request = ServletActionContext.getRequest(); (推荐使用)
HttpServletResponse response =ServletActionContext.getResponse(); (3) Action类实现ServletRequestAware,或ServletResponseAware (属于侵入性开发方式,不推荐使用) private HttpServletRequest request ; //set注入
private HttpServletResponse response ; @Override
public void setServletRequest(HttpServletRequest request) { //实现该方法,该方法由框架调用,传递参数。
this.request= request ;
} @Override
public void setServletResponse(HttpServletResponse response) {
this.response= response ;
}

2,获取Map集合

 ActionContext ac = ActionContext.getContext();

  Mapsession = ac.getSession();
Mapsession2 =(Map)ac.get("session");
Mapsession3=(Map)ac.get(ActionContext.SESSION); Mapapplication = ac.getApplication()
Mapapplication = ac.get(ActionContext.APPLICATION);
Mapapplication = ac.get("application");

3, 获取值栈对象以及参数集合对象

 ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack(); Map paramts = ac.getParameters();

四:数据的显示

用El表达式的形式,取request对象中的值

  ${requestScope.username }

  而这种表达式的方式可以表示成java代码的方式:

  <%
Stringusername =(String)request.getAttribute("username");//被重写的方法,底层是通过ognl查询值栈中的数据
out.print(username);
%>

从request返回取数据,实质上底层是通过Ognl语言操作值栈中的数据。 ActionContext对象的集合和OgnlValueStack值栈的集合为同一个集合对象,所以从值栈的Map集合中取数据,就相当于从ActionContext上下文中取数据。

Struts2(3) —— 数据处理的更多相关文章

  1. java之struts2的数据处理

    这里的数据处理,指的是页面上的数据与Action中的数据的处理. struts2中有3种方式来接收请求提交的数据.分别是:属性驱动方式.对象驱动方式.模型驱动方式 1. 属性驱动方式 要求页面中的表单 ...

  2. struts2 之 struts2数据处理

    开门见山,struts2的数据处理总结: 1. 在servlet中,如果要获取页面提交的数据要使用requerst.getParameter方法来获取,并且每次需要进行相关的类型转换工作,数据的获取及 ...

  3. 浅谈Struts2(三)

    一.Struts2收集client的参数 核心思路: <form method="post" action="XXXX"> <input ty ...

  4. java框架学习系列

    这篇文章的目的主要是作为一个框架学习的索引,方便查找及顺序学习 一.struts2学习 1. java之struts框架入门教程 2. java之struts2的执行流程讲解 3. java之stru ...

  5. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  6. struts2数据处理的几种方式

    package com.loaderman.c_data; import java.util.Map; import javax.servlet.ServletContext; import com. ...

  7. Struts2中的数据处理的三种方式对比(Action中三种作用域request,session,application对象)

    1:在Action中如何获得作用域(request,session,application)对象: 取得Map(键值对映射集)类型的requet,session,application; 对数据操作的 ...

  8. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

  9. Struts2入门(四)——数据输入验证

    一.前言 1.1.什么是输入验证?为什么需要输入验证? 在上一篇文章中,我们学习了数据类型转换,我们提到了表示层数据处理的两个方法,也提到了用户输入数据需要进行类型转换才能得到我们想要的数据,那么,我 ...

随机推荐

  1. SSIS 处理NULL

    不同于SQL Server中NULL表示值是未知的(Unknown Value),没有数据类型,但是,在SSIS中,NULL是有数据类型的,要获取某一个NULL值,必须指定数据类型,例如,变量 Int ...

  2. LINQ系列:LINQ to SQL Select查询

    1. 查询全部字段 using (NorthwindContext context = new NorthwindContext()) { var expr = context.Products; f ...

  3. 推荐21款最佳 HTML5 网页游戏

    尽管 HTML5 的完全实现还有很长的路要走,但 HTML5 正在改变 Web,未来 HTML5 将把 Web 带入一个更加成熟和开放的应用平台.现在,越来越多的人尝试用 HTML5 来制作网页游戏等 ...

  4. jquery ajax(实现单独提交某个form)

    function submitTaskScore(formid) {//formid表示的是表单的id $.ajax({ type:"post", url:"compan ...

  5. ASP.NET MVC之下拉框绑定四种方式(十)

    前言 上两节我们讲了文件上传的问题,关于这个上传的问题还未结束,我也在花时间做做分割大文件处理以及显示进度的问题,到时完成的话再发表,为了不耽误学习MVC其他内容的计划,我们今天开始好好讲讲关于MVC ...

  6. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  7. 相克军_Oracle体系_随堂笔记009-检查点队列

    1.检查点队列 checkpoint queue RBA 日志块地址 redo block address LRBA 第一次被脏的地址 HRBA 最近一次被脏的地址 on disk rba 重做日志( ...

  8. Hibernate之HQL添加过滤器查询的用法

    HQL查询过程中支持添加过滤器.使用步骤是这样的: 首先在要查询的实体对象的映射中使用<filter-def>标签配置过滤器,并在相对应的<class>标签中添加对应的< ...

  9. Handle类与线程

    首先声明Handle对象和该类的handleMessage方法: Handler BarHandler = new Handler(){ @Override public void handleMes ...

  10. 浅析JS中的模块规范(CommonJS,AMD,CMD)

    如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧,这些规范到底是啥东西,干嘛的. 一.CommonJS ...