天天看點

initBuilder注解接收多個對象

問題出現

今天就以前台表單送出兩個對象做執行個體。為了擴大影響,我讓這兩個對象的屬性相同。

public class User implements Serializable{  

String id;  

String name;  

//get..set....  

}  

public class Addr implements Serializable{  

String name;//set..get...  

前台JSP

<form action="/test/test" method="post">  

   <input type="text" name="user.id" value="huo_user_id">  

   <input type="text" name="user.name" value="huo_user_name">  

   <input type="text" name="addr.id" value="huo_addr_id">  

   <input type="text" name="addr.name" value="huo_addr_name">  

   <input type="submit" value="送出">  

</form>  

看到這種情況,很容易想到struts進行綁定非常友善,可是,誰讓我們要使用SpringMVC呢。。。這種情況springMVC直接進行入參,是不能接收到參數的。

問題思路

使用 @InitBinder 注解進行綁定參數。前台表單中name屬性仍然使用Object.Param形式傳入。(另一種解決思路:擴充spring的HandlerMethodArgumentResolver以支援自定義的資料綁定方式。)

@InitBinder("user")  

    public void initBinderUser(WebDataBinder binder) {  

        binder.setFieldDefaultPrefix("user.");  

    }  

此處使用@InitBinder() 中間的value,用于指定指令/表單屬性或請求參數的名字,符合該名字的将使用此處的DataBinder,如我們的@ModelAttribute("user1") User user1 将使用@InitBinder("user1")指定的DataBinder綁定;如果不指定value值,那麼所有的都将使用。

DataBinder.setFieldDefaultPrefix 意思是設定參數的字首,如我們的是"user1.",此處不能少了".",

這種方式的缺點:

1、不支援Path variable的綁定,如/test1/{user1.id}這種情況的綁定;

2、不支援如集合/數組的綁定;

問題解決

@Controller  

@RequestMapping("/test")  

public class TestController {  

// 綁定變量名字和屬性,參數封裝進類  

    @InitBinder("user")  

    // 綁定變量名字和屬性,參數封裝進類  

    @InitBinder("addr")  

    public void initBinderAddr(WebDataBinder binder) {  

        binder.setFieldDefaultPrefix("addr.");  

    @RequestMapping("/test")  

    @ResponseBody  

    public Map<String,Object> test(HttpServletRequest request,@ModelAttribute("user") User user,@ModelAttribute("addr") Addr addr){  

        Map<String,Object> map=new HashMap<String,Object>();  

        map.put("user", user);  

        map.put("addr", addr);  

        return map;  

就一個@InitBinder 就可以解決了。

另外可以通過DataBinder完成如下幾件事情:

1、binder.setAllowedFields("id")  : 設定允許的字段,比如我隻想設定id,那麼可以調用這個方法,那麼其他屬性會忽略;

2、binder.setDisallowedFields("id") : 設定不允許的自動,比如我不想設定id,那麼可以調用此方法,這個屬性将不設定;

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

4、binder.setValidator() :設定自定義的驗證器,如果如JSR-303不适合,可以使用這個。

完整執行個體

為了防止上面内容說的和寫的模糊看不懂,我還是把較完整的代碼貼出來吧,不過也是重複一遍。哈哈哈。

兩個對象

jsp

Controller

本文轉自 興趣e族 51CTO部落格,原文連結:http://blog.51cto.com/simplelife/1921443