在 基于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类型。下面是表单内容:
- <form action="getObj.do" method="post">
- <table>
- <tr>
- <td>用户名:</td>
- <td><input type="text" name="userName" value="Name Test" /></td>
- <td>*普通字符串</td>
- </tr>
- <tr>
- <td>生日:</td>
- <td><input type="text" name="birthday" value="2013-3-7" /></td>
- <td>*支持格式: yyyy-MM-dd 或 MM/dd/yyyy</td>
- </tr>
- <tr>
- <td>积分:</td>
- <td><input type="text" name="score" value="1,000" /></td>
- <td>*支持纯数字或带逗号分隔的数字</td>
- </tr>
- <tr>
- <td colspan="3"><input type="submit" value="提交" /></td>
- </tr>
- </table>
- </form>
这里根据表单,我们映射了如下的一个表单对象,这里对象的属性名称要和上面表单的字段name一致:
- package blog.csdn.net.chaijunkun.formObjs;
-
- import java.util.Date;
-
- public class UserInfo {
-
- private String userName;
-
- private Date birthday;
-
- private Long score;
-
- //getters and setters...
-
- }
下面我们先实现一个日期兼容的编辑器:
[java]
- package blog.csdn.net.chaijunkun.editors;
-
- import java.beans.PropertyEditorSupport;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
-
- public class MyDateEditor extends PropertyEditorSupport {
-
- @Override
- /**
- * text是表单传入的数据内容
- */
- public void setAsText(String text){
- Date value= null;
- SimpleDateFormat sdf= new SimpleDateFormat();
- sdf.applyPattern("yyyy-MM-dd");
- try{
- value= sdf.parse(text);
- }catch(ParseException e1){
- sdf.applyPattern("MM/dd/yyyy");
- try {
- value= sdf.parse(text);
- } catch (ParseException e2) {
- value= null;
- }
- }
- //这一步将转换好的数据写入到对象映射的属性中
- setValue(value);
- }
-
- }
然后我们再来写一个针对Long型的编辑器,可以支持带逗号分隔和不带逗号分隔的数值表达形式:
[java]
- package blog.csdn.net.chaijunkun.editors;
-
- import org.springframework.beans.propertyeditors.CustomNumberEditor;
-
- public class MyLongEditor extends CustomNumberEditor {
-
- public MyLongEditor(){
- super(Long.class, true);
- }
-
- @Override
- public void setAsText(String text){
- if ((text== null) || text.trim().equals("")){
- setValue(null);
- }else{
- Long value= null;
- try{
- //按照标准的数字格式尝试转换
- value= Long.parseLong(text);
- }catch(NumberFormatException e){
- //尝试去除逗号 然后再转换
- text= text.replace(",", "");
- value= Long.parseLong(text);
- }
- //转好之后将值返给被映射的属性
- setValue(value);
- }
- }
-
- }
好了,这两个编辑器写好了,如何让它们发挥作用呢?这需要在Controller内加一个数据转换时的绑定方法:建议将该处理封装到一个公共的controller中,以便其他模块的复用;其它controller只需extends
BaseController就可以!
[java] BaseController
- @InitBinder
- public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder){
- binder.registerCustomEditor(Date.class, new MyDateEditor());
- binder.registerCustomEditor(Long.class, new MyLongEditor());
- }