修饰参数的注解
(其中代码为控制器中的方法)
@RequestParam:把请求中指定名称的参数给控制器中的形参赋值(当请求参数与形参名称不一致时)
例:此时的JSP请求为:<a href="anno/testRequestParam?uname=哈哈">RequestParam</a>
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="uname") String username){
}
@RequestBody:用于获取POST请求体内容,直接使用获得key=value&key=value……结构的数据
public String testRequestParam(@RequestBody String body){}
@PathVariable:用于绑定URL中的路径变量
<a herf="/usepathVariable/100></a>
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integeer id){}
@RequestHeader:获取请求消息头,
例:Accept为消息头名称(键值对的键)
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header){}
@CookieValue:用于把指定的cookie名称的值传入控制器方法参数,
基本同@RequestHeader
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSION") String cookie){}
@ModelAttribute:修饰方法和参数
出现在方法上,当前方法在控制器方法执行之前先执行;出现在参数上,获取指定的参数给参数赋值
应用场景:当表单提交的数据不是完整的实体类数据时(属性值不全),保证没有提交的字段(类属性)使用数据库对象原来的数据
<%--缺少用户日期属性--%>
<form action="anno/testModelAttribute" method="post">
用户姓名:<input type="text" name="uname" /><br/>
用户年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>
使用:
1)当注解用于修饰方法时,该方法先执行,若该方法有返回值,返回值(user对象)会传递给接下来运行的控制器方法(处理请求的方法),经过先运行方法的预处理,数据被补全,之后表单传递的参数对对象中的属性其进行部分覆盖。
/**
* 该方法会先执行
*/
@ModelAttribute
public User showUser(String uname){
System.out.println("showUser执行了...");
// 通过用户查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
return user;
}
@RequestMapping(value="/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("testModelAttribute执行了...");
System.out.println(user);
return "success";
}
2)若@ModelAttribute注解的方法没有返回值,则将user对象放入map<String,User>里面,之后用@ModelAttribute修饰请求处理方法的参数取出对象,然后表单数据对其进行覆盖。
@ModelAttribute
public void showUser(String uname, Map<String,User> map){
System.out.println("showUser执行了...");
// 通过用户查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
//将user对象放入map中
map.put("abc",user);
}
@RequestMapping(value="/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){//从map中取出对象
System.out.println("testModelAttribute执行了...");
System.out.println(user);
return "success";
@SessionAttributes:修饰类,将数据存于session域,用于多次执行控制器方法间的参数共享
方法通过model接口将数据存入request域中,之后类注解又将数据存入session域(会话域高于请求域)
@SessionAttributes(value={"msg"}) // 把msg=美美存入到session域对中
public class AnnoController {
@RequestMapping(value="/testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("testSessionAttributes...");
// 底层会存储到request域对象中
model.addAttribute("msg","美美");//键值对
return "success";
}
}