处理请求参数与控制器处理方法形参不一致的问题。 下面的请求中,参数名为username
<a href="hello?username=mcs">请求<a>而处理函数中形参名为name
@RequestMapping("/hello") public String requestParamTest(String name) { System.out.println("username:" +name); return "hello"; }两个参数名称不一致,无法获取到请求中参数的值,使用@RequestParam来处理
@RequestMapping("/hello") public String requestParamTest(@RequestParam("username") String name) { System.out.println("username:" +name); return "hello"; }注意:指定的value值一定要和请求中参数名称一样。
如果直接作用于函数上,将控制器处理请求方法返回值显示在网页上,默认是覆盖跳转到的网页内容。
@ResponseBody @RequestMapping("/testRequestParam") public String requestParamTest(@RequestParam("username") String name) { System.out.println("username:" +name); return "hello"; }将返回值hello打印在网页上。
可以作用于参数上,获取请求中参数的请求体。
@ResponseBody @RequestMapping("/testRequestBody") public String requestParamTest(@RequestBody String body) { System.out.println("body:" +body); return "hello"; }请求
<a href="testRequestBody?username=123&password=123"></a>对bod形参加上@RequestBody注解后,body的内容就被赋值为请求中参数的请求体:username=123&password=123
@RequestMapping在处理请求时只能处理固定的请求,如果我们根据id获取数据,100个人要写100个控制器处理请求方法岂不是太麻烦了,使用@PathVariable可以实现REST风格的请求,它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。 例如:根据不同的id来处理不同的请求
@RequestMapping("/testPathVariable/{id}") public String PathVariableTest(@PathVariable("id") String id) { System.out.println("id:" + id); return "hello"; }请求
<a href="testPathVariable/1">PathVariable</a>在数据库根据id查询单的时候经常应用这种 另外,也可以请求路径相同,根据不同的请求方式(PUT、GET、POST等)来找到对应的请求处理。
加上该注解的方法会在控制器处理请求方法前执行,可以利用该属性处理表单提交时一些不能输入的表单属性,比如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。 第一种方法:没有返回值 请求
<form action="anno/testModelAttribute" method="post"> 年龄:<input type="text" name="uage"/><br/> 出生日期:<input type="text" name="date"/><br/> <input type="submit" value="提交"> </form>我们将表单中的年龄和出生日期封装成一个User类,该类还有一个不可修改属性叫做address,那么我们就可以使用该注解创建个执行前执行的方法,先处理address属性,再通过控制器。
@ModelAttribute public User ModelAttribute(String uage) { // 模拟数据库查询 System.out.println("先执行了"); User user = new User(); user.setUage(uage); Date date = new Date(); user.setDate(date); user.setAddress("宿州"); System.out.println("先执行:user:"+ user); return user; } @RequestMapping("/testModelAttribute") public String ModelAttributeTest(User user) { System.out.println("user:" + user); return "hello"; }注意:先执行的方法只能对没有复制的属性就行修改生效,其他属性一概不生效,如果表单中有该属性,就算不输入赋值,也不能对该属性进行修改。>
第二种方法: 利用Map集合对User进行封装
@ModelAttribute public void ModelAttribute(String uage, Map<String,User> map) { // 模拟数据库查询 System.out.println("先执行了"); User user = new User(); user.setUage(uage); Date date = new Date(); user.setDate(date); user.setAddress("宿州"); System.out.println("先执行:user:"+ user); map.put("change",user); }如果Map集合保存的键名和控制器形参不一样,需要使用@ModeAttribute进行绑定。
@RequestMapping("/testModelAttribute") public String ModelAttributeTest(@ModeAttribute("change") User user) { System.out.println("执行后user:" + user); return "hello"; }