zoukankan      html  css  js  c++  java
  • Struts2类型转换

    Struts2类型转换(了解)
      struts2 内部提供大量类型转换器,用来完成数据类型转换问题
        boolean 和 Boolean
        char和 Character
        int 和 Integer
        long 和 Long
        float 和 Float
        double 和 Double
        Date 可以接收 yyyy-MM-dd yyyy年MM月dd日格式字符串
        数组 可以将多个同名参数,转换到数组中
        集合 支持将数据保存到 List 或者 Map 集合
      但是,有时候Struts2也不能处理某些转换(极少),例如:日期类型,我们传递 yyyy-MM-dd yyyy年MM月dd日格式都可以,但是如果是yyyy/MM/dd就会出现问题,这是我们就需要自定义类型转换器
      自定义类型转换器
        步骤:
          1.创建一个类实现TypeConverter接口.
          2.重写接口中方法,实现类型转换操作.
          3.注册类型转换器.
        详细说明:
          1) 自定义类型转换器
            第一种 实现TypeConverter接口

    convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object target, java.lang.reflect.Member member, java.lang.String propertyName, java.lang.Object value, java.lang.Class toType)

              如果实现接口,这个方法参数太多(6个)
            第二种 不推荐实现接口,可以继承 DefaultTypeConverter(已实现TypeConverter接口)

    convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object value, java.lang.Class toType) 

              优点:重写的方法参数没有那么多
            第三种 继承DefaultTypeConverter类的一个子类StrutsTypeConverter(推荐)

    convertFromString(java.util.Map context, java.lang.String[] values, java.lang.Class toClass) --- 请求封装(页面提交请求参数,封装到model)
    convertToString(java.util.Map context, java.lang.Object o) --- 数据回显(model数据在页面回显) 

          2) 以 1990/10/10 为例,自定义日期转换器,完成转换

    public class MyTypeConverter extends StrutsTypeConverter {
      // 接收页面传递的数据封装到javaBean.
      @Override
      public Object convertFromString(Map context, String[] values, Class toClass) {
        // System.out.println(context); //ognl.OgnlContext@faae2497
        // System.out.println(values[0]); //[Ljava.lang.String;@100c4d
        // System.out.println(toClass); //class java.util.Date
        String value = values[0];
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        Date date = null;
        try {
          date = sdf.parse(value);
        } catch (ParseException e) {
          throw new RuntimeException();
        }
        return date;
      }
      @Override
      public String convertToString(Map context, Object o) {
        return null;
      }
    }    

          3) 注册类型转换器
            1.局部--针对于action
              配置文件所在位置以及名称: 在Action类所在包 创建 Action类名-conversion.properties ,
              配置文件书写: 格式 : 属性名称=类型转换器的全类名
            2.局部--针对于model
              配置文件所在位置以及名称: 在model类所在包 创建 model类名-conversion.properties ,
              配置文件书写: 格式 : 属性名称=类型转换器的全类名
            3.全局
              配置文件所在位置以及名称:在src下创建一个xwork-conversion.properties
              配置文件书写: 格式: 要转换的类型全名=类型转换器的全类名
      类型转换错误处理
        对于struts2中类型转换器,如果表单数据提交时,将数据向model封装,出现了问题,会报错:No result defined for action cn.itcast.action.RegistAction and result input
        上面的意思是说,在RegistAction的配置中没有配置input结果视图.

    <action name="regist" class="cn.itcast.action.RegistAction">
      <result name="input">/success.jsp</result>
    </action>

        如果配置了,出现类型转换问题,就会跳转到input指定的视图。
        问题:为什么会向input视图跳转(因为struts2中的拦截器(interceptor))?
          在struts2中的
            <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>用于记录类型转换问题
            <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>用于得到问题,向input视图跳转。
        关于错误信息展示:
          通过分析拦截器作用,得知当类型转换出错时,自动跳转input视图 ,在input视图页面中 <s:fieldError/> 显示错误信息
          在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 : invalid.fieldvalue.属性名= 错误信息
          如果是自定义类型转换器,出现类型转换问题,要跳转到input视图,在类型转换器中,必须抛出异常才可以。

    详细案例:

     1 public class RegistAction extends ActionSupport {
     2     private String username;
     3     private String password;
     4     private int age;
     5     private Date birthday;
     6     private String[] hobby;
     7     @Override
     8     public String execute() throws Exception {
     9 
    10         System.out.println(this.toString());
    11 
    12         return null;
    13     }
    14     @Override
    15     public String toString() {
    16         return "RegistAction [username=" + username + ", password=" + password
    17                 + ", age=" + age + ", birthday=" + birthday + ", hobby="
    18                 + Arrays.toString(hobby) + "]";
    19     }
    20     public String[] getHobby() {
    21         return hobby;
    22     }
    23     public void setHobby(String[] hobby) {
    24         this.hobby = hobby;
    25     }
    26     public String getUsername() {
    27         return username;
    28     }
    29     public void setUsername(String username) {
    30         this.username = username;
    31     }
    32     public String getPassword() {
    33         return password;
    34     }
    35     public void setPassword(String password) {
    36         this.password = password;
    37     }
    38     public int getAge() {
    39         return age;
    40     }
    41     public void setAge(int age) {
    42         this.age = age;
    43     }
    44     public Date getBirthday() {
    45         return birthday;
    46     }
    47     public void setBirthday(Date birthday) {
    48         this.birthday = birthday;
    49     }
    50 }
    RegistAction
    birthday=cn.utils.MyTypeConverter
    RegistAction-conversion.properties
    invalid.fieldvalue.birthday=u65E5u671Fu683Cu5F0Fu8981u6C42 yyyy/MM/dd
    RegistAction.properties
     1 public class MyTypeConverter extends StrutsTypeConverter {
     2     // 接收页面传递的数据封装到javaBean.
     3     @Override
     4     public Object convertFromString(Map context, String[] values, Class toClass) {
     5         // System.out.println(context); //ognl.OgnlContext@faae2497
     6         // System.out.println(values[0]); //[Ljava.lang.String;@100c4d
     7         // System.out.println(toClass); //class java.util.Date
     8         String value = values[0];
     9         SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
    10         Date date = null;
    11         try {
    12             date = sdf.parse(value);
    13         } catch (ParseException e) {
    14             throw new RuntimeException();
    15         }
    16         return date;
    17     }
    18     @Override
    19     public String convertToString(Map context, Object o) {
    20         return null;
    21     }
    22 }
    MyTypeConverter
    <body>
        <form action="${pageContext.request.contextPath}/regist" method="post">
            username:<input type="text" name="username"><br>
            password:<input type="password" name="password"><br>
            hobby:<input type="checkbox" name="hobby" value="eat"><input
                type="checkbox" name="hobby" value="drink"><input
                type="checkbox" name="hobby" value="play"><br> age:<input
                type="text" name="age"><br> birthday:<input type="text"
                name="birthday"><br> <input type="submit" value="注册">
        </form>
    </body>
    index.jsp
    <body>
        <s:fielderror/>
    </body>
    success.jsp
    <struts>
        <package name="default" namespace="/" extends="struts-default">
            <action name="regist" class="cn.itcast.action.RegistAction">
                <result name="input">/success.jsp</result>
            </action>
        </package>
    </struts>
    struts.xml
  • 相关阅读:
    在日本被禁止的コンプガチャ設計
    Starling常见问题解决办法
    Flixel引擎学习笔记
    SQLSERVER中修复状态为Suspect的数据库
    T4 (Text Template Transformation Toolkit)实现简单实体代码生成
    创建Linking Server in SQL SERVER 2008
    Linq to Sql 与Linq to Entities 生成的SQL Script与分页实现
    Linq to Entity 的T4 模板生成代码
    在VisualStudio2008 SP1中调试.net framework 源代码
    使用HttpModules实现Asp.net离线应用程序
  • 原文地址:https://www.cnblogs.com/fengmingyue/p/6140444.html
Copyright © 2011-2022 走看看