問題出現
今天就以前台表單送出兩個對象做執行個體。為了擴大影響,我讓這兩個對象的屬性相同。
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