springMVC对时间和价格格式参数的兼容处理

       在 基于Spring MVC的Web开发过程当中,可以通过对象映射的方式来管理表单提交上来的数据,而不用去一个一个地从request中提取出来。另外,这一功能还支持基 本数据类型的映射。例如in、long、float等等。这样我们就能从传统单一的String类型中解脱出来。然而,应用是灵活的。我们对数据的需求是 千变万化的。有些时候我们需要对表单的数据进行兼容处理:

一、日期格式的兼容:

       中国的日期标注习惯采用yyyy-MM-dd格式,欧美习惯采用MM/dd/yyyy。虽然两种格式都是日期的标注方法,但是往往我们要想达到兼容的目的必须做繁琐的转换。

二、价格的兼容:

       价格无非就是一串数字,我们经常用的就是0.00这种表达形式,而对于金额较大的价格我们还习惯采用0,000.00这样带有逗号分隔的价格表述形式。

      在Spring MVC框架的使用中,需要在Controller中可以在初始化绑定的时候注册一个编辑器。当表单提交过来的数据映射到某一特定类型(甚至是特定参 数)时可以按照自定义的方法进行转换。(除二进制方式传输过来的数据以外,通常我们认为所有传过来的参数不论是什么内容,一律认为是字符串)

下面我虚构了一个需求:

我有一个表单,里面需要填写用户名、生日和积分。这分别代表了String类型、Date类型和Long类型。下面是表单内容:

  1. <form action=“getObj.do” method=“post”>
  2.     <table>
  3.         <tr>
  4.             <td>用户名:</td>
  5.             <td><input type=“text” name=“userName” value=“Name Test” /></td>
  6.             <td>*普通字符串</td>
  7.         </tr>
  8.         <tr>
  9.             <td>生日:</td>
  10.             <td><input type=“text” name=“birthday” value=“2013-3-7” /></td>
  11.             <td>*支持格式: yyyy-MM-dd 或 MM/dd/yyyy</td>
  12.         </tr>
  13.         <tr>
  14.             <td>积分:</td>
  15.             <td><input type=“text” name=“score” value=“1,000” /></td>
  16.             <td>*支持纯数字或带逗号分隔的数字</td>
  17.         </tr>
  18.         <tr>
  19.             <td colspan=“3”><input type=“submit” value=“提交” /></td>
  20.         </tr>
  21.     </table>
  22. </form>

这里根据表单,我们映射了如下的一个表单对象,这里对象的属性名称要和上面表单的字段name一致:

java">
[java]
  1. package blog.csdn.net.chaijunkun.formObjs;
  2. import java.util.Date;
  3. public class UserInfo {
  4.     private String userName;
  5.     private Date birthday;
  6.     private Long score;
  7.     //getters and setters…
  8. }

下面我们先实现一个日期兼容的编辑器:

[java]

java">
  1. package blog.csdn.net.chaijunkun.editors;
  2. import java.beans.PropertyEditorSupport;
  3. import java.text.ParseException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. public class MyDateEditor extends PropertyEditorSupport {
  7.     @Override
  8.     /**
  9.      * text是表单传入的数据内容
  10.      */
  11.     public void setAsText(String text){
  12.         Date value= null;
  13.         SimpleDateFormat sdf= new SimpleDateFormat();
  14.         sdf.applyPattern(“yyyy-MM-dd”);
  15.         try{
  16.             value= sdf.parse(text);
  17.         }catch(ParseException e1){
  18.             sdf.applyPattern(“MM/dd/yyyy”);
  19.             try {
  20.                 value= sdf.parse(text);
  21.             } catch (ParseException e2) {
  22.                 value= null;
  23.             }
  24.         }
  25.         //这一步将转换好的数据写入到对象映射的属性中
  26.         setValue(value);
  27.     }
  28. }
    java">
    然后我们再来写一个针对Long型的编辑器,可以支持带逗号分隔和不带逗号分隔的数值表达形式:
    [java]
    1. package blog.csdn.net.chaijunkun.editors;
    2. import org.springframework.beans.propertyeditors.CustomNumberEditor;
    3. public class MyLongEditor extends CustomNumberEditor  {
    4.     public MyLongEditor(){
    5.         super(Long.classtrue);
    6.     }
    7.     @Override
    8.     public void setAsText(String text){
    9.         if ((text== null) || text.trim().equals(“”)){
    10.             setValue(null);
    11.         }else{
    12.             Long value= null;
    13.             try{
    14.                 //按照标准的数字格式尝试转换
    15.                 value= Long.parseLong(text);
    16.             }catch(NumberFormatException e){
    17.                 //尝试去除逗号 然后再转换
    18.                 text= text.replace(“,”“”);
    19.                 value= Long.parseLong(text);
    20.             }
    21.             //转好之后将值返给被映射的属性
    22.             setValue(value);
    23.         }
    24.     }
    25. }
      java">
          好了,这两个编辑器写好了,如何让它们发挥作用呢?这需要在Controller内加一个数据转换时的绑定方法:建议将该处理封装到一个公共的controller中,以便其他模块的复用;其它controller只需extends  BaseController就可以!
      [java] BaseController
      1. @InitBinder
      2. public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder){
      3.     binder.registerCustomEditor(Date.classnew MyDateEditor());
      4.     binder.registerCustomEditor(Long.classnew MyLongEditor());
      5. }

       

       

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注