在Jsp项目中,很多时候需要用到字符串到日期类型的转化,一般有两种方法处理:
1、在useBean的Model中的set方法的参数为字符串类型,在set方法中将字符串转化为日期类型,然后赋值给日期字段,不过这种方式限制的Model的使用场合,不利于重用。
2、通过java.beans.PropertyEditorManager的registerEditor方法,注册一个我们自定义的针对字符串转化为日期的类,这个类需要继承自PropertyEditorSupport类。这种方法处理过后,就可以实现字符串类型自动转化为日期型了,一定程度上增强了Bean的重用,不过也有它的确定,比如在整个项目中要设定统一的时间字符串格式,当然你也可以把字符串转化器做的强大一点,让它支持所有的日期格式,。
第一中方式实现较为方便,下面就针对第二种方式的实现做一下介绍,过程很简单:
首先,创建一个DatePropertyEditor类,使其继承自java.beans.PropertyEditorSupport类,然后重载它的getValue和setAsText方法,示例代码如下:
/** * */ package com.zywang.util; import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * JSP:userBean中字符串转化为时间类型 * @author ZYWANG 2009-6-20 */ public class DatePropertyEditor extends PropertyEditorSupport { private Date date = null; private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); /* * (non-Javadoc) * * @see java.beans.PropertyEditorSupport#getValue() */ @Override public Date getValue() { return date; } /* * (non-Javadoc) * * @see java.beans.PropertyEditorSupport#setAsText(java.lang.String) */ @Override public void setAsText(String text) throws IllegalArgumentException { try { date = dateFormat.parse(text); } catch (ParseException e) { date = null; } } }
然后,使用java.beans.PropertyEditorManager的registerEditor方法将其注册进来
java.beans.PropertyEditorManager.registerEditor(java.util.Date.class, DatePropertyEditor.class);
该方法的第一个参数为我们要被编辑类型的 Class 对象 ,第二个参数为 编辑器类的 Class 对象,大家可以通过查看JDK的文档查找相关的方法说明
另外再说一点,在实际项目中为了操作方便,建议在过滤器中注册这个编辑器类,如下程序过滤器实现了两个功能,一是统一了编码格式,二是注册了我们的时间转化的编辑器。示例代码如下:
package com.zywang.util; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * JSP页面乱码处理过滤器 * @author ZYWANG 2009-6-20 * Servlet Filter implementation class ChangeEncoding */ public class SetCharacterEncodingFilter implements Filter { /** * Default constructor. */ public SetCharacterEncodingFilter() { } /** * @see Filter#destroy() */ public void destroy() { } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // place your code here request.setCharacterEncoding("GB18030"); // pass the request along the filter chain chain.doFilter(request, response); } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { //注册JavaBean日期转化器 java.beans.PropertyEditorManager.registerEditor(java.util.Date.class, DatePropertyEditor.class); } }
附件为一个演示用的DEMO,欢迎大家指正!