JSP提交的数据全部都是String类型的。struts2也是通过request.getParameter(name)获取到String类型数据,并通过拦截器将String转换成各种常用的数据类型,如:Date、Time、Timestamp等,然后通过getter、setter方法设置到Action对应的属性上。
struts2默认的转换器并不总是满足要求。例如:输入时间,struts2只能转换形如12:00:00的格式,而输入12:00就会抛错,也有一些数据类型struts2转换不了。因此,需要自定义数据转换器。
数据类型转换器都需要实现ognl.TypeConvertor接口。一般的,直接继承DefaultTypeConvertor类,并实现
convertValue(Map context,Object value,Class toType)方法就可以了。(DefaultTypeConvertor是位于ognl包下的,是ognl开源标准中的一部分。从此可以看出struts2集成了许多其他的技术。)
convertValue(Map context,Object value,Class toType)方法有三个参数,参数value为待转换的数据,参数toType为要转成的类型。注意JSP提交数据时,参数value为request.getParameterValues(String name)返回的String[]类型对象,而不是String。
===========================================
下面自定义一个日期、时间转换器。该转换器能够转换各种常用的时间格式。convertValue()方法既能将Date转换成String,也能讲String转换成Date。
==========================================
工作原理:
用户在convert.jap页面中输入要转换的内容后将请求提交,请求被提交到FilterDispatcher过滤器,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy,ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,加载一系列的拦截器,找到需要调用的Action类和相应的转换器,由拦截器将HttpServletRequest参数解析出来,传入Action,然后由action调用转换器进行数据转换处理。
==========================================
实现如下:
DateTimeConvertor.java
package com.lmb.struts2.convertor;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import ognl.DefaultTypeConverter;
public class DateTimeConvertor extends DefaultTypeConverter {
//日期格式转化器
private DateFormat[] dateFormat={
new SimpleDateFormat("yyyy-MM-dd"),//格式如2008-08-08
new SimpleDateFormat("yyyy/MM/dd"),//格式如2008/08/08
new SimpleDateFormat("yy-MM-dd"),//格式如08-08-08
};
//时间格式转化器
private DateFormat[] timeFormat={
new SimpleDateFormat("HH:mm:ssss"),//格