• 【学习笔记】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>接收

  • 相关阅读:
    Oracle
    Oracle入门
    数据库测试的测试点
    overload重载与override重写的区别
    Java接口的default关键字用法解释
    pytest执行入口
    Gradle的安装与基本配置
    玩转HTML5+跨平台开发[5] HTML表单标签
    玩转HTML5+跨平台开发[4] HTML表格标签
    玩转HTML5+跨平台开发[3] HTML列表标签
  • 原文地址:https://www.cnblogs.com/swordtm/p/6538167.html
Copyright © 2020-2023  润新知