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
  • 相关阅读:
    Chrome开发者工具中Elements(元素)断点的用途
    最简单的SAP云平台开发教程
    Java实现 LeetCode 495 提莫攻击
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 492 构造矩形
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653264.html
Copyright © 2011-2022 走看看