zoukankan      html  css  js  c++  java
  • Struts2中Action接收参数的方法主要有以下三种:

    Struts2中Action接收参数的方法主要有以下三种: 

    1.使用Action的属性接收参数(最原始的方式): 
        a.定义:在Action类中定义属性,创建get和set方法; 
        b.接收:通过属性接收参数,如:userName; 
        c.发送:使用属性名传递参数,如:user1!add?userName=jim; 
    2.使用DomainModel接收参数: 
        a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法; 
        b.接收:通过对象的属性接收参数,如:user.getUserName(); 
        c.发送:使用对象的属性传递参数,如:user2!add?user.userName=mike; 
    3.使用ModelDriven接收参数(现在用的比较多的方式): 
        a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),通过getModel方法返回该对象; 
        b.接收:通过对象的属性接收参数,如:user.getUserName(); 
        c.发送:直接使用属性名传递参数,如:user2!add?userName=tom 

    详细如下:

    一 、Action接收请求参数

    struts2内部提供三种请求参数封装机制

    1)      Action 本身作为model对象,通过成员setter封装(使用与成员少的)

    [java] view plain copy
     
     print?
    1. <form action="${pageContext.request.contextPath }/regist1.action" method="post">  
    2.     用户名 <input type="text" name="username" /><br/>  
    3.     密码<input type="password" name="password"/><br/>  
    4.     年龄 <input type="text" name="age" /><br/>  
    5.     <input type="submit" value="注册" />  
    6. </form>  
    7.   
    8. public class RegistAction1 extends ActionSupport {  
    9.     提交的有什么参数就设置什么字段,并写好setter方法  
    10.     private String username;  
    11.     private String password;  
    12.     private int age;  
    13.     public void setUsername(String username) {  
    14.         this.username = username;  
    15.     }  
    16.     public void setPassword(String password) {  
    17.         this.password = password;  
    18.     }  
    19.     public void setAge(int age) {  
    20.         this.age = age;  
    21.     }  
    22. }  

    注:通过以上特性就能清楚,struts2的action是多例的,每个用户有每个用户的参数,每个参数封装到一        组javabean中,也就是说每次请求都会创建 struts2的Action 对象。

             2)创建独立model对象,页面通过ognl表达式封装

    [java] view plain copy
     
     print?
    1. <form action="${pageContext.request.contextPath }/regist2.action" method="post">  
    2.     用户名 <input type="text" name="user.username" /><br/>  
    3.     密码<input type="password" name="user.password"/><br/>  
    4.     年龄 <input type="text" name="user.age" /><br/>  
    5.     <input type="submit" value="注册" />  
    6. </form>     
    7. * 页面中使用ognl写法 name="user.username"  底层就会执行 Action的setUser() --- > setUsername();  
    8. 在action中的写法  
    9. public class RegistAction2 extends ActionSupport {  
    10.     private User user;持有对象  
    11.     public void setUser(User user) {  
    12.         this.user = user;  
    13.     }  
    14. // 必须提供get方法 ----- 如果不提供只能封装一个属性,下次再封装第二个属性的时候又是一个新的user  
    15.     public User getUser() {  
    16.         return this.user;  
    17.     }  
    18. }  
    19. 单独创建一个user的domain  
    20. public class User {  
    21.     private String username;  
    22.     private String password;  
    23.     private int age;  
    24.     ...  
    25. }  

             3)使用ModelDriven接口,对请求数据进行封装

    页面可以直接写属性名称

    [java] view plain copy
     
     print?
    1. <form action="${pageContext.request.contextPath }/regist3.action" method="post">  
    2.     用户名 <input type="text" name="username" /><br/>  
    3.     密码<input type="password" name="password"/><br/>  
    4.     年龄 <input type="text" name="age" /><br/>  
    5.     <input type="submit" value="注册" />  
    6. </form>  
    7.   
    8. public class RegistAction3 extends ActionSupport  implements ModelDriven<User> {  
    9.     private User user = new User(); // 必须手动new,不然就出现空指针异常  
    10.     @Override  
    11.     public User getModel() {  
    12.         return user;  
    13.     }  
    14. }  
    15. 单独创建一个user的domain  
    16. public class User {  
    17.     private String username;  
    18.     private String password;  
    19.     private int age;  
    20. }  

    原理:发起请求后, struts2 会调用 getModel().setUsername()、 getModel().setPassword()因此必须手动 对model进行初始化

    结论:三种参数封装方式,在开发中主要使用第三种

               第一种只适用于请求参数非常少的情况的封装,第二种更加灵活,支持一个表单数据封装到不同model对象,第三种封装方式,只能支持一个model对象。

    二、 向集合元素属性中封装数据 (封装参数第二种写法,ognl 灵活写法)

    Collection(List、Set) 、 Map 

    [java] view plain copy
     
     print?
    1. 1、 Collection 接收  
    2. <form>  
    3.     第一个员工 姓名 <input type="text" name="employees[0].name" /><br/>  
    4.     第一个员工工资 <input type="text" name="employees[0].salary" /><br/>  
    5.     第二个员工 姓名 <input type="text" name="employees[1].name" /><br/>  
    6.     第二个员工工资 <input type="text" name="employees[1].salary" /><br/>  
    7.     <input type="submit" value="提交" />  
    8. </form>  
    9.   
    10. public class EmployeeAction extends ActionSupport {  
    11.     // 接收多个 Employee信息,定义集合  
    12.     private Collection<Employee> employees;  
    13.     提供set、get方法  
    14.     public Collection<Employee> getEmployees() {  
    15.         return employees;  
    16.     }  
    17.     public void setEmployees(Collection<Employee> employees) {  
    18.         this.employees = employees;  
    19.     }  
    20. }  
    21.   
    22. 2、 Map 接收  
    23. <form action="${pageContext.request.contextPath }/employee2.action" method="post">  
    24.     第一个员工 姓名 <input type="text" name="employees['first'].name" /><br/>  
    25.     第一个员工工资 <input type="text" name="employees['first'].salary" /><br/>  
    26.     第二个员工 姓名 <input type="text" name="employees['second'].name" /><br/>  
    27.     第二个员工工资 <input type="text" name="employees['second'].salary" /><br/>  
    28.     <input type="submit" value="提交" />  
    29. </form>  
    30.   
    31. public class EmployeeAction2 extends ActionSupport {  
    32.     private Map<String, Employee> employees;  
    33.     public Map<String, Employee> getEmployees() {  
    34.         return employees;  
    35.     }  
    36.     public void setEmployees(Map<String, Employee> employees) {  
    37.         this.employees = employees;  
    38.     }  
    39. }  

    Struts2内建类型转换器

    对于大部分常用类型,开发者根本无需创建自己的转换器,Struts2内置了常见数据类型多种转换器

    •    boolean 和 Boolean

    •    char和 Character

    •    int 和 Integer

    •    long 和 Long

    •    float 和 Float

    •    double 和 Double

    •    Date 可以接收 yyyy-MM-dd格式字符串

    •    数组  可以将多个同名参数,转换到数组中

    •    集合  支持将数据保存到 List或者 Map 集合

    客户端请求过来的数据都是字符串,struts2可以判断你的model中相对于的字段是什么类型的,再帮你将字符串转换成什么类型的。但是有时我们的需求类型并不止这些,因此这时候就要自定义转换器了。

    内建类型无法转换时就会抛出这样的异常:java.lang.NoSuchMethodException:

             Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口,自定        义类型转换器必须实现ongl.TypeConverter

    备注:TypeConverter接口提供convertValue方法,此方法要传入6个参数,DefaultTypeConverter实现了              TypeConverter接口,覆盖了convertValue方法,需要传入3个参数,在struts2内部提供                                 StrutsTypeConverter 继承DefaultTypeConverter,将 convertValue 拆分为两个方法:

             convertFromString(java.util.Mapcontext, java.lang.String[] values, java.lang.Class toClass)

             convertToString(java.util.Map context,java.lang.Object o)

    自定义类型转换器,继承 DefaultTypeConverter ,覆盖 convertValue

      在convertValue方法中有两层含义,第一种 String到目标类型,第二种目标类型到 String 

    [java] view plain copy
     
     print?
    1. 1、 自定义类型转换器   
    2.     例:public class DateConverter extends DefaultTypeConverter {  
    3.                 @Override  public Object convertValue(Map context, Object value, Class toType) {  
    4.     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");  
    5.     try {   
    6.         if(toType == Date.class){//当字符串向Date类型转换时  
    7.             String[] params = (String[]) value;// Request.getParameterValues()   
    8.             return dateFormat.parse(params[0]);  
    9.         }else if(toType == String.class){//当Date转换成字符串时  
    10.             Date date = (Date) value;  
    11.             return dateFormat.format(date);  
    12.         }  
    13.     } catch (ParseException e) {}  
    14.     return null;  
    15.     }  
    16. }  

    2、 在struts2 框架中注册类型转换器

    第一种 局部类型转换器,只针对当前Action有效

    在Action类所在的包下放置ActionClassName-conversion.properties文件

             属性名称=类型转换器的全类名

    第二种 全局类型转换器,对所有Action都有效

    在src下放置xwork-conversion.properties文件

             待转换的类型=类型转换器的全类名

    3、 在类型转换过程中发生异常,自动跳转到 input 结果页面  

    <interceptorname="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>负责当发生类型转换错误时,将转换错误信息 保存到 fielderror 中

    在jsp中 通过struts2 提供标签 <s:fielderror /> 查看类型转换错误信息

    在查看之前需要导入标签库<%@tagliburi="/struts-tags" prefix="s" %> 

    <s:fielderror/>

    自定义错误信息?? 需要国际化信息文件

    在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 :invalid.fieldvalue.属性名= 错误信息

  • 相关阅读:
    shell
    Python全栈开发:django网络框架(二)
    Python全栈开发:django网络框架(一)
    动态规划问题以及诸多实例分析
    python实现并查集
    使用命令行编译和运行 c、Java和python程序
    整数除法操作的取整问题
    使用TensorFlow低级别的API进行编程
    使用TensorFlow高级别的API进行编程
    TensorFlow安装和HelloWorld
  • 原文地址:https://www.cnblogs.com/haimishasha/p/6193235.html
Copyright © 2011-2022 走看看