——注:基于spring-framework-5.2.6.RELEASE
1. RequestMapping注解
1.1 源码
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Mappingpublic @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)@Documentedpublic @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)@Documentedpublic @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)@Documentedpublic @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)@Documentedpublic @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)@Documentedpublic @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)@Documentedpublic @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@Documentedpublic @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>