——注:基于spring-framework-5.2.6.RELEASE
1. RequestMapping注解
1.1 源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
1.2 作用
用于建立请求 URL 和处理请求方法之间的对应关系。
1.3 出现位置
位置 |
具体描述 |
举例 |
类上 |
请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。 |
/account |
方法上 |
请求 URL 的第二级访问目录 |
/add /delete |
1.4 相关属性
属性名称 |
属性描述 |
举例 |
value |
用于指定请求的 URL。它和 path 属性的作用是一样的。(当只有一个属性时,可以省略value=) |
@RequestMapping(value = “/add”) |
path |
用于指定请求的 URL。它和 value属性的作用是一样的。(当只有一个属性时,可以省略path=) |
@RequestMapping(path = “/add”) |
method |
用于指定请求的方式
|
@RequestMapping(path = “/add”, method = RequestMethod.GET) |
params |
用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和 配置的一模一样。 |
@RequestMapping(value=”/removeAccount”,params= {“accountName”,”money>100”}) |
headers |
用于指定限制请求消息头的条件 |
|
consumes |
未知 |
|
produces |
未知 |
1.5 案例展示
package com.tipsyspirit.controller;
import com.tipsyspirit.vo.Account;
import com.tipsyspirit.vo.UserProV1;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 请求参数的绑定
*/
@Controller
@RequestMapping("/params")
public class ParamController {
/**
* 测试是否创建成功controller
* @return
*/
@RequestMapping("/testParamController")
public String testParamController(){
System.out.println("测试是否创建成功...");
return "success";
}
/**
* 测试接收前端数据----简单初级版单参数
* @param username
* @return
*/
@RequestMapping("/testParamSimpleSingleParam")
public String testParamSimpleSingleParam(String username){
System.out.println("测试接收前端数据--初级版单参数...");
System.out.println("名字:"+username);
return "success";
}
/**
* 测试接收前端数据----简单初级版多参数
* @param username
* @return
*/
@RequestMapping("/testParamSimpleMultiParam")
public String testParamSimpleMultiParam(String username, String password){
System.out.println("测试接收前端数据--初级版多参数...");
System.out.println("名字:"+username);
System.out.println("密码:"+password);
return "success";
}
/**
* 测试接收前端数据----简单中级版----使用javabean
* @param username
* @return
*/
@RequestMapping("/testParamSimpleJavaBeanParam")
public String testParamSimpleJavaBeanParam(Account account){
System.out.println("测试接收前端数据----简单中级版----使用javabean...");
System.out.println("名字:"+account.getUsername());
System.out.println("密码:"+account.getPassword());
System.out.println("金钱:"+account.getMoney());
System.out.println(account.toString());
return "success";
}
}
2. RequestParam注解
2.1 源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
2.2 作用
把请求中指定名称的参数给控制器中的形参赋值。
2.3 出现位置
位置 |
具体描述 |
举例 |
方法上的参数列表上 |
参数列表上的每个参数,用于指定对参数的约束 |
@RequestParam(“name”)String username |
2.4 相关属性
属性名称 |
属性描述 |
举例 |
value |
请求参数中的名称 |
@RequestParam(“name”)String username |
required |
请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错 |
@RequestParam(value=”age”,required=false)Integer age |
2.5 案例展示
// jsp代码 ----------执行成功
<h2>测试RequestParam</h2>
<form action="/anno/testRequestParam" method="post">
<label>姓名:</label>
<input type="text" name="name"/><br>
<label>年龄:</label>
<input type="text" name="age"/><br>
<input type="submit" value="提交"/>
</form>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试RequestParam 注解的用法
* @param name
* @param age
* @return
*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(value = "name", required = true) String name,
@RequestParam(value = "age", required = false) Integer age){
System.out.println("executing...........");
System.out.println("name: "+ name);
System.out.println("age: "+ (age>0?age:""));
return "success";
}
}
2.6 失败案例(前端)
// jsp代码 ----------执行失败
// 原因:参数不匹配,后台的@RequestParam指定的名称是name,而前端传过去的参数是ename
<h2>测试RequestParam</h2>
<form action="/anno/testRequestParam" method="post">
<label>姓名:</label>
<input type="text" name="ename"/><br>
<label>年龄:</label>
<input type="text" name="age"/><br>
<input type="submit" value="提交"/>
</form>
3. RequestBody注解
3.1 源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
boolean required() default true;
}
3.2 作用
用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。
get 请求方式不适用。
针对的是post, put, delete等操作
主要是用于json数据的处理。
3.3 出现位置
位置 |
具体描述 |
举例 |
方法上的参数列表上 |
参数列表上的每个参数,用于指定对参数的约束 |
@RequestBody String username |
3.4 相关属性
属性名称 |
属性描述 |
举例 |
required |
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。 |
@RequestBody(required=false) String body |
3.5 案例展示
// jsp代码 ----------执行成功
<h2>测试RequestBody--post---单参数</h2>
<form action="/anno/testRequestBodySingleParam" method="post">
<label>姓名:</label>
<input type="text" name="ename"/><br>
<input type="submit" value="提交"/>
</form>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试RequestBody 注解的用法------单个参数
* @param name
* @return
*/
@RequestMapping("/testRequestBodySingleParam")
public String testRequestBody(@RequestBody String ename){
System.out.println("executing............");
System.out.println("name: "+ ename);
// 注意此时的中文数据将会出现乱码, 主要原因没有采用 application/json的方式请求
// 后续会进行处理, 因为目前主要使用的就是json格式进行数据传输
// 而不是 application/x-www-form-urlencoded;charset=UTF-8
return "success";
}
}
4. PathVariable注解
4.1 源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
}
4.2 作用
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
4.3 出现位置
位置 |
具体描述 |
举例 |
方法上的参数列表上 |
参数列表上的每个参数,用于参数是否可以占位 |
@PathVariable(“id”) Integer id |
4.4 相关属性
属性名称 |
属性描述 |
举例 |
value |
用于指定 url 中占位符名称,同name |
@PathVariable(“id”) Integer id |
name |
用于指定 url 中占位符名称,同value |
@PathVariable(“id”) Integer id |
required |
是否必须提供占位符。 |
@PathVariable(value=”age”,required=false)Integer age |
4.5 案例展示
// jsp代码 ----------执行成功
<h2>测试PathVariable 注解的用法</h2>
<a href="/anno/testPathVariable/123">测试PathVariable</a>
<hr>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试PathVariable 注解的用法
* @param id
* @return
*/
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") String id){
System.out.println("id: "+id);
return "success";
}
}
4.6 案例展示(多参数)
// jsp代码 ----------执行成功
<h2>测试PathVariable 注解的用法---多参数</h2>
<a href="/anno/testPathVariableMulti/123-zqw">测试PathVariable</a>
<hr>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试PathVariable 注解的用法----多参数
* @param id
* @param name
* @return
*/
@RequestMapping("/testPathVariableMulti/{id}-{name}")
public String testPathVariableMulti(@PathVariable("id") String id, @PathVariable(value = "name", required = false) String name){
System.out.println("executing............");
System.out.println("id: "+id);
System.out.println("name: "+name);
return "success";
}
}
5. RequestHeader注解
5.1 源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
5.2 作用
用于获取请求消息头。(注: 在实际开发中一般不怎么用)
5.3 出现位置
位置 |
具体描述 |
举例 |
方法上的参数列表上 |
参数列表上的每个参数,用于参数是否需要消息头信息 |
@RequestHeader(value=”Accept-Language”)String requestHeader |
5.4 相关属性
属性名称 |
属性描述 |
举例 |
value |
提供消息头名称,同name |
@RequestHeader(value=”Accept-Language”)String requestHeader |
name |
提供消息头名称,同value |
@RequestHeader(name=”Accept-Language”)String requestHeader |
required |
是否必须有此消息头 |
@RequestHeader(value=”Accept-Language”, required=false)String requestHeader |
5.5 案例展示
// jsp代码 ----------执行成功
<h2>测试RequestHeader 注解的用法</h2>
<a href="/anno/testRequestHeader">测试RequestHeader</a>
<hr>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试RequestHeader 注解的用法
* @param header
* @return
*/
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept-Language",
required = false) String header){
System.out.println("executing............");
System.out.println("header: "+header);
return "success";
}
}
6. CookieValue注解
6.1 源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
6.2 作用
用于把指定 cookie 名称的值传入控制器方法参数。(注: 在实际开发中一般不怎么用)
6.3 出现位置
位置 |
具体描述 |
举例 |
方法上的参数列表上 |
参数列表上的每个参数,用于参数是否需要cookie信息 |
@CookieValue(value=”JSESSIONID”) String cookieValue |
6.4 相关属性
属性名称 |
属性描述 |
举例 |
value |
指定 cookie 的名称,同name |
@CookieValue(value=”JSESSIONID”) String cookieValue |
name |
指定 cookie 的名称,同value |
@CookieValue(value=”JSESSIONID”) String cookieValue |
required |
是否必须有此 cookie |
@CookieValue(value=”JSESSIONID”,required=false) String cookieValue |
6.5 案例展示
// jsp代码 ----------执行成功
<h2>测试CookieValue 注解的用法</h2>
<a href="/anno/testCookieValue">测试CookieValue</a>
<hr>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试CookieValue 注解的用法
* @param cookieValue
* @return
*/
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID", required = false) String cookieValue){
System.out.println("executing............");
System.out.println("cookieValue: "+cookieValue);
return "success";
}
}
7. ModelAttribute注解
7.1 源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ModelAttribute {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean binding() default true;
}
7.2 作用
- 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
- 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
- 出现在参数上,获取指定的数据给参数赋值。
7.3 出现位置
| 位置 | 具体描述 | 举例 |
| :—-: | :—-: | :—-: |
| 方法的参数列表上 | 获取指定的数据给参数赋值。 | @ModelAttribute(value=”a”) User user |
| 方法上 | 表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。 | @ModelAttributepublic void showModel(User user){} |
7.4 相关属性
属性名称 |
属性描述 |
举例 |
value |
用于获取数据的 key,同name |
@ModelAttribute(value=”a”) User user |
name |
用于获取数据的 key,同value |
@ModelAttribute(name=”a”) User user |
7.5 案例展示(修饰方法执行顺序—参数POJO)
// jsp代码 ----------执行成功
<h2>测试ModelAttribute 注解的用法</h2>
<form action="/anno/testModelAttribute" method="post">
<label>姓名:</label>
<input type="text" name="ename">
<br>
<label>年龄:</label>
<input type="text" name="age">
<br>
<input type="submit" value="提交">
</form>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试ModelAttribute 注解的用法
* @param cookieValue
* @return
*/
@RequestMapping("/testModelAttribute")
public String testModelAttributeForSequence(User user){
System.out.println("executing............");
System.out.println("cookieValue: ");
return "success";
}
/**
* 被ModelAttribute注解修饰的方法
* @param user
*/
@ModelAttribute
public void showModel(User user){
System.out.println("执行了showModel方法----"+user.getEname());
}
}
总结: 被ModelAttribute注解修饰的方法肯定是优先于控制器中的其他方法执行的, 可以通过它实现部分初始化操作.
7.6 案例展示(修饰方法有返回值)
7.6.1 失败案例
// jsp代码 ----------执行不成功
<h2>测试ModelAttribute 注解的用法</h2>
<form action="/anno/testModelAttribute" method="post">
<label>姓名:</label>
<input type="text" name="ename">
<br>
<label>年龄:</label>
<input type="text" name="age">
<br>
<input type="submit" value="提交">
</form>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试ModelAttribute 注解的用法---有返回值
* @param user
* @return
*/
@RequestMapping("/testModelAttributeForReturn")
public String testModelAttributeForReturn(User user){
System.out.println("executing............");
System.out.println(user.toString());
return "success";
}
/**
* 被ModelAttribute注解修饰的方法2
* @param user
*/
@ModelAttribute
public User showModel3(User user){
System.out.println("执行了showModel2方法----"+user.getEname());
user.setEname(user.getEname()+"v2");
return user;
}
// 类似过滤器的作用,没有效果
}
7.6.2 成功案例
// jsp代码 ----------执行成功
<h2>测试ModelAttribute有返回值 注解的用法</h2>
<a href="/anno/testModelAttributeForReturn?username=zhangsan">测试CookieValue</a>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 测试ModelAttribute 注解的用法---有返回值
* @param user
* @return
*/
@RequestMapping("/testModelAttributeForReturn")
public String testModelAttributeForReturn(User user){
System.out.println("executing............");
System.out.println(user.toString());
return "success";
}
/**
* 被ModelAttribute注解修饰的方法2
* @param username
*/
@ModelAttribute
public User showModel2(String username){
User user1 = new User();
user1.setEname(username);
user1.setAge(18);
System.out.println("执行了showModel2方法----"+user1.getEname());
return user1;
}
}
总结:
被ModelAttribute注解修饰的方法如果有返回值时, 可以用作类似过滤器的角色;
如果传过去已经是一个与请求路径对应的方法参数类型不一样时, 通过传入某个字段,然后通过字段进行信息匹配(数据库查询的动态方式或者数据直接设置的静态方式),然后给请求路径对应的方法进行处理;
如果传过去已经是一个与请求路径对应的方法参数类型一样的, 被ModelAttribute注解修饰的方法的静态设置将没有效果
7.7 案例展示(修饰方法有返回值/修饰参数)
// jsp代码 ----------执行成功
<h2>测试ModelAttribute无返回值 注解的用法</h2>
<a href="/anno/testModelAttributeForNoReturn?username=lisi">测试ModelAttribute无返回值</a>
<hr>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 被ModelAttribute注解修饰的方法----无返回值
* @param username
*/
@ModelAttribute
public void showModel4(String username, Map<String, User> maps){
User user = new User();
user.setEname(username);
user.setAge(18);
maps.put("a", user);
}
/**
* 被ModelAttribute注解修饰的参数
* @param user
* @return
*/
@RequestMapping("testModelAttributeForNoReturn")
public String testModelAttributeForNoReturn(@ModelAttribute("a") User user){
System.out.println("执行testModelAttributeForNoReturn方法");
System.out.println(user.toString());
return "success";
}
}
8. SessionAttribute注解
8.1 源码
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SessionAttributes {
@AliasFor("names")
String[] value() default {};
@AliasFor("value")
String[] names() default {};
Class<?>[] types() default {};
}
8.2 作用
用于多次执行控制器方法间的参数共享。
8.3 出现位置
位置 |
具体描述 |
举例 |
类上 |
|
@RequestHeader(value=”Accept-Language”)String requestHeader |
8.4 相关属性
属性名称 |
属性描述 |
举例 |
value |
用于指定存入的属性名称,同name |
@RequestHeader(value=”Accept-Language”)String requestHeader |
name |
提供消息头名称,同value |
@RequestHeader(name=”Accept-Language”)String requestHeader |
type |
用于指定存入的数据类型。 |
@RequestHeader(value=”Accept-Language”, required=false)String requestHeader |
8.5 案例展示
// jsp代码 ----------执行成功
<h2>测试SessionAttributes 注解的用法</h2>
<a href="/anno/setSessionData?key=username&value=zhangsan">测试SessionAttributes----设置</a>
<a href="/anno/getSessionData?key=username">测试SessionAttributes----获取</a>
<a href="/anno/clearSessionData">测试SessionAttributes----清空</a>
<hr>
@Controller
@RequestMapping("/anno")
public class AnnotationController {
/**
* 保存session内容
* @param model
* @param key
* @param value
* @return
*/
@RequestMapping("/setSessionData")
public String setSessionData(Model model, String key, String value){
model.addAttribute(key, value);
return "success";
}
/**
* 获取session内容
* @param map
* @param key
* @return
*/
@RequestMapping("/getSessionData")
public String getSessionData(ModelMap map, String key){
System.out.println("执行getSessionData方法");
String value = (String)map.getAttribute(key);
System.out.println(key+"对应的值:"+ value);
return "success";
}
/**
* 清空session内容
* @param sessionStatus
* @return
*/
@RequestMapping("/clearSessionData")
public String clearSessionData(SessionStatus sessionStatus){
System.out.println("执行clearSessionData方法");
sessionStatus.setComplete();
return "success";
}
}
// 成功后的页面跳转页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试</title>
</head>
<body>
<h1>哈哈哈哈哈,成功了</h1>
${username}
</body>
</html>