SpringMVC 傳遞相同名稱的參數的最佳方法

SpringMVC 多個對象的相同字段參數傳遞解決方案,在SpringMVC中,有時須要傳遞多個對象(除了Model和web元素)java

衆所周知,在SpringMVC中不支持相似struts2的點語法傳參法則,所以多個對象同名參數傳遞勢必會形成必定的問題。web


  1. SpringMVC的參數傳遞很是智能,可自動裝配參數到對象spring

public class User{
 private String name;
 private String id;
 private String gender,
 private String age;
  //getter 和setter
}
----------------------------------
public class Food{
 private String name;
 private String id;
 private String price,
 private String date;
 //getter 和setter
}
-------
<form method='post' action='url'>
用戶名 <input type='text' name='name'>
用戶id <input type='text' name='id'>
食品名 <input type='text' name='name'>
食品id <input type='text' name='id'>
 <input type='text' name='gender'>
 <input type='text' name='age'>
 <input type='text' name='price'>
 <input type='text' name='date'>
</form>

--------
@requestMap(value={'/order/book'})
public string show(User u,Food f){}

在上述狀況下User 和food都不能獲得正確的name和id,或者說更本得不到,這要是struts2就方便多了,直接使用點語法 u.name,u.id,f.name,f.id....segmentfault


爲了解決上述問題,有2中方案:mvc


1.是創建一個DTO

優勢是能夠認爲的避免參數的傳遞,直接改dto的字段名 u_name,u_id,f_name,f_id,gender,age,date,price都要列出來,而後做以下操做post

而後修改表單字段和contollerui

<form method='post' action='url'>
用戶名 <input type='text' name='u_name'>
用戶id <input type='text' name='u_id'>
食品名 <input type='text' name='f_name'>
食品id <input type='text' name='f_id'>
 <input type='text' name='gender'>
 <input type='text' name='age'>
 <input type='text' name='price'>
 <input type='text' name='date'>
</form>

@requestMap(value={'/order/book'})
public string show(UserFoodDto dto){
//而後拆分,將字段
User u = new User();
Food f = new Food();

u.setName(dto.getUname());
f.setName(dto.getname());

u.setUid(dto.getUid());
f.setFid(dto.getFid());

u.setAge(dto.getAge);
f.setPrice(dto.getPrice);
.....
}

缺點是:若是數據量大,100百個字段,修改的地方天然越多,並且一個dto,拆分也很費力,所以不建議使用在數據量大的狀況下url


2.使用橋鏈接,將不一樣的部分專門封裝成一個對象推薦

優勢:減小了衝突,減小了工做量spa

缺點:衝突字段/總字段趨近於1時顯得不必(不過,這種狀況幾乎不多出現,除非是繼承關係,但繼承關係徹底可使用子類來傳值,因此這個問題你就當沒遇到過)code


表單以下

<form method='post' action='url'>
用戶名 <input type='text' name='u_name'>
用戶id <input type='text' name='u_id'>
食品名 <input type='text' name='f_name'>
食品id <input type='text' name='f_id'>
 <input type='text' name='gender'>
 <input type='text' name='age'>
 <input type='text' name='price'>
 <input type='text' name='date'>
</form>

-----將衝突的字段專門創建一個javaBean
public String UFBridge{
    
    private String uname;
    private String uid;
    private String fname;
    private String fid;
}
--------------------------
@requestMap(value={'/order/book'})
public string show(User u,Food f,UFBridge ufb){

   u.setName(ufb.getUname());
   f.setName(ufb.getUname());
   
   u.setId(ufb.getUid);
   f.setId(ufb.getFid);
}


3.使用相應的註解@InitBinder,能夠作出相似struts2的方案(不推薦,代碼量增長,靈活度不夠)

以下博文

SpringMVC同名參數綁定問題

springmvc註解形式的開發參數接收


try doing it

相關文章
相關標籤/搜索