• 问题场景  

  最近在维护公司旧的系统(用的struts1框架)的时候,在日期处理的时候,我将日期设定为Date类型,结果报以下错误:

 javax.servlet.ServletException: BeanUtils.populate
at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
at org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.ist.common.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:366)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:837)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1287)
at java.lang.Thread.run(Thread.java:662)

  后来查询资料明白了原来是类型转换错误,由于Struts默认是不支持自动将网页POST的数据自动转化成 Date型数据,所以,很多程序员就直接在ActionForm当中直接使用String,然后在Action当中再进行字符串跟日期数据的处理。但是这样感觉又不太好,数据库类型为Date类型,而在form中确实用String。

  • 解决办法

  同样在struts中的form中如果有int,float,double,Integer,Float,Double等基本类型,是不会报这样的错误的。网页POST过来的所有数据都是String类型,但是Struts内部有一个类型转换器,能够自动地将String类型转换成为int,float,double,Integer,Float,Double等类型。那继承Struts内部有这些转换器,那我们是否可以对其进行扩展?答案是可以的,Struts的Converter框架很好地支持了这一点。

  日期类型转换器如下:

 /**

* 日期转换对象,使用该转换器,在BaseForm当中做一下注册,系统自动地帮助字符的日期表示转换为java.util.Date对象.
* @author zizz.
* Create Time:2006-9-11 19:11:47.
*/
publicclass DateConverter implements Converter{
    /**
     * 日期格式化对象.
     */
    privatestatic SimpleDateFormat df=new SimpleDateFormat();
    
    /**
     * 模式集合.
     */
    privatestatic Set<String> patterns =new HashSet<String>();
    //注册一下日期的转换格式
    static{
        DateConverter.patterns.add("yyyy-MM-dd");
        DateConverter.patterns.add("yyyy-MM-dd HH:mm");
        DateConverter.patterns.add("yyyy-MM-dd HH:mm:ss");
        DateConverter.patterns.add("yyyy/MM/dd HH:mm:ss");
    }
    
    /**
     * 日期转换器.
     * @param type Class
     * @param value Object
     * return Date Object.
     */
    public Object convert(Class type,Object value){
        if(value== null){
            return null;
        }elseif(value instanceof String){
            Object dateObj = null;
            Iterator it = patterns.iterator();
            while(it.hasNext()){
                try{
                    String pattern =(String)it.next();
                    df.applyPattern(pattern);
                    dateObj = df.parse((String)value);
                    break;
                }catch(ParseException ex){
                    //do iterator continue
                }
            }
            return dateObj;
        }else{
            return null;
        }
    }
}

  自定义的日期转换工作必须先做注册才能使用,注册我们可以将其放在ActionForm当中。使用以下代码进行注册:

ConvertUtils.register(new DateConverter(), Date.class);

  

最新文章

  1. js字符串方法
  2. LinkedBlockingQueue的put,add跟offer的区别
  3. CodeForces Round 193 Div2
  4. F面经:painting house
  5. ylb:创建数据库、表,对表的增查改删语句
  6. [小工具] Command-line CPU Killer(附源码及下载链接)
  7. 单点登录SSO原则的实现
  8. PostgreSQL AS不忽略大小写
  9. IO多路复用,同步,异步,阻塞和非阻塞 区别
  10. SharePoint代码建表(实战)
  11. 菜鸟学IT之python词云初体验
  12. [LeetCode] Ambiguous Coordinates 模糊的坐标
  13. linux 计划任务 访问某个URL
  14. 如何在自定义Filter中优雅的实现静态资源放行
  15. Linux的wget命令详解【转载】
  16. SPOJ 687 REPEATS - Repeats
  17. 九、持久层框架(MyBatis)
  18. ubuntu 14.04 server(amd64) 安装ros indigo
  19. python基础学习1-类相关内置函数
  20. iOS-WKWebView使用

热门文章

  1. 使用selenium实现右键另存为保存文件
  2. 51nod-1661 1661 黑板上的游戏(组合游戏)
  3. HDU 3584 Cube --三维树状数组
  4. 什么是Activity
  5. JMeter中返回Json数据的处理方法
  6. QTP基础学习(一)安装目录介绍
  7. java11-1 最常见的类 String类
  8. windows phone 8.0 app 移植到windows10 app 页面类
  9. Wireshark命令行工具tshark
  10. C语言 动态库简单开发