2、SpringMVC常用注解
@RequestMapping
/**
* 控制器类
*/
@Controller
@RequestMapping("/user")//作用在类上:相当于一级访问目录
public class UserController {
/**
* value: 和path属性作用一样,指定通过什么样的请求才能方法该方法
* method: 方法的请求方式必须是get请求
* params: 指定访问该方法的请求必须携带username属性,属性值必须为xiaoming的参数才可访问
* headers:指定请求同必须为Accept的才可以访问
* @return
*/
//RequestMapping作用于方法上相当于二级访问目录
@RequestMapping(path={"/hello"}, method ={RequestMethod.GET}, params = {"username=xiaoming"}, headers = {"Accept"})
public String hello(){
return "success";
}
}
以下的请求符合映射条件
@Params并没有指定age参数是必须的,所以符合映射条件
<a href="user/hello?username=xiaoming&age=18">点击</a>
path和value的作用一样
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
method属性请求方式
public enum RequestMethod {
GET,
HEAD,
POST,
PUT,
PATCH,
DELETE,
OPTIONS,
TRACE;
private RequestMethod() {
}
}
@RequestParam
解决参数名不一致而导致不能封装问题
请求
<a href="user/requestParam?username=哈罗">提交</a>
Controller
@RequestMapping("/requestParam")
public String useRequestParam(@RequestParam("username")String name){
System.out.println(name);
return "success";
}
@RequestBody
用于获取请求体内容,get请求不适用
用于参数列表中的参数,form表单提交后,将所有携带的参数赋值给该参数,参数类型为String
form表单
<form action="user/requestBody" method="post">
姓名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
日期:<input type="text" name="birthday">
<input type="submit" value="提交">
</form>
Controller方法
@RequestMapping("/requestBody")
public String useRequestBody(@RequestBody String body){
System.out.println(body);
return "success";
}
@PathVariable
用于绑定url中的占位符{}, 如/delete/{id}
占位符和@PathVariable中的name属性值必须保持一致
请求
<a href="user/pathVariable/{'哈罗'}">提交</a>
方法
@RequestMapping("/pathVariable/{username}")
public String usePathVariable(@PathVariable("username") String name){
System.out.println(name);
return "success";
}
@RequestHeader
用于获取请求消息头
作用在controller方法的参数列表中的参数上
请求
<a href="user/requestHeader">提交</a>
方法
@RequestMapping("/requestHeader")
public String useRequestHeader(@RequestHeader("Accept") String header){
System.out.println(header);
return "success";
}
@CookieValue
获得cookie名称的值
请求
<a href="user/cookieValue">提交</a>
方法
@RequestMapping("/cookieValue")
public String useCookieValue(@CookieValue ("JSESSIONID") String cookie){
System.out.println(cookie);
return "success";
}
@ModelAttribute
标注于方法上,会在Controller的方法执行前执行
请求
<a href="user/selectUser">提交</a>
方法
@RequestMapping("/selectUser")
public String selectUser(){
System.out.println("查询方法执行");
return "success";
}
@ModelAttribute
public void useModelAttribute(){
System.out.println("ModelAttribute先执行。。。");
}
标注着@ModelAttribute的方法会优先执行,然后再执行请求的目标方法
标注@ModelAttribute的方法因为优先执行,可以在映射到请求方法之前进行一些预处理的操作
常用于update环境下,当被单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象那个原来的数据
第一种,有返回值的写法
请求
<form action="user/selectUser" method="post">
姓名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
方法
@RequestMapping("/selectUser")
public String selectUser(User user){
System.out.println(user);
return "success";
}
/**
* 传入一个name是模拟通过name值查询出该对象
* @param name
* @return
*/
@ModelAttribute
public User useModelAttribute(String name){
//这里创建user对象是模拟从数据库中查找出来的数据
User user = new User();
user.setUsername(name);
user.setAge(30);
user.setBirthday(new Date());
return user;
}
第二种,无返回值的写法
@ModelAttribute作用于参数时,代表从容器中获取对象
将查询到的对象存放于Map集合中,通过@ModelAttribute(key)获取存在Map中的对象
/**
* 通过@ModelAttribute获取存在Map中的数据
* @param name
* @return
*/
@RequestMapping("/selectUser")
public String selectUser(@ModelAttribute("user") User user){
System.out.println(user);
return "success";
}
/**
* 传入一个name是模拟通过name值查询出该对象
* @param name
* @return
*/
@ModelAttribute
public void useModelAttribute(String name, Map<String, User> userMap){
//这里创建user对象是模拟从数据库中查找出来的数据
User user = new User();
user.setUsername(name);
user.setAge(30);
user.setBirthday(new Date());
userMap.put("user", user);
}
@SessionAttribute注解
用于多次执行控制器方法间的参数共享
1、利用Model将对象存于request域
请求
<a href="user/request">提交</a>
方法
@RequestMapping("/request")
public String userRequest(Model model){
model.addAttribute("user", "小白");
return "success";
}
返回页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Success</title>
</head>
<body>
${user}
</body>
</html>
@SessionAttribute只能作用于类上
@Controller
@RequestMapping("/user")//作用在类上:相当于一级访问目录
@SessionAttributes(value = {"user"})//将user属性存放于session域中
public class UserController {
@RequestMapping("/request")
public String userRequest(Model model){
model.addAttribute("user", "小白");
return "success";
}
}
通过${sessionScope.user}
获取session域中的值
存入session域主要的作用是方法间可以共享数据
请求
<a href="user/request">提交</a>
<a href="user/session">提交</a>
<a href="user/removeSession">提交</a>
方法
/**
* 控制器类
*/
@Controller
@RequestMapping("/user")
@SessionAttributes(value = {"user"}) //将user属性的对象存放于session域中
public class UserController {
/**
* 将数据存放于request域
* @param model
* @return
*/
@RequestMapping("/request")
public String userRequest(Model model){
//model可以将该对象存放到request域中
model.addAttribute("user", "小白");
return "success";
}
//获取request域中的数据
@RequestMapping("/session")
public String userSession(ModelMap modelMap){
//可以通过Model获取session域中存放的对象
modelMap.getAttribute("user");
return "success";
}
/**
* 清除session域中的对象
* @param status
* @return
*/
@RequestMapping("/removeSession")
public String userRemoveSession(SessionStatus status){
status.setComplete();
return "success";
}
}