• 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
  • 相关阅读:
    jQuery动态效果学习笔记
    jQuery HTML操作学习笔记
    学习编程有必要做笔记吗?
    2017阿里巴巴面试技术挑战赛试题泄露
    来自IOS开发工程师的零基础自学HTML5经验分享
    前端学习笔记之HTML DOM操作
    web前端攻城狮整理的收藏夹
    WEB前端开发初学者必看的学习路线(附思维导图)
    搜狗员工用百度算什么,谷歌员工当着老板的面用bing,结果悲剧了!
    常用站长工具软件汇总,有没有一款你在用?
  • 原文地址:https://www.cnblogs.com/fengmingyue/p/6140444.html
Copyright © 2020-2023  润新知