学习参考 :
- 讲师:孙帅老师
- 课程:www.bilibili.com/video/BV1i5…
正文
springMVC中控制器方法接收客户端参数的几种方式
常用的在方法中获取请求参数的方式
public String param6(HttpServletRequest request) {
String name = request.getParameter("name");
String password = request.getParameter("password");
return "param1";
}
这种方式依赖于servlet的api,代码冗余,并且耦合性高,所以不推荐
第一种 接收简单变量
public String param6(String name, int age) {
System.out.println("name = " + name);
System.out.println("age = " + age);
return "param1";
}
第二种 接收实体类
public String param4(User user) {
System.out.println("user = " + user);
return "param1";
}
第三种 接收简单变量和实体类
public String param4(String name, User user) {
System.out.println("name = " + name);
System.out.println("user = " + user);
return "param1";
}
因为实体类中也有name属性,所以实体类中的name属性和 变量name 都会接收到值
第四种 接收一组简单变量
public String param5(int[] ids) {
for (int id : ids) {
System.out.println("id = " + id);
}
return "param1";
}
以上方式是没有问题的
试想 是不是可以用集合代替数组来接收客户端参数?
public String param6(List<Integer> ids) {
for (Integer id : ids) {
System.out.println("id = " + id);
}
return "param1";
}
代码运行会发现报错,因为在接收值的时候,首先要new一个list对象,调用构造方法,但是list是接口,没有构造方法,不能创建具体对象 然后赋值
如果改造成下面这样呢?
public String param6(ArrayList<Integer> ids) {
for (Integer id : ids) {
System.out.println("id = " + id);
}
return "param1";
}
这种方式,指定了具体的list接口实现类,可以调用构造方法创建对象,但是ids接收不到值
没有异常,但是接受不到数据:SpringMVC会按照POJO的匹配方式,进行成员变量查找。
如果接收参数是八大基本类型+String 的时候,springMvc会根据参数名字和前端传过来的属性的值自动对应
如果接收参数不是八大基本类型+String 的时候,比如POJO 或者当前的ArrayList 那么springMvc会找POJO或者
ArrayList类中有没有定义和前端传过来的属性名对应上的成员变量,如果有就赋值,没有就接收不到
显然ArrayList类中没有ids这个成员变量能够接收前端传过来的值
第五种 接收一组实体类的参数
<form method="post" action="${pageContext.request.contextPath}/param/param7">
UserName1<input type="text" name="users[0].name"/><br/>
UserPassword1<input type="text" name="users[0].password"/><br/>
UserAge1<input type="text" name="users[0].age"/><br/>
<hr/>
UserName2<input type="text" name="users[1].name"/><br/>
UserPassword2<input type="text" name="users[1].password"/><br/>
UserAge2<input type="text" name="users[1].age"/><br/>
<input type="submit" value="submit">
</form>
public class UsersDTO {
private List<User> users = new ArrayList<>();
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
public String param7(UsersDTO usersDTO) {
List<User> users = usersDTO.getUsers();
for (User user : users) {
System.out.println("user = " + user);
}
return "param1";
}
上面说到,不能直接用list接收参数,但是可以构造一个实体类UsersDTO,定义属性为List,属性名为users属性去接收客户端的参数