zoukankan      html  css  js  c++  java
  • Struts2中的数据类型转换

    Struts2对数据的类型转换
    一、Struts2中自带类型转换拦截器
    Struts2内部提供了大量转换器,用来完成数据类型转换的问题,有如下
    * boolean 和 Boolean
    * char和 Character
    * int 和 Integer
    * long 和 Long
    * float 和 Float
    * double 和 Double
    * Date 可以接收 yyyy-MM-dd 格式字符串
    * 数组 可以将多个同名参数,转换到数组中
    * 集合 支持将数据保存到 List 或者 Map 集合

    当发生类型转换错误的时候,根据报错的信息提示,跳转input类型的结果视图。
    * 说明如果程序出现异常,会跳转到input结果视图,那可以在<action>标签中配置input结果视图

    在跳转的页面中也可以通过一个固定的标签来显示错误的信息:
    * 可以先需要先引入Struts2的标签库,然后使用标签显示错误!
    <%@ taglib prefix="s" uri="/struts-tags" %>
    * <s:fielderror>,这是Struts2提供的标签,使用它显示错误的提示信息。

    如果类型转换的拦截器中发生了错误,那么会把错误信息放在Struts2错误区域中(Struts2的错误区域分成两部分,一部分是字段错误,一部分是Actionc错误)
    * 等执行到最后一个拦截器(workflow)时,workflow拦截器会去Struts2的错误区域中找是否存在错误。
    * 如果存在错误,就跳转到input视图。
    * 如果不存在错误,执行目标Action类中具体的方法。


    二、自定义类型转换器
    如果一些特殊的数据类型不能转换,那么需要自定义数据类型的转换器。
    开发自定义类型转换的具体方法有三个:

    1、实现TypeConverter接口,并实现一个方法
    Object convertValue(Map<String,Object> context,Object target, Member member,String propertyName,Object value,Class toType);
    因为这个方法太复杂,所以一般不会直接去实现这个接口,而采用下面继承的方法。


    2、继承DefaultTypeConverter类,重写一个方法

    Object convertValue(Map<String,Object> context,Object value,Class toType)
    >可以完成双向转换
    >context 类型转换环境的上下文
    >value 需要转换的参数
    >toType  目标类型


    3、继承StrutsTypeConverter类,重写两个方法

    * Object convertFromString(Map context,String[] values,Class toClass)
    > 从字符串转换成具体类型
    > values数组,存入的值就是用户输入的值
    > toClass 要转换的数据的类型 如Date.class
    * String convertToString(Map context,Object o)
    > 把具体的类型转换成字符串
    > o 代表的要转换的数据

    类型转换的代码,以 1990/10/10 为例,自定义日期转换器,完成转换,下面这段代码是第二种方法,也就是继承了DefaultTypeConverter类。



      public Object convertValue(Map<String, Object> context, Object value,
                Class toType) {
                // 根据toType判断 是请求封装 还是 数据回显
                DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
                if (toType == Date.class) {
                    // 请求参数封装 (value是字符串)
                    String[] params = (String[]) value;
                    String strVal = params[0]; // 转换为 日期类型
                    try {
                        return dateFormat.parse(strVal);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                } else {
                    // 回显(value是 Date)
                    Date date = (Date) value;
                    return dateFormat.format(date);
                }
                return null;
            }
    




    三、类型转换器的注册
    如果仅仅编写了类型转换器,strus2并不知道何时使用它,需要进行注册。
    1、局部注册:针对某个表单中的某个字段生效的!
    * 属性驱动的方式:使用set方法接收数据
    > 配置方法:在Action所在的包下创建一个文件,文件名的格式是:Action类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径
    例如:birthday=cn.cxk.demo3.MyDateConverter
    *模型驱动的方式:实现ModelDriven接口的方式
    > 配置方法:在实体类所在的包下创建一个文件,文件名的格式是:实体类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径
    例如:birthday=cn.cxk.demo3.MyDateConverter


    2、全局注册:针对整个项目的所有的日期类型都会生效的!
    * 在src的目录下,创建一个xwork-conversion.properties(名称是固定的)。内容格式是:类型转换中的原类型名=类型转换中的目标类型名
    > 例如:java.util.Date=cn.zlq.demo3.MyDateConverter
  • 相关阅读:
    题解 BZOJ1026 & luogu P2657 [SCOI2009]windy数 数位DP
    BZOJ 1867 [Noi1999]钉子和小球 DP
    P5057 [CQOI2006]简单题 前缀异或差分/树状数组
    P2051 [AHOI2009]中国象棋 大力DP
    P4208 [JSOI2008]最小生成树计数
    BZOJ 2440 [中山市选2011]完全平方数 二分+容斥
    Luogu P1951 收费站_NOI导刊2009提高(2) 二分 最短路
    Luogu P3527 [POI2011]MET-Meteors 整体二分
    Luogu P4109 [HEOI2015]定价 贪心
    Luogu P2114_[NOI2014]起床困难综合症 贪心
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653264.html
Copyright © 2011-2022 走看看