zoukankan      html  css  js  c++  java
  • strut2 自定义类型转换器

    描述:假设用户请求地址:http://xxx.action?date=2015-01-01.  假设action中已经存在了date属性,且类型为Date。当用户请求的参数格式为xxxx-xx-xx或者xxxx-x-x的时候,action可以正常的接收到日期类型,即string字符串可以自动转换为Date类型。但是当用户的请求为xxxxxxxx(20150101)的时候,action不能够转换为日期类型,且报错。这时候就需要自定义类型转换器来实现日期的转换。

    问题解决:自定义类型转换器

    1. 新建立一个类,DateTypeConverter.java,并继承系统类DefaultTypeConverter,重写convertValue(Map<String, Object> context, Object value, Class toType)方法。参数介绍,value表示客户端地址请求的值,toType表示需要转换的类型。该方法支持双向转换,即客户端请求----->action------>jsp页面回显值。该类的具体代码如下所示:
      package cn.itcast.type.converter;
      
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.Map;
      
      import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
      
      public class DateTypeConverter extends DefaultTypeConverter {
      
          @Override
          public Object convertValue(Map<String, Object> context, Object value, Class toType) {
              SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
              try { 
                  if(toType == Date.class){//当字符串向Date类型转换时
                      String[] params = (String[]) value;// request.getParameterValues() 值是一个数组,因为要考虑到复选框的情况
                      return dateFormat.parse(params[0]);
                  }else if(toType == String.class){//当Date转换成字符串时
                      Date date = (Date) value;
                      return dateFormat.format(date);
                  }
              } catch (ParseException e) {}
              return null;
          }
      }
    2. action中的代码如下:HelloWorldAction.java
      package cn.itcast.action;
      
      import java.util.Date;
      
      public class HelloWorldAction {//?birthday=2008-10-10
          private Date birthday;
          
          public Date getBirthday() {
              return birthday;
          }
      
          public void setBirthday(Date birthday) {
              System.out.println(birthday);
              this.birthday = birthday;
          }
      
          public String addUI(){
              return "success";
          }
      
          public String execute() throws Exception{
              return "success";
          }
      }
    3. 注册局部类型转换器,局部类型转换器只对某个action中的的属性起作用,因为不是全局转换器。规则:Action的简单类名-conversion.properties,这个文件要跟Action放在同一个包中。在该文件中,采用的事键值对的配置方式:属性名=自定义类型转换器的完整类名。具体配置如下:birthday=cn.itcast.type.converter.DateTypeConverter。cn.itcast.type.converter代表包名。
  • 相关阅读:
    C语言面向对象编程(五):单链表实现(转)
    pthread_barrier_init,pthread_barrier_wait简介(转)
    Linux信号(signal) 机制分析(转)
    Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)
    Linux 多线程环境下 进程线程终止函数小结(转)
    批量杀进程 ps awk grep
    C++中的INL(转)
    gdb调试多进程和多线程命令(转)
    转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
    转:全栈工程师的知识栈列表
  • 原文地址:https://www.cnblogs.com/kailing-con/p/4197301.html
Copyright © 2011-2022 走看看