文档章节

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

素人派
 素人派
发布于 2016/12/31 20:45
字数 941
阅读 3
收藏 0
       在 基于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]
  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]
  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. }
    然后我们再来写一个针对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. }
          好了,这两个编辑器写好了,如何让它们发挥作用呢?这需要在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. }
         
       

本文转载自:http://surenpi.com/2015/01/30/springmvc%e5%af%b9%e6%97%b6%e9%97%b4%e5%92%8c%e4%bb%b7%e6%a0%bc%e6%...

上一篇: 批处理文件
素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问

暂无文章

typescript 接口 函数类型 可索引类型

函数类型 可索引类型 数字索引签名 字符串索引签名 数字索引签名返回值 必须是 字符串索引签名返回值的子集 只读索引签名

lilugirl
今天
3
0
Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
今天
2
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部