SpringMVC 传递相同名称的参数的最佳方法

jopen 8年前

SpringMVC 多个对象的相同字段参数传递解决方案,在SpringMVC中,有时需要传递多个对象(除了Model和web元素)

众所周知,在SpringMVC中不支持类似struts2的点语法传参法则,因此多个对象同名参数传递势必会造成一定的问题。


  1. SpringMVC的参数传递非常智能,可自动装配参数到对象

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....


为了解决上述问题,有2中方案:


1.是建立一个DTO

优点是可以认为的避免参数的传递,直接改dto的字段名 u_name,u_id,f_name,f_id,gender,age,date,price都要列出来,然后作如下操作

然后修改表单字段和contoller

<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,拆分也很费力,因此不建议使用在数据量大的情况下


2.使用桥连接,将不同的部分专门封装成一个对象推荐

优点:减少了冲突,减少了工作量

缺点:冲突字段/总字段趋近于1时显得没必要(不过,这种情况几乎很少出现,除非是继承关系,但继承关系完全可以使用子类来传值,所以这个问题你就当没遇到过)


表单如下

<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

来自: http://my.oschina.net/ososchina/blog/344174