• Struts2第五篇【类型转换器、全局、局部类型转换器】


    前言

    上篇博文已经讲解了,Struts2为我们实现了数据自动封装…由上篇的例子我们可以看出,表单提交过去的数据全都是String类型的,但是经过Struts自动封装,就改成是JavaBean对应成员变量的类型了。

    但是呢,日期类型只支持是yyyy-MM-dd这种格式的,因为我们在上个例子中直接使用的是Struts支持的格式,因此没有报错…本篇博文就是讲解Struts如何对日期类型的格式更好地支持

    日期转换问题

    当我们使用的是yyyyMMdd这种格式的时候,我们看看Struts的自动封装能不能解析出相对应的日期

    这里写图片描述

    直接抛出了异常

    这里写图片描述

    这里写图片描述

    分析

    那么,我们怎么让Struts能够支持更多的日期格式呢??比如,我想Struts在自动封装数据的时候支持yyyyMMdd,yyyy年MM月dd日这样的日期格式…..

    Struts提供了转换器给我们使用,也就是,我们可以自定义转换器,我们定义了什么格式,Struts就可以根据对应的格式进行自动封装

    当我们写完自定义转换器,是需要向Struts说明我们写了,不然的话,Struts是不知道我们自定义了转换器类的…

    也就是说,我们要想实现类型转换,需要两步

    • 编写自定义转换器类
    • 告诉Struts我们写了转换器类

    自定义转换器类

    一般地,我们想要编写自定义转换器类,都是实现StrutsTypeConverter类的….

    /**
     * Created by ozc on 2017/5/1.
     * 自定义异常转换器类
     *
     * 我们要实现的就是:在Struts转换的时候,
     *
     */
    public class MyConvter extends StrutsTypeConverter {
    
    
        //需求,当Struts自动封装数据时,也支持yyyyMMdd,yyyy年MM月dd日等格式的支持
        SimpleDateFormat[] format = {new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyyMMdd"), new SimpleDateFormat("yyyy年MM月dd日")};
    
    
    
        /**
         * 把String转换为指定的类型 【String To Date】
         *
         *
         * @param map
         *            当前上下文环境
         * @param strings
         *            jsp表单提交的字符串的值
         * @param aClass
         *            要转换为的目标类型
         */
        @Override
        public Object convertFromString(Map map, String[] strings, Class aClass) {
    
            //判断是否有值
            if (strings == null) {
                return null;
            }
            //判断是否是日期类型的
            if (Date.class != aClass) {
                return null;
            }
    
            //遍历循环
            for (SimpleDateFormat dateFormat : format) {
                try {
    
                    //解析传递进来的第一个就行啦
                    dateFormat.parse(strings[0]);
                } catch (ParseException e) {
                    //如果格式不对,那么就跳出当前的循环
                    continue;
                }
            }
            return null;
        }
        @Override
        public String convertToString(Map map, Object o) {
            return null;
        }
    }
    
    

    告诉Struts,我写了转换器类

    告诉Struts我写了一个转换器类,也分两种方式

    • 定义了局部转换器类,就当前包下的Action类有效
    • 定义了全局转换器类,整个项目有效

    全局转换器

    步骤:

    • 在src目录下创建一个名为xwork-conversion.properties的文件
    • 配置文件的内容:需要转换的类类型=转换器类的全名java.util.Date=qwer.MyConvter

    局部转换器类

    步骤:

    • 在当前的Action包下创建名为Action名-conversion.properties的文件
    • 文件的内容为:需要转换的字段【如果是JavaBean里的字段,需要写上JavaBean的】=转换器类的全名user.birthday=qwer.MyConvter

    效果

    这里写图片描述这里写图片描述


    错误提示页面

    当发生了日期转换的异常时,Struts给出的页面是这样子的:

    这里写图片描述

    这个我们称之为input视图,我们要做的就是给出用户更友好的提示,于是在struts.xml文件中配置:如果返回的是input视图,那么跳转到我们相对应的页面上

       <result name="input">/error.jsp</result>
    

    这里写图片描述

  • 相关阅读:
    jQuery 插件
    jQuery 构造函数
    jQuery.merge()方法
    插入排序法
    归并排序法
    冒泡排序法
    选择排序法
    Jetty
    分布式锁&&redis
    Tomcat和设计模式
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202986.html
Copyright © 2020-2023  润新知