`
jinnianshilongnian
  • 浏览: 21432108 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404633
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997324
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631174
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257473
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593044
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248922
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847149
Group-logo
跟我学Nginx+Lua开...
浏览量:697994
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780320
社区版块
存档分类
最新评论

SpringMVC内置的精准数据绑定2

 
阅读更多

之前写过一篇《扩展SpringMVC以支持更精准的数据绑定1》用于完成类似于struts2的数据绑定;有朋友可能觉得自己写个参数解析器扩展比较麻烦,在此再介绍下springmvc内置的支持。

 

代码片段如下: 

    //http://localhost:9080/es-web/binder/test1?user1.id=1&user2.id=2
    @RequestMapping("/test1")
    public String test1(@ModelAttribute("user1") User user1, @ModelAttribute("user2") User user2) {
        System.out.println(user1);
        System.out.println(user2);
        return "";
    }

    @InitBinder("user1")
    public void initBinder1(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("user1.");
    }

    @InitBinder("user2")
    public void initBinder2(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("user2.");
    }

此处使用@InitBinder() 中间的value,用于指定命令/表单属性或请求参数的名字,符合该名字的将使用此处的DataBinder,如我们的@ModelAttribute("user1") User user1 将使用@InitBinder("user1")指定的DataBinder绑定;如果不指定value值,那么所有的都将使用。

  

DataBinder.setFieldDefaultPrefix 意思是设置参数的前缀,如我们的是"user1.",此处不能少了"."

 

这种方式的缺点:

1、不支持Path variable的绑定,如/test1/{user1.id}这种情况的绑定;

2、不支持如集合/数组的绑定;

 

如果需要复杂的绑定可以直接使用《扩展SpringMVC以支持更精准的数据绑定1》介绍的方式。下载最新的可以参考:

FormModelMethodArgumentResolver.java

spring-config.xml

ParentController.java (绑定集合的例子)

 

另外可以通过DataBinder完成如下几件事情:

1、binder.setAllowedFields("id")  : 设置允许的字段,比如我只想设置id,那么可以调用这个方法,那么其他属性会忽略;

2、binder.setDisallowedFields("id") : 设置不允许的自动,比如我不想设置id,那么可以调用此方法,这个属性将不设置;

3、binder.setRequiredFields() : 表示哪些字段是必填的;

4、binder.setValidator() :设置自定义的验证器,如果如JSR-303不适合,可以使用这个。

5、binder.registerCustomEditor : 注册自定义的编辑器;可以参考《第四章 Controller接口控制器详解(6)——跟着开涛学SpringMVC 》

 

 

总体来说,如果进行简单的绑定,又不想引入@FormModel注解,那么使用这种方式是可以解决问题的。

 

在使用springmvc数据绑定时,还有一点需要注意(尤其如增删改 都使用同一个页面):

如果用的是原子类型,如int,但是界面上是:

<input type='text' name='id' value=''> 即值为空

那么会遇到如下异常:

Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'id'; nested exception is java.lang.NumberFormatException: For input string: ""] 

建议:

1、最简单的办法 把int 改成---> Integer 即可   即系统的模型中只使用保证类型,

2、如果是新增 到新增页面时  给status一个默认值,可以考虑给个默认值

3、使用if-else 屏蔽掉

 

其实这个springmvc可以改进下,如果是空,给个默认值,这样也行。不过这总起来说还是使用者的问题。

8
3
分享到:
评论
1 楼 xunux 2015-05-07  
好用,可以将没前缀和带前缀的绑定到一个model

相关推荐

Global site tag (gtag.js) - Google Analytics