Struts2框架学习(第三讲)

来源:互联网 发布:龙神的淘宝店 编辑:程序博客网 时间:2024/05/16 10:27

前面两讲我们分别介绍了struts2的特点以及使用过程中的流程、原理。今天我们主要是来看看struts2在实际使用的过程中数据的处理。

Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理。
值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言。
值栈:ValueStack一种数据结构,操作数据的方式为:先进后出
OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技术底层采用反射实现。

1、数据的提交方式
(1)form表单方式:

<form action="/user/login_Login.action" method="post" >  用户账号:<inputnameinputname="username" type="text" ><br>  用户密码:<inputnameinputname="userpswd" type="password"><br>  <input type="submit" value="登录">  </form>

(2)url的方式

http://127.0.0.1:8080/SSHDemo/deleteUser.action?id=9

(3)超链接的方式

<a href="/test/deleteUser.action?id=%{#user.id}">删除</a>   

(4)异步提交
ajax异步提交数据

2、数据存储
struts2拦截器功能,可以对请求进行拦截,获取所有的请求参数,循环遍历设置到值栈中。
Struts2主要提供下面的三种方式存贮数据。
1)属性驱动模式
Action中需要提供参数名称的set方法,框架会通过拦截器将请求参数获取到之后,会循环遍历将参数设置到值栈(栈顶对象)中。

 <input name="username" type="text" >  Ognl.setValue("username",action,"admin");//此时根对象是action  
private String username;publiv void setUsername(String username){this.username = username;}

2)模型驱动模式
必须要实现模型驱动接口,属于侵入性开发方式,不推荐使用
需要定义数据模型的类,将属性封装到数据模型类中,Action中只需要定义模型对象的类型属性(必须创建对象赋值),模型对象的get/set属性并不是必须的。
Action类需要实现ModelDriven接口,重写getModel()方法

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

3)域驱动模式
与属性驱动的原理是类似,也是通过参数拦截器,将请求参数获取后循环设置到值栈中。 在Action对象中定义模型对象属性,并提供get/set方法, 在表单元素中增加模型对象属性的名称.

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

3、数据的传递

拦截器将Http对象和包装后的Map集合对象都存放到ActionContext上下文对象集合中。所以可以根据ActionContext来获取想要使用的对象。常见如下三种方式:
1)获取HTTP对象

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集合

ActionContext ac = ActionContext.getContext();  Map session = ac.getSession();  Map session2 =(Map)ac.get("session");  Map session3=(Map)ac.get(ActionContext.SESSION);          Map application = ac.getApplication()  Map application = ac.get(ActionContext.APPLICATION);  Map application = ac.get("application");  

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

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

4、数据的显示
用El表达式的形式,取request对象中的值

${requestScope.username }  
或者也可以表示为:<%  Stringusername =(String)request.getAttribute("username");%> 

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

这一章节主要介绍了struts2中数据的处理,涉及到Ognl的地方比较多,对于对框架不是很熟悉的童鞋可能看的有点云里雾里,不要担心,在后续的章节中我会具体介绍到相关的知识,目前对数据的处理心里形成一个不出的概念即可。

1 0
原创粉丝点击