zoukankan      html  css  js  c++  java
  • struts中的请求数据自动封装

      Struts 2框架会将表单的参数以同名的方式设置给对应Action的属性中。该工作主要是由Parameters拦截器做的。而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作。在struts中,默认使用拦截器

    <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

    进行请求数据自动封装,它会JSP中提交的数据(基本数据类型、String、和日期)进行自动转换。

      有时候, 需要将表单字段映射到多个对象的不同属性上,form 标签可以被映射到Action中一个属性的属性。Struts 2首先通过反射技术调用address的默认构造器创建address对象,然后再通过反射技术调用address中与请求参数同名的属性的setter方法来获取请求参数值。

    1.两种请求数据

      如果Action中属性只是基本数据类型,需要给出set()方法,get()方法可以不给。表单的数据名需要和Action类中的属性名一致,struts会完成相应的自动转换,Date对象的默认格式为yyyy-MM-dd。

      如果Action中属性为对象类型,必须要给出get()和set()方法,表单的数据名为对象.属性的方式。

    <form action="${pageContext.request.contextPath}/user_register.action" method="post">
        用户名:<input type="text" name="user.userName"><br>
        密  码:<input type="password" name="user.password"><br>
        年  龄:<input type="text" name="user.age"><br>
        生  日:<input type="text" name="user.birth"><br>
        <input type="submit" value="提交"><br>
    </form>

    2.struts中自定义转换器

      如果现有的转换器不能满足需要,可以自定义转换器。struts中的转换器有两种类型:局部类型转换器、全局类型转换器。自定义转换器的过程为:

    • 继承StrutsTypeConverter,重写Convert中的抽象方法;
    public class MyConverter extends StrutsTypeConverter{
        //需要支持的格式为:yyyy-mm-dd、yyyymmdd、yyyy年mm月dd日
        //预定义三种格式
        SimpleDateFormat[] formats = {
                new SimpleDateFormat("yyyy-mm-dd"),
                new SimpleDateFormat("yyyymmdd"),
                new SimpleDateFormat("yyyy年mm月dd日")
    
        };
        /**
         *把string转换为指定的类型
         * @param map 当前上下文环境
         * @param strings jsp宝典提交的字符串的值
         * @param aClass 要转换为的目标类型
         */
        @Override
        public Object convertFromString(Map map, String[] strings, Class aClass) {
            System.out.println("into conversion");
            //内容不能为空
            if(strings == null || strings.length == 0)
                return null;
            //类型必须为Date
            if(Date.class != aClass)
                return null;
    
            for(int i =0;i<formats.length;i++){
                try {
                    return formats[i].parse(strings[0]);
                } catch (ParseException e) {
    //                throw new RuntimeException("第i次转换失败",e);
                    continue;
                }
            }
            return null;
        }
    
        @Override
        public String convertToString(Map map, Object o) {
            return null;
        }
    }
    • 通知struts使用该转换器;

      如果作为局部类型转换器,在与需要转换的Action类目录中新建ActionClassName-conversion.properties文件,文件中写:需要转换的字段名=自定义转换器类的全限定名,例如:

    birthday=cn.itcast.convertor.DateTypeConvertor

      如果作为全局类型转换器,需要在项目src目录下新建xwork-conversion.properties文件,在文件中写:

    需要转换的类类型=转换器的全限定名,例如:

    java.util.Date= cn.itcast.converter.DateConverter
  • 相关阅读:
    【模板】Sparse-Table
    UVa 11235 Frequent values
    【模板】树状数组
    UVa 1428 Ping pong
    数学技巧
    UVa 11300 Spreading the Wealth
    UVa 11729 Commando War
    UVa 11292 Dragon of Loowater
    POJ 3627 Bookshelf
    POJ 1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/juaner767/p/5524484.html
Copyright © 2011-2022 走看看