springMVC接收参数的几种形式
1.参数写在Controller的方法的形参中,适用于get, post方式提交,post方式的时候编码方式需设置为:x-www-form-urlencoded转换为键值对形式,参数名必须完全相同才能映射到, 为此,使用下面5中的方法,可以实现别名转换。
注意:以x-www-form-urlencoded格式的post请求 与 get请求的异同:
同: 都把参数编为键值对形式name=susq&pswd=1233
异: get的时候,这个键值对拼在url后面,post的时候单独保存
/**
* 1.直接把表单的参数写在Controller相应的方法的形参中
* @param username
* @param password
* @return
*/
@RequestMapping("/addUser1")
public String addUser1(String username,String password) {
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
2. 通过HttpServletRequest接收,post方式和get方式都可以, 但不能接收json, post方式的时候编码方式需设置为:x-www-form-urlencoded转换为键值对
/**
* 2、通过HttpServletRequest接收
* @param request
* @return
*/
@RequestMapping("/addUser2")
public String addUser2(HttpServletRequest request) {
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
如果username 或者 password 为空,不能直接拿来做参数,可能会抛空指针异常。
3.通过一个bean来接收,post方式和get方式都可以。参数?key1=val1&key2=val2的方式加在url后面即可。post方式不想让参数拼接在url后面的话,可以将参数放在body中,编码方式需设置为:x-www-form-urlencoded
@RequestMapping("/doLogin")
public User doLogin(User u) {
logger.info("name: " + u.getName());
logger.info("pswd: " + u.getPswd());
User user = new User();
user.setName(u.getName());
user.setPswd(u.getPswd());
return user;
}
4. 通过一个bean来接收json
@RequestMapping("/doLogin")
public @ResponseBody User doLogin(@RequestBody User u) {
logger.info("name: " + u.getName());
logger.info("pswd: " + u.getPswd());
User user = new User();
user.setName(request.getParameter("name"));
user.setPswd(request.getParameter("pswd"));
return user;
}
4.2使用Map接收json
@RequestMapping("/doLogin")
public @ResponseBody User doLogin(@RequestBody Map<String, String> u) {
logger.info("name: " + u.get("name"));
logger.info("pswd: " + u.get("pswd"));
User user = new User();
user.setName(u.get("name"));
user.setPswd(u.get("pswd"));
return user;
}
注意Controller上标注了@RestController,这样相当于Controller的所有方法都标注了@ResponseBody, 但是接收参数的@RequestBody还是需要手动协商
5.通过@PathVariable获取路径中的参数
/**
* @param username
* @param password
* @return
*/
@RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET)
public String addUser4(@PathVariable String username,@PathVariable String password) {
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
6.用注解@RequestParam绑定请求参数到方法入参, post方式的时候编码方式需设置为:x-www-form-urlencoded, 不能接受json
@RequestMapping("/doLogin")
public User doLogin(@RequestParam(value="name") String username, @RequestParam(value="pswd") String password) {
logger.info("name: " + username);
logger.info("psed: " + password);
User user = new User();
user.setPswd(password);
user.setName(username);
return user;
}
7. 接收复杂类型参数json转换
如果接收的json有嵌套,如下所示
{
"s": {"clas": "s1", "age": "11"},
"name" : "susq",
"pswd" : 1233
}
则可以定义相对应的实体类,来接收参数,spring回自动进行映射转换,很方便。
public class User {
Student s;
String name;
String pswd;
// getter setter
}
Student是另一单独的对象
public class Student {
String clas;
int age;
// getter setter
}
注意把每一层对应的字段要写一样,才能对应上。同样不只是接收参数,返回json的时候,也可以用。