Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理。值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言。
值栈:ValueStack一种数据结构,操作数据的方式为:先进后出
OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技术底层采用反射实现。
一:数据的提交方式
1
2
3
4
5
6
|
,<form>表单提交
<form action= "/user/login_Login.action" method= "post" >
用户代码:<inputnameinputname= "usercode" type= "text" ><br>
用户密码:<inputnameinputname= "userpswd" type= "password" ><br>
<inputtypeinputtype= "submit" value= "登录" >
</form>
|
2,url的方式
http://localhost.egov.com/user/login_Login.action?usercode=admin&userpswd=admin
3,超链接
1
|
<a href= "/user/delete.action?usercode=admin" rel= "external nofollow" >删除</a>
|
4,异步提交
ajax异步提交数据
二:数据存储
数据的存储依赖于框架提供的拦截器功能,拦截器可以对请求进行拦截,获取所有的请求参数,循环遍历设置到值栈中。框架默认将被请求的Action对象存放到值栈的栈顶。Struts2框架提供三种方式将参数存入值栈
1,属性驱动模式
Action中需要提供参数名称的set方法,框架会通过拦截器将请求参数获取到之后,会循环遍历将参数设置到值栈(栈顶对象)中。
1
2
|
<input name= "usercode" type= "text" >
Ognl.setValue( "usercode" ,action, "admin" ); //此时根对象是action
|
2,模型驱动模式
必须要实现模型驱动接口,属于侵入性开发方式,不推荐使用
需要定义数据模型的类,将属性封装到数据模型类中,Action中只需要定义模型对象的类型属性(必须创建对象赋值),模型对象的get/set属性并不是必须的。
Action类需要实现ModelDriven接口,重写getModel()方法。
1
2
|
<inputnameinputname= "usercode" type= "text" ><br>表单依然是模型对象的属性名称作为参数名称
Ognl.setValue( "usercode" ,user, "admin" ); //此时根(栈顶)对象是user对象
|
3,域驱动模式
与属性驱动的原理是类似,也是通过参数拦截器,将请求参数获取后循环设置到值栈中。
在Action对象中定义模型对象属性,并提供get/set方法;
在表单元素中增加模型对象属性的名称;
1
2
|
<inputnameinputname= "user.usercode" type= "text" >
Ognl.setValue( "user.usercode" ,action, "admin" ); //此时根对象是action
|
三:数据的传递
框架将Http对象和包装后的Map集合对象都存放到ActionContext上下文对象集合中。所以可以根据ActionContext来获取想要使用的对象。
1,获取HTTP对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
ActionContext ac = ActionContext.getContext(); //上下文对象相当于request范围
HttpServletRequest request =(HttpServletRequest)ac.get(StrutsStatics.HTTP_REQUEST);
HttpSession session = request.getSession( false );
ServletContext application = session.getServletContext();
ServletContext application = ac.get(StrutsStatics.SERVLET_CONTEXT);
HttpServletRequest request = ServletActionContext.getRequest(); (推荐使用)
HttpServletResponse response =ServletActionContext.getResponse();
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集合
1
2
3
4
5
6
7
|
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, 获取值栈对象以及参数集合对象
1
2
3
|
ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack();
Map paramts = ac.getParameters();
|
四:数据的显示
用El表达式的形式,取request对象中的值
1
|
${requestScope.username }
|
而这种表达式的方式可以表示成java代码的方式:
1
2
3
4
|
<%
Stringusername =(String)request.getAttribute( "username" ); //被重写的方法,底层是通过ognl查询值栈中的数据
out.print(username);
%>
|
从request返回取数据,实质上底层是通过Ognl语言操作值栈中的数据。 ActionContext对象的集合和OgnlValueStack值栈的集合为同一个集合对象,所以从值栈的Map集合中取数据,就相当于从ActionContext上下文中取数据。
总结
以上所述是小编给大家介绍的struts2数据处理_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!