@RequestParam
处理请求参数与控制器处理方法形参不一致的问题。
下面的请求中,参数名为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值一定要和请求中参数名称一样。
@RequestBody
如果直接作用于函数上,将控制器处理请求方法返回值显示在网页上,默认是覆盖跳转到的网页内容。
@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
@PathVariable
@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等)来找到对应的请求处理。
@ModelAttribute
加上该注解的方法会在控制器处理请求方法前执行,可以利用该属性处理表单提交时一些不能输入的表单属性,比如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 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属性,再通过控制器。
@ModelAttributepublic 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进行封装
@ModelAttributepublic 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";}