SpringMVC(2)
常用注解
一、@RequestMapping
-
作用:建立请求URL和处理方法之间的对应关系
-
可以作用在类/方法上
(1)作用在类上:一级访问目录
(2)作用在方法上:二级访问目录 -
属性:
(1)value/path
:指定请求的URL,当只有一个属性时,可以不写
(2)method
:指定方法的请求方式 get,post,put,。。。
使用方法:method = {RequestMethod.POST, ...}
在浏览器中点击超链接,是GET方法
(3)params
:限制请求参数的条件如:params = {"username"} 要求链接必须传 href="user/testRequestMapping?username=hehe" 如:params = {"username=haha"} 要求链接必须传 ?username=haha,而现在jsp里传的是 hehe,所以访问不到 可以自己将链接改成 user/testRequestMapping?username=haha
(4)
headers
:发送的请求中必须包含该请求头如:headers = {"Accept"}
二、@RequestParam
-
作用:将页面请求中指定名称的参数传递给后台控制器中的形参赋值
-
通常用于前后端变量名不同时,只需要使用这个注解,并加上前端变量名,就可以赋值给后端的变量
-
属性:
(1)value
:前端页面请求中参数的名称
(2)required
:前端页面请求中是否要提供此参数,默认是true,必须提供如果页面发送请求是anno/testRequestParam?uname=哈哈",只要不是value指定的名称,都不行
-
具体代码:
anno.jsp
页面:
<%-- @RequestParam --%>
<a href="anno/testRequestParam?name=哈哈">RequestParam</a>
AnnoController
类:
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* @RequestParam
*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name = "name") String username){
System.out.println("执行了...");
System.out.println(username);
return "success";
}
}
注意:
可以看到此时jsp页面配置的url中是name=哈哈
,而方法中形参是String username
,在参数绑定中,本来是要求形参名称必须和url中请求参数的名称相同的。
但是现在,可以使用@RequestParam(name = "name")
指定页面请求中的参数名,就可以将页面请求中指定名称的参数传递给后台控制器中的形参赋值
三、@RequestBody
- 作用:取请求体(页面表单)的内容
- 注意:GET方法(超链接)不可以使用,主要针对表单POST
- 具体代码:
anno.jsp
页面:
<%-- @RequestBody --%>
<form action="anno/testRequestBody" method="post">
用户姓名:<input type="text" name="username"/><br/>
用户年龄:<input type="text" name="age"/><br/>
<input type="submit" value="提交"/>
</form>
AnnoController
类:
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* @RequestBody
*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了...");
System.out.println(body);
return "success";
}
}
- 效果:在后台会打印表单中输入的数据
username=xxx&age=xx
四、@PathVariable
-
作用:获取请求中占位符的值
-
属性:
name
:必须和占位符中的名称一样 -
Restful风格:
将请求地址统一,根据请求的不同方式(GET,PUT,POST...)来调用不同的方法 如果有两个相同的地址和请求方式,可以请求后面添加 /{ },来传递带占位符的请求
-
具体代码:
anno.jsp
页面:
<%-- @PathVariable--%>
<a href="anno/testPathVariable/10">PathVariable</a>
AnnoController
类:
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* @PathVariable
*/
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name = "sid") String id){
System.out.println("执行了...");
System.out.println(id);
return "success";
}
}
- 要求:
@RequestMapping
中带上{sid}
占位符,要求@PathVariable(name = "sid")
中的name必须和占位符名称相同
五、@RequestHeader
- 作用:获取请求头的值
- 属性:
value
:请求头的名称 - 具体代码:
anno.jsp
页面:
<%-- @RequestHeader--%>
<a href="anno/testRequestHeader">RequestHeader</a>
AnnoController
类:
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* @RequestHeader
*/
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
System.out.println("执行了...");
System.out.println(header);
return "success";
}
}
六、@CookieValue
- 作用:获取指定cookie的名称的值
- 属性:
value
:cookie对的名称 - 具体代码:
anno.jsp
页面:
<%-- @CookieValue--%>
<a href="anno/testCookieValue">CookieValue</a>
AnnoController
类:
@Controller
@RequestMapping("/anno")
public class AnnoController {
/**
* @CookieValue
*/
@RequestMapping("/testRequestHeader")
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
System.out.println("执行了...");
System.out.println(cookieValue);
return "success";
}
}
七、@ModelAttribute
-
作用:
(1)作用在方法上:该方法会在控制器方法testModelAttribute之前先执行 方法带返回值
(2)作用在参数上(需要同时作用在方法上):
获取map中指定key的数据赋值给当前参数 方法不带返回值
-
应用:当提交表单数据不完整时,可以保证没有提交的字段仍然使用数据库原来的数据,而已提交的字段可以覆盖数据库原来的数据
-
具体代码:
anno.jsp
页面:
<%-- @ModelAttribute--%>
<form action="anno/testModelAttribute" method="post">
用户姓名:<input type="text" name="uname"/><br/>
用户年龄:<input type="text" name="age"/><br/>
<input type="submit" value="提交"/>
</form>
AnnoController
类:
(1)作用在方法上,方法带返回值:
@Controller
@RequestMapping("/anno")
public class AnnoController {
// 带返回值的方法
@ModelAttribute
public User showUser(String uname){
System.out.println("showUser执行了...");
// 通过用户名查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(0);
user.setDate(new Date());
return user;
}
/**
* @ModelAttribute
*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("testModelAttribute执行了...");
System.out.println(user);
return "success";
}
}
- 首先在数据库中根据传入的
uname
参数创建了一个User对象,并且设置了初始值age
和date
,当表单仅提交了uname
和age
时,新的age
会覆盖掉数据库中的初始值,而date
没有提交过,所以会使用数据库中的初始值。 showUser()
方法创建完User对象后返回该对象给控制器方法testModelAttribute(User user)
的形参User赋值。- 效果:页面输入
uname=呵呵,age=20
,后台打印User{uname='呵呵', age=20, date=Thu Jun 11 15:00:03 CST 2020}
。可以看到age
不是初始值0,且date使用了初始值
(2)作用在参数上,方法不带返回值
@Controller
@RequestMapping("/anno")
public class AnnoController {
// 不带返回值的方法
@ModelAttribute
public void showUser1(String uname, Map<String, User> map){
System.out.println("showUser执行了...");
// 通过用户名查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(0);
user.setDate(new Date());
map.put("abc", user);
}
/**
* @ModelAttribute
*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println("testModelAttribute执行了...");
System.out.println(user);
return "success";
}
}
- 首先,方法的形参加上map对象,
key:String,value:User
,用于存储User对象 - 其次,user对象查询完后,放到map中
- 那么,控制器方法可以在形参前加上
@ModelAttribute("key")
,括号内加上map中指定的key,可以将已经存储的user对象赋值给形参使用 - 效果:页面输入
uname=呵呵,age=20
,后台先打印showUser执行了...
,然后打印User{uname='呵呵', age=20, date=Thu Jun 11 15:00:03 CST 2020}
。可以看到age
不是初始值0,且date使用了初始值 - 强调:加上
@ModelAttribute
的方法会在控制器方法之前先执行
八、@SessionAttributes
-
作用:用于控制器方法之间的参数共享
-
步骤:
首先需要在方法参数定义Model对象,使用model.addAttribute()方法,将参数存到request域对象中 然后@SessionAttributes(value = {"msg"})作用在类上,会将 request域对象中的msg=妹妹 存入到Session域对象中 那么,其他方法可以从Session域对象中取出对应的值,也可以将Session域对象清除
-
具体代码:
anno.jsp
页面:
<%-- @SessionAttributes--%>
<a href="anno/testSessionAttributes">SessionAttributes</a>
<br/>
<a href="anno/getSessionAttributes">getSessionAttributes</a>
<br/>
<a href="anno/deleteSessionAttributes">deleteSessionAttributes</a>
<br/>
AnnoController
类:
@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {"msg"}) // 把msg=妹妹存入到Session域对象中
public class AnnoController {
/**
* @SessionAttributes
*/
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("SessionAttributes执行了...");
// 底层会存储到request域对象中
model.addAttribute("msg", "妹妹");
return "success";
}
// 从Session域对象中取值
@RequestMapping("/getSessionAttributes")
public String getSessionAttributes(ModelMap model){
System.out.println("getSessionAttributes执行了...");
String msg = (String) model.get("msg");
System.out.println(msg);
return "success";
}
// 清除Session域对象
@RequestMapping("/deleteSessionAttributes")
public String deleteSessionAttributes(SessionStatus status){
System.out.println("getSessionAttributes执行了...");
status.setComplete();
return "success";
}
}
success.jsp
页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门成功</h3>
${ requestScope.msg }
${sessionScope}
</body>
</html>
注意:
@SessionAttributes(value = {"msg"})
需要加在类上testSessionAttributes
方法中使用model.addAttribute("msg", "妹妹")
,底层会存储到request域对象
中@SessionAttributes
会把msg=妹妹
存入到Session域对象
中- 此时其他方法可以从
Session域对象
中取出对应的值,也可以将Session域对象
清除 - 可以在跳转成功
success.jsp
页面上,使用${ requestScope.msg }
或者${sessionScope}
获得msg内容。