Struts2数据封装

转载自:http://blog.csdn.net/q547550831/article/details/53323206#comments

Struts2提供了一些基于拦截器的数据封装方式,一共有四种,分为静态参数封装和动态属性封装,动态属性封装又可分为属性驱动和模型驱动,属性驱动又可分为基本属性驱动和对象图导航语言(OGNL,Object Graph Navigation Language)驱动。

思维导图


静态参数封装

在struts.xml文件中配置
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <action name="testAction" class="com.pc.demo.web.action.TestAction" method="testAction">  
  2.      <result name="success">/success.jsp</result>  
  3.      <param name="username">Switch</param>  
  4.      <param name="password">123456</param>  
  5. </action>  

在Action文件中
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.pc.demo.web.action;  
  2. import com.opensymphony.xwork2.ActionSupport;  
  3.   
  4. /** 
  5.  * 静态参数封装 
  6.  * @author Switch 
  7.  * 
  8.  * 是由一个名称为staticParams的拦截器为我们封装的 
  9.  */  
  10. public class Demo1Action extends ActionSupport {  
  11.   
  12.     private String name;  
  13.     private Integer age;  
  14.   
  15.     public String testAction(){  
  16.         System.out.println("name is "+name+" and age is "+age);  
  17.         return SUCCESS;  
  18.     }  
  19.   
  20.     public String getUserName() {  
  21.         return name;  
  22.     }  
  23.   
  24.     public void setUserName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.   
  28.     public Integer getAge() {  
  29.         return age;  
  30.     }  
  31.   
  32.     public void setAge(Integer age) {  
  33.         this.age = age;  
  34.     }  
  35. }  

PS:注意封装参数都是按照get/set方法的名字,按名匹配的,不是按字段的名字进行匹配。

其底层是通过一个名叫staticParams的拦截器进行拦截的。

默认拦截器有如下这么多个,可以在Struts2核心包下的struts-default.xml文件中找到



动态参数封装

属性驱动封装

基本属性驱动
     基本属性封装是通过请求参数的名称,按照get/set方法的方式进行封装的。

JSP页面
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%--动态属性封装:属性驱动之基本属性 --%>  
  2. <form action="${pageContext.request.contextPath}/testAction2.action" method="post">  
  3.     用户名:<input type="text" name="name"/><br/>  
  4.     年龄:<input type="text" name="age"/><br/>  
  5.     <input type="submit" value="提交"/>  
  6. </form>  

在struts.xml文件中配置
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <action name="testAction2" class="com.pc.demo.web.action.TestAction2" method="testAction">  
  2.      <result name="success">/success.jsp</result>  
  3.  </action>  

在Action文件中
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.pc.demo.web.action;  
  2. import com.opensymphony.xwork2.ActionSupport;  
  3.   
  4. /** 
  5.  * 动态属性封装:属性驱动 
  6.  *      基本属性封装 
  7.  * 要想封装成功的要求: 
  8.  *      表单元素的name属性取值必须和动作类中私有属性的get/set该方法后面的部分保持一致。 
  9.  * @author Switch 
  10.  * 所有的封装动态参数操作:都是一个叫params的拦截器封装的。 
  11.  */  
  12. public class TestAction2 extends ActionSupport {  
  13.   
  14.     private String name;  
  15.     private Integer age;  
  16.   
  17.     public String testAction(){  
  18.         System.out.println("name is "+name+" and age is "+age);  
  19.         return SUCCESS;  
  20.     }  
  21.   
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.   
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.   
  30.     public Integer getAge() {  
  31.         return age;  
  32.     }  
  33.   
  34.     public void setAge(Integer age) {  
  35.         this.age = age;  
  36.     }  
  37. }  

PS:这种方式正如你所见,每个参数都要有get/set方法,如果请求参数过多的话,那么将使Action类变得非常臃肿,所以一般不建议使用。

对象导航图语言(OGNL)简单使用
     对象导航图语言和hibernate的对象导航查询很相似,都是基于对象加点号操作符的形式,来访问对象字段和其他关联对象。如果不熟悉hibernate,那么想想对象中的方法是怎样调用的,就能明白。

封装对象

JSP页面
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%--动态参数封装:对象导航映射   
  2.     此时表单元素的name属性取值已经不是一个普通的字符串了。  
  3.     而是一个OGNL表达式。  
  4.     OGNL:Object Graphic Navigationg Language  
  5.            对象        图        导航            语言  
  6. --%>  
  7. <form action="${pageContext.request.contextPath}/testAction3.action" method="post">  
  8.     用户名:<input type="text" name="user.name"/><br/>  
  9.     年龄:<input type="text" name="user.age"/><br/>  
  10.     <input type="submit" value="提交"/>  
  11. </form>  
  12.    

在struts.xml文件中配置
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <action name="testAction3" class="com.pc.demo.web.action.TestAction3" method="testAction">  
  2.      <result name="success">/success.jsp</result>  
  3.  </action>  

在Action文件中
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.pc.demo.web.action;  
  2.   
  3. import com.pc.demo.domain.User;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5.   
  6. /** 
  7.  * 动态参数封装:属性驱动 
  8.  *      OGNL 
  9.  * @author Switch 
  10.  * 所有的封装动态参数操作:都是一个叫params的拦截器封装的。 
  11.  */  
  12. public class TestAction3 extends ActionSupport {  
  13.   
  14.     private User user = new User();  
  15.   
  16.     public String testAction(){  
  17.         System.out.println("name is "+user.getName()+" and age is "+user.getAge());  
  18.         return SUCCESS;  
  19.     }  
  20.   
  21.     public User getUser() {  
  22.         System.out.println("getUser");  
  23.         return user;  
  24.     }  
  25.   
  26.     public void setUser(User user) {  
  27.         System.out.println("setUser");  
  28.         this.user = user;  
  29.     }  
  30. }  

PS:对象字段可以不需要new,创建出来,在拦截器中会判断一次,然后会进行处理,具体如下:


用户实体类
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.pc.demo.domain;  
  2.   
  3. import java.io.Serializable;  
  4. /** 
  5.  * 一个用户的实体(数据模型) 
  6.  * @author Switch 
  7.  * 
  8.  */  
  9. public class User implements Serializable {  
  10.   
  11.     private String name;  
  12.     private Integer age;  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public Integer getAge() {  
  20.         return age;  
  21.     }  
  22.     public void setAge(Integer age) {  
  23.         this.age = age;  
  24.     }  
  25.     @Override  
  26.     public String toString() {  
  27.         return "User [name=" + name + ", age=" + age + "]";  
  28.     }  
  29. }  

封装List集合

JSP页面
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%--动态参数封装:对象导航映射   
  2.     此时表单元素的name属性取值已经不是一个普通的字符串了。  
  3.     而是一个OGNL表达式。  
  4.     OGNL:Object Graphic Navigationg Language  
  5.            对象        图        导航            语言  
  6. --%>  
  7. <form action="${pageContext.request.contextPath}/testAction4.action" method="post">  
  8.     用户名:<input type="text" name="users[0].name"/><br/>  
  9.     年龄:<input type="text" name="users[0].age"/><br/>  
  10.     用户名:<input type="text" name="users[1].name"/><br/>  
  11.     年龄:<input type="text" name="users[1].age"/><br/>  
  12.     用户名:<input type="text" name="users[2].name"/><br/>  
  13.     年龄:<input type="text" name="users[2].age"/><br/>  
  14.     <input type="submit" value="提交"/>  
  15. </form>  
  16.    

在struts.xml文件中配置
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <action name="testAction4" class="com.pc.demo.web.action.TestAction4" method="testAction">  
  2.      <result name="success">/success.jsp</result>  
  3.  </action>  

在Action文件中
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.pc.demo.web.action;  
  2.   
  3. import com.pc.demo.domain.User;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5. import java.util.List;  
  6.   
  7. /** 
  8.  * 动态参数封装:属性驱动 
  9.  *      OGNL 
  10.  * @author Switch 
  11.  * 所有的封装动态参数操作:都是一个叫params的拦截器封装的。 
  12.  */  
  13. public class TestAction4 extends ActionSupport {  
  14.   
  15.     private List<User> users;  
  16.   
  17.     public String testAction(){  
  18.         System.out.println(users);  
  19.         return SUCCESS;  
  20.     }  
  21.   
  22.     public List<User> getUsers() {  
  23.         return users;  
  24.     }  
  25.   
  26.     public void setUsers(List<User> users) {  
  27.         this.users = users;  
  28.     }  
  29. }  

封装Map集合

JSP页面
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%--动态参数封装:对象导航映射   
  2.     此时表单元素的name属性取值已经不是一个普通的字符串了。  
  3.     而是一个OGNL表达式。  
  4.     OGNL:Object Graphic Navigationg Language  
  5.            对象        图        导航            语言  
  6. --%>  
  7. <form action="${pageContext.request.contextPath}/testAction5.action" method="post">  
  8.     用户名:<input type="text" name="map['switch'].name"/><br/>  
  9.     年龄:<input type="text" name="map['switch'].age"/><br/>  
  10.     用户名:<input type="text" name="map['kity'].name"/><br/>  
  11.     年龄:<input type="text" name="map['kity'].age"/><br/>  
  12.     用户名:<input type="text" name="map['tomcat'].name"/><br/>  
  13.     年龄:<input type="text" name="map['tomcat'].age"/><br/>  
  14.     <input type="submit" value="提交"/>  
  15. </form>  
  16.    

在struts.xml文件中配置
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <action name="testAction5" class="com.pc.demo.web.action.TestAction5" method="testAction">  
  2.      <result name="success">/success.jsp</result>  
  3.  </action>  

在Action文件中
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.pc.demo.web.action;  
  2.   
  3. import com.pc.demo.domain.User;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5. import java.util.Map;  
  6.   
  7. /** 
  8.  * 动态参数封装:属性驱动 
  9.  *      OGNL 
  10.  * @author Switch 
  11.  * 所有的封装动态参数操作:都是一个叫params的拦截器封装的。 
  12.  */  
  13. public class TestAction5 extends ActionSupport {  
  14.   
  15.     private Map<String,User> map;  
  16.   
  17.     public String testAction(){  
  18.         System.out.println(map);  
  19.         return SUCCESS;  
  20.     }  
  21.   
  22.     public Map<String,User> getMap() {  
  23.         return map;  
  24.     }  
  25.   
  26.     public void setMap(Map<String,User> map) {  
  27.         this.map = map;  
  28.     }  
  29. }  

模型驱动封装
     模型驱动(ModelDriven),是通过ModelDriven接口来接收请求参数,Action类必须要实现ModelDriven接口(可以使用泛型),并且要重写getModel()方法,这个方法返回的就是Action所使用的数据模型对象。
     模型驱动方式通过JavaBean模型进行数据传递。只要是普通的JavaBean,就可以充当模型部分。采用这种方式,JavaBean所封装的属性与表单的属性一一对应,JavaBean将成为数据传递的载体。

其是通过ModelDrivenInterceptor拦截器,进行封装的



JSP页面
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%--动态参数封装:对象导航映射   
  2.     此时表单元素的name属性取值已经不是一个普通的字符串了。  
  3.     而是一个OGNL表达式。  
  4.     OGNL:Object Graphic Navigationg Language  
  5.            对象        图        导航            语言  
  6. --%>  
  7. <form action="${pageContext.request.contextPath}/testAction6.action" method="post">  
  8.     用户名:<input type="text" name="name"/><br/>  
  9.     年龄:<input type="text" name="age"/><br/>  
  10.     <input type="submit" value="提交"/>  
  11. </form>  
  12.    

在struts.xml文件中配置
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <action name="testAction6" class="com.pc.demo.web.action.TestAction6" method="testAction">  
  2.      <result name="success">/success.jsp</result>  
  3.  </action>  

在Action文件中
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.pc.demo.web.action;  
  2.   
  3. import com.pc.demo.domain.User;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5. import com.opensymphony.xwork2.ModelDriven;  
  6.   
  7. /** 
  8.  * 动态参数封装:模型驱动 
  9.  * 要想实现模型驱动,必须满足以下要求: 
  10.  *         1、动作类必须实现ModelDriven接口 
  11.  *         2、动作类中必须定义一个模型对象,而且必须由我们自己实例化 
  12.  *         3、提供抽象方法的实现,并且返回模型 
  13.  * 
  14.  * @author Switch 
  15.  * 所有的封装动态参数操作:都是一个叫params的拦截器封装的。 
  16.  * 在模型驱动下,它需要modelDriven拦截器的支持。 
  17.  */  
  18. public class TestAction6 extends ActionSupport implements ModelDriven<User> {  
  19.   
  20.     private User user = new User();  
  21.   
  22.     @Override  
  23.     public User getModel() {  
  24.         return user;  
  25.     }  
  26.   
  27.     public String demo4(){  
  28.         System.out.println(user);  
  29.         return SUCCESS;  
  30.     }  
  31. }  

PS:在实际开发中,大部分情况下会使用模型驱动的方式进行封装,但是如果我们需要将请求参数封装成多个对象,那么就需要使用OGNL的方式了。

封装参数失败后的处理方式
          struts2框架默认转换的数据类型
              基本数据类型自动转换。
              日期类型按照本地格式转换。本地格式:yyyy-MM-dd   西方国家:MM/dd/yyyy
              字符串数组会按照(字符+逗号+空格的方式)拼接成字符串。
          关于没有input结果视图的解决
              在对应的动作类配置中配置一个<result name="input">的结果视图
              input结果视图的含义:在struts2中就是用于数据回显的。
              input结果视图配置的地址:从哪来回哪去
          错误信息提示
              需要借助struts2的标签库。
              <s:fielderror fieldName=""/>指定哪个字段有错误提示
              <s:actionerror/>指定动作方法执行的错误提示
          struts2中的国际化
              国际化:I18N    internationalization
              关于错误信息中文提示的解决
                   a、在实体类所在的包下创建一个名称为实体类名称.properties的文件
                        例如:User.java    User.properties
                   b、提示内容是根据页面上的错误信息改造的key
                         英文错误提示:Invalid field value for field "birthday
                         key:invalid.fieldvalue.birthday
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值