在Struts开发中经常可以发现,用户提交的请求数据中,基本数据类型和java.sql.Date或java.sql.Time类型都能被封装到ActionForm类中,在页面可以直接取到用户输入的数值。唯有java.util.Date的数据不能封装,究其原因就是在提交请求时,RequestProcessor类在进行数据收集时没有将java.util.Date类型的数据进行转换。所以查看Struts源代码可以发现我们要做的就是简单的两件事
第一,如源代码中装换示例一样,自定义一个类实现org.apache.commons.beanutils.Converter接口
如:
/**
* 自定义的java.util.Date的类型转换器
* @author qiujy
*/
public class UtilDateConverter implements Converter {
public static final String DATE_PATTERN = "yyyy-MM-dd";
/* (non-Javadoc)
* @see org.apache.commons.beanutils.Converter#convert(java.lang.Class, java.lang.Object)
*/
@Override
public Object convert(Class arg0, Object arg1) {
Object obj = null;
if(java.util.Date.class == arg0){
if(arg1 != null && arg1 instanceof String){
DateFormat df = new SimpleDateFormat(DATE_PATTERN);
try {
obj = df.parse((String)arg1);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return obj;
}
}
第二,在web项目进行部署时应该像源代码在ActionServlet中一样做一下注册的工作
要实现注册那么必须写一个注册的Servlet类;
public class UtilDateConverterRegisterServlet extends HttpServlet {
public void init() throws ServletException {
ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
}
}
然后在web.xml配置中将注册的Servlet类设定为自动启动但级别要比ActionServlet低些
<servlet>
<servlet-name>UtilDateConverterRegisterServlet</servlet-name>
<servlet-class>com.qiujy.web.common.UtilDateConverterRegisterServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
这样,一个自定义的Struts转换器就做好了。