• 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
  • 相关阅读:
    【sql:练习题3】查询在 SC 表存在成绩的学生信息
    【sql:练习题2】查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
    学习设计模式之动态代理
    学习设计模式之静态代理
    学习设计模式之装饰器模式
    学习设计模式之策略模式
    学习设计模式之简单工厂
    Ehcache3.x学习(二)分层的选项
    Ehcache3.x学习(一)入门
    java进行微信h5支付开发
  • 原文地址:https://www.cnblogs.com/juaner767/p/5524484.html
Copyright © 2020-2023  润新知