zoukankan      html  css  js  c++  java
  • 【学习笔记】Struts2 类型转换

    为什么需要类型转换


    在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端
    但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boolean Date 等等
    因此 当这些参数进入应用程序时 必须被转换成适合的服务器端编程语言的数据类型

    在Servlet中 类型转换工作是由开发者自己完成的
    比如我们在易买网里要把分页的信息pageIndex读取出来
    String s=request.getParameter("pageIndex");
    int pageIndex=Integer.parseInt(s);

    类型转换的工作是必不可少的 重复性的. 如果有一个良好的类型转换机制 必将大大节省开发时间,提高开发效率

    Struts2提供了强大的类型转换功能

    1.内置转换器
    对于大部分的常用类型 开发人员在开发过程中不需要自己编码实现类型转换 这是因为在Struts2框架爱中可以完成大多数常用的类型转换
    //由内部提供的类型转换器完成
    1.String 将 int long double boolean String数组或者java.util.Date类型转换为字符串
    2.boolean/Boolean 在字符串和布尔值之间转换
    3.char/Character 在字符串和字符之间进行转换
    4.int/Integer float/Float long/Long double/Double
    5.Date 在字符串和日期只见进行转换 具体输入输出格式与当前的local有关
    6.数组和集合 在字符串数组和数组对象 几何对象之间进行转换

    2.自定义类型转换器

    pom.xml

    (需要注意的是build节点 否则局部properties可能无法识别到)

    <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.3</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-core</artifactId>
                <version>2.3.14</version>
            </dependency>
        </dependencies>
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
        </build>

    包结构如上

    converter

    //StrutsTypeConverter 继承自 DefaultTypeConverter
    //DefaultTypeConverter 有一个实现类 XWorkConverter

    @Inject
    public void setObjectFactory(ObjectFactory factory) {
    this.objectFactory = factory;
    // note: this file is deprecated
    loadConversionProperties("xwork-default-conversion.properties");
    
    loadConversionProperties("xwork-conversion.properties");
    }
    
    public String buildConverterFilename(Class clazz) {
    String className = clazz.getName();
    return className.replace('.', '/') + "-conversion.properties";
    }

    具体步骤

    1.新建一个converter包,在包下创建类型转换器类,继承自抽象类StrutsTypeConvert
    //实现两个方法
    public Object convertFromString(Map context, String[] values, Class toClass)
    //其中 context是OGNL上下文的Map对象
    //value是需要转换的字符串值
    //toType是要转换的目标类型

    public String convertToString(Map context, Object object)
    //object是要转换的对象

    public class DataConverter extends StrutsTypeConverter {
    
        private final DateFormat[] dfs = {
                new SimpleDateFormat("yyyy/MM/dd"),
                new SimpleDateFormat("yyyy-MM-dd")
        };
    
        public Object convertFromString(Map map, String[] strings, Class aClass) {
            String data = strings[0];
            for (int i = 0; i < dfs.length; i++) {
                try {
                    return dfs[i].parse(data);
                } catch (ParseException e) {
                    continue;
                }
            }
            throw new TypeConversionException();
        }
    
        public String convertToString(Map map, Object o) {
            Date date = (Date) o;
            return new SimpleDateFormat("yyyy年MM月dd日").format(date);
        }
    }

    2.配置全局类型转换器或者特定类的类型转换器
    //特定类
    在Action所在的包下建立 类名-conversion.properties
    配置: 特定类的属性名=类型转换器类的全名

    //全局
    在classpath下建立 xwork-conversion.properties
    配置: 需要转换的数据类型的类的全名=类型转换器类的全名

    3.处理类型转换错误
    //需要启动StrutsConversionErrorInterceptor拦截器 它包含在defaultStrack拦截器栈中
    (就是不用管)
    //需要实现ValidationAware接口 但是ActionSupport实现了这个接口

    //配置input结果映射
    (失败result=input)
    //用<s:filederror>接收

  • 相关阅读:
    Single Number II
    Pascal's Triangle
    Remove Duplicates from Sorted Array
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Unique Paths
    Sort Colors
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Climbing Stairs
  • 原文地址:https://www.cnblogs.com/swordtm/p/6538167.html
Copyright © 2011-2022 走看看