springMvc接收客户端参数的方式

285 阅读2分钟

学习参考 :

正文

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属性去接收客户端的参数