一、@RequestMapping
1、作用
用于建立请求URL和处理请求方法之间的对应关系。
2、位置
类上:请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
方法上:请求URL的第二级访问目录。
3、参数
(1)path:指定请求路径的url
(2)value:value属性和path属性是一样的
(3)mthod: 指定该方法的请求方式
(4)params:指定限制请求参数的条件
(5)headers 发送的请求中必须包含的请求头
4、主要代码示例
页面代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>requestmapping的使用</title>
</head>
<body>
<!-- 注意:第二种写法,不要在访问URL前面加 / ,否则无法找到资源。 -->
<!-- 第一种访问方式 -->
<a href="${pageContext.request.contextPath}/account/findAccount"> 查询账户 </a>
<br/>
<!-- 第二种访问方式 -->
<a href="account/findAccount">查询账户</a>
</body>
</html>
controller代码
@Controller("accountController")
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/findAccount")
public String findAccount() {
System.out.println("查询账户。。。。");
return "success";
}
}
二、@RequestParam
1、作用
把请求中指定名称的参数,给控制器中的形参赋值。
2、位置
方法中的参数前。
3、参数
(1)value:请求参数中的名称
(2)required:请求参数中是否必须提供此参数,默认值是true。表示必须提供,如果不提供将报错。
4、主要代码示例
<!-- 页面代码 -->
<a href="test/testRequestParam?name=test">RequestParam注解测试</a>
/**
* 如果test方法中第一个参数由username变为name,与请求URL中的参数名一致,则@RequestParam可以省略。
* 第二个参数age,注解中设置required=false,则URL中虽然没有这个参数,也不会报错。
*/
@Controller("testController")
@RequestMapping("/test")
public class testController {
@RequestMapping("/testRequestParam")
public String test(@RequestParam("name")String username, @RequestParam(value="age",required=false)Integer age) {
System.out.println(username+","+age);
return "success";
}
}
三、@RequestBody
1、作用
用于获取请求体内容,直接使用得到是key=value&key=value...结构的数据。get请求方式不适用。
2、位置
方法中的参数前。
3、参数
required:必须有请求体,默认值是true。当取值为true时,get请求方式会报错。如果取值为false,get请求得到是null。
4、主要代码示例
<!-- 表单,POST请求 -->
<form action="test/testRequestBody" method="post">
姓名:<input type="text" name="username" ><br/>
年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>
<!-- GET请求 -->
<a href="test/testRequestBody?body=test">requestBody注解get请求</a>
@Controller("testController")
@RequestMapping("/test")
public class testController {
@RequestMapping("/testRequestBody")
public String test(@RequestBody(required=false) String body) {
System.out.println(body);
return "success";
}
}
//POST请求输出为:username=Jack&age=18
//GET请求输出为:null
四、@PathVaribale
1、作用
用于绑定url中的占位符。例如:请求url中 /delete/{id},这个{id}就是url占位符。
url支持占位符是spring3.0之后加入的。是springmvc支持rest风格URL的一个重要标志。
2、位置
方法中的参数前。
3、参数
(1)value:用于指定url中占位符名称。
(2)required:是否必须提供占位符。
4、主要代码示例
<!-- 页面代码 -->
<a href="test/findById/10">根据ID查询数据</a>
@Controller("testController")
@RequestMapping("/test")
public class testController {
@RequestMapping("/findById/{id}")
public String test(@PathVariable("id") Integer id) {
System.out.println(id);
return "success";
}
}
//执行后控制台会打印:10
五、@RequestHeader
1、作用
用于获取请求消息头信息。
2、位置
方法中的参数前。
3、参数
(1)value:消息头名称。
(2)required:是否必须有此消息头。
4、主要代码示例
<!-- 页面 -->
<a href="test/testRequestHeader">获取请求消息头</a>
@Controller("testController")
@RequestMapping("/test")
public class testController {
@RequestMapping("/testRequestHeader")
public String test(@RequestHeader(value="Accept-Language", required=false)String requestHeader) {
System.out.println(requestHeader);
return "success";
}
}
//执行后控制台会打印:zh-CN,zh;q=0.9
六、@CookieValue
1、作用
用于把指定cookie名称的值,传入控制器方法参数。
2、位置
方法中的参数前。
3、参数
(1)value:指定cookie的名称。
(2)required:是否必须有此cookie。
4、主要代码示例
<!-- 页面 -->
<a href="test/testCookieValue">绑定cookie的值</a>
@Controller("testController")
@RequestMapping("/test")
public class testController {
@RequestMapping("/testCookieValue")
public String test(@CookieValue(value="JSESSIONID",required=false) String cookieValue) {
System.out.println(cookieValue);
return "success";
}
}
七、@ModelAttribute
1、作用
在方法上,表示当前方法会在控制器的方法执行之前,先执行。可以修饰没有返回值的方法,可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
2、位置
方法上,或方法中的参数前。
3、参数
(1)value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。
(2)required:是否必须有此cookie。
4、应用场景
当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。
5、主要代码示例
(1)ModelAttribute修饰方法带返回值
<form action="test/updateUser" method="post">
名称:<input type="text" name="username" ><br/>
年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>
@Controller("testController")
@RequestMapping("/test")
public class testController {
@ModelAttribute
public User showModel(String username) {
//模拟去数据库查询
User oldUser = findUserByName(username);
System.out.println("执行了showModel方法" + oldUser);
return oldUser;
}
@RequestMapping("/updateUser")
public String test(User user) {
System.out.println("修改用户:" + user);
return "success";
}
private User findUserByName(String username) {
...省略查询代码
return user;
}
}
(2)ModelAttribute修饰方法不带返回值,且@ModelAttribute用于参数
页面代码与上面相同,后台主要代码如下:
@Controller("testController")
@RequestMapping("/test")
public class testController {
@ModelAttribute
public void showModel(String username, Map<String,User> map) {
//模拟去数据库查询
User oldUser = findUserByName(username);
System.out.println("执行了showModel方法" + oldUser);
map.put("aaa",user);
}
@RequestMapping("/updateUser")
public String test(@ModelAttribute("aaa")User user) {
System.out.println("修改用户:" + user);
return "success";
}
private User findUserByName(String username) {
...省略查询代码
return user;
}
}
八、@SessionAttribute
1、作用
用于多次执行控制器方法间的参数共享。
2、位置
在类上标注。
3、参数
(1)value:用于指定存入的属性名称。
(2)type:用于指定存入的数据类型。
4、主要代码示例
<!-- 页面代码 -->
<a href="test/testAdd">存入SessionAttribute</a>
<hr/>
<a href="test/testGet">取出SessionAttribute</a>
<hr/>
<a href="test/testDelete">清除SessionAttribute</a>
@Controller("testController")
@RequestMapping("/test")
// 把数据存入到session域对象中
@SessionAttributes(value= {"username","password","age"},types= {String.class,Integer.class})
public class testController {
/**
* Model是spring提供的一个接口,该接口有一个实现类ExtendedModelMap,
* 该类继承了ModelMap,而ModelMap就是LinkedHashMap子类
*/
@RequestMapping("/testAdd")
public String testAdd(Model model){
//跳转之前将数据保存到username、password和age中,因为注解@SessionAttribute中有这几个参数
model.addAttribute("username", "泰斯特");
model.addAttribute("password","123456");
model.addAttribute("age", 31);
return "success";
}
@RequestMapping("/testGet")
public String testGet(ModelMap model){
System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("age"));
return "success";
}
@RequestMapping("/testDelete")
public String testDelete(SessionStatus sessionStatus){
sessionStatus.setComplete();
return "success";
}
}