struts中的请求数据自动封装
2016-05-24 18:49
351 查看
Struts 2框架会将表单的参数以同名的方式设置给对应Action的属性中。该工作主要是由Parameters拦截器做的。而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作。在struts中,默认使用拦截器
进行请求数据自动封装,它会JSP中提交的数据(基本数据类型、String、和日期)进行自动转换。
有时候, 需要将表单字段映射到多个对象的不同属性上,form 标签可以被映射到Action中一个属性的属性。Struts 2首先通过反射技术调用address的默认构造器创建address对象,然后再通过反射技术调用address中与请求参数同名的属性的setter方法来获取请求参数值。
如果Action中属性为对象类型,必须要给出get()和set()方法,表单的数据名为对象.属性的方式。
继承StrutsTypeConverter,重写Convert中的抽象方法;
通知struts使用该转换器;
如果作为局部类型转换器,在与需要转换的Action类目录中新建ActionClassName-conversion.properties文件,文件中写:需要转换的字段名=自定义转换器类的全限定名,例如:
如果作为全局类型转换器,需要在项目src目录下新建xwork-conversion.properties文件,在文件中写:
需要转换的类类型=转换器的全限定名,例如:
<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
相关文章推荐
- [Intellij] 编译报错 javacTask
- JAVA学习的困惑
- Java引用类型
- Java实现二分法查找
- javaBean介绍
- JDK环境变量配置
- 使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)--转载
- Ehcache 整合Spring 使用页面、对象缓存
- 【异常】Caused by: java.lang.ClassNotFoundException: org.springframework.dao.DataIntegrityViolationException
- java34java中的IO(三)
- MyEclipse 2014配置Maven
- java实现多线程断点续传,上传下载
- java动态编程-操作字节码
- 使用java传参调用exe并且获取程序进度和返回结果的一种方法
- Java学习-方法
- springMVC框架搭建
- Java byte数组转String字符集问题
- 基于Spring + Spring MVC + Mybatis + shiro 高性能web构建
- 学习笔记----快速排序的java实现及其改良
- springMVC (六) @responseBody