前面整理了Jsp中useBean中字符串和时间的转化操作,然后到Struts中试了一下,发现,Struts中转化时间用的不是java.beans.PropertyEditorManager,而是通过BeanUtil处理的,在网上找了一下,发现过程和前一篇中的差不多,只不过,继承的类不一样,注册的方法不一样了,下面看下处理的过程。
首先,创建DateConverter对象,使其继承org.apache.commons.beanutils.Converter接口,简单实现如下:
package com.zywang.util.extend; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.beanutils.Converter; /** * @author ZYWANG 2009-6-22 */ public class DateConverter implements Converter { private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); /* (non-Javadoc) * @see org.apache.commons.beanutils.Converter#convert(java.lang.Class, java.lang.Object) */ @Override public Date convert(Class arg0, Object arg1) { // TODO Auto-generated method stub if(arg1 instanceof String){ try { return format.parse((String)arg1); } catch (ParseException e) { e.printStackTrace(); return null; } } return null; } }
然后找个位置,比如上次我们在过滤器中init方法中注册的,这次也可以在过滤器的init方法中注册,注册代码如下:
package com.zywang.util.extend; import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.apache.commons.beanutils.ConvertUtils; /** * 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); //注册Struts的日期转化对象 ConvertUtils.register(new DateConverter(), Date.class); } }
使用这种方法就可以实现提交表单的数据的自动转化为日期类型了。
另外在网上看到另外一种实现方法,这个方法首先需要创建DateConvertPlugIn对象,使其实现org.apache.struts.action.PlugIn接口,然后在改对象的init方法中注册,最后再将该对象以插件的方式注册到Struts中
DateConvertPlugIn的示例代码如下:
/** * */ package com.zywang.util.extend; import java.util.Date; import javax.servlet.ServletException; import org.apache.commons.beanutils.ConvertUtils; import org.apache.struts.action.ActionServlet; import org.apache.struts.action.PlugIn; import org.apache.struts.config.ModuleConfig; /** * @author ZYWANG 2009-6-22 */ public class DateConvertPlugIn implements PlugIn { /* (non-Javadoc) * @see org.apache.struts.action.PlugIn#destroy() */ @Override public void destroy() { // TODO Auto-generated method stub ConvertUtils.deregister(Date.class); } /* (non-Javadoc) * @see org.apache.struts.action.PlugIn#init(org.apache.struts.action.ActionServlet, org.apache.struts.config.ModuleConfig) */ @Override public void init(ActionServlet arg0, ModuleConfig arg1) throws ServletException { // TODO Auto-generated method stub ConvertUtils.register(new DateConverter(), Date.class); } }
在Struts中注册的代码是:
<plug-in className="com.zywang.util.extend.DateConvertPlugIn"></plug-in>
这样也可以达到我们目的,但这两种做法哪个更好,在下就搞不明白了。
附件是我测试用的DEMO,实现了JavaBean中日期的转化和Struts的FormBean中日期的转化,及两种Struts下注册方法(插件方式、过滤器方式)。