1. 【不推荐】使用HttpServletRequest接收请求参数
可以在处理请求的方法的参数列表中添加HttpServletRequest类型的参数,然后,按照传统方式获取请求参数的值即可:
@RequestMapping("handle_reg.do")
public String handleReg(HttpServletRequest request) {
System.out.println("UserController.handleReg()");
String username = request.getParameter("username");
String password = request.getParameter("password");
String age = request.getParameter("age");
String phone = request.getParameter("phone");
String email = request.getParameter("email");
System.out.println("username=" + username);
System.out.println("password=" + password);
System.out.println("age=" + age);
System.out.println("phone=" + phone);
System.out.println("email=" + email);
return null;
}
这种做法是不推荐,主要原因在于:
- 使用非常繁琐;
- 如果期望的参数类型不是String,需要自行转换数据类型;
- 不便于执行单元测试。
2. 【推荐】将所需的请求参数添加在处理请求的方法的参数列表中
可以在处理请求的方法的参数列表中,将所需的参数一一列举出来,且不区分先后顺序,但是,必须与客户端提交的参数保持名称一致:
@RequestMapping("handle_reg.do")
public String handleReg(String username, String password,
Integer age, String phone, String email) {
System.out.println("UserController.handleReg()");
System.out.println("username=" + username);
System.out.println("password=" + password);
System.out.println("age=" + (age + 1));
System.out.println("phone=" + phone);
System.out.println("email=" + email);
return null;
}
使用这种做法时,可以将参数直接声明为所期望的类型。
如果定义的某个参数的名称是客户端没有提交的参数,则方法中的参数值将是null。
这种做法并不适用于请求参数的数量较多的应用场景!
3.【推荐】将所需的请求参数封装在自定义类型中并作为处理请求的方法的参数
可以将若干个请求参数进行封装,例如:
public class User {
private String username;
private String password;
private Integer age;
private String phone;
private String email;
// 添加匹配的SET/GET方法
}
然后,在处理请求的方法的参数列表中,添加以上自定义的数据类型的参数即可:
@RequestMapping("handle_reg.do")
public String handleReg(User user) {
System.out.println("UserController.handleReg()");
System.out.println(user);
return null;
}
4.小结
首先,第1种做法(使用HttpServletRequest)的做法是不推荐的,无论在任何应用场景中,在控制器(Controller)中接收请求参数时,都不使用这种做法!
第2种做法(将参数穷举)和第3种做法(将参数封装)各有优点,当请求参数的数量较少(通常不超过4个),且固定时,应该优先使用第2种做法,这样做会使得源代码非常直观,阅读时更加容易理解代码的意义,反之,当请求参数的数量较多时(通常超过6个),或请求参数的数量可能发生变化时(未来调整需求时,数量可能增加或减少,或改为需要其它的参数),应该优先使用第3种做法!
另外,以上第2种做法和第3种做法可以同时使用!