1、请求
1.1 url映射
建立客户端请求与方法的映射关系是根据客户端请求的url与方法的url。方法的url由@RequestMapping注解指定的。它有以下几种简便的方式。
当请求的类型为GET时,使用@GetMapping
当请求的类型为POST时,使用@PostMapping
当请求的类型为Put时,使用@PutMapping
当请求的类型为Delete时,使用@DeleteMapping
当请求的类型为Patch时,使用@PatchMapping
不建议使用@RequestMapping,@GetMapping,@PostMapping更方便,简洁。
1.2 @RequestMapping
在类上的@RequestMapping注解,会给所有handler方法设置根路径。它的属性如下:
- value:设置方法的url值。
- method:设置请求方法的类型,值为枚举类型,GET,POST等等,当使用简便方式时,可以忽略。
- consumes:设置请求的数据类型,当请求数据类型不符合时,映射失败。等价于在请求映射时添加数据类型的条件。
- produces: 设置响应的数据类型。它们都是枚举值,参考MediaType类型。或字符串的MIME类型
- params:在请求映射时添加请求参数的条件,有以下三种情形
-
- myParam:请求参数中存在myParam,不存在时,映射失败
- !myParam:请求参数中不存在myParam,存在时,映射失败
- myParam=myValue:请求参数中存在myParam,值必须为myValue,不符合时,映射失败。
6.headers:与params用法相同,区别在于params表示请求参数,headers表示请求头
1.3 自定义组合注解
@GetMapping,@PostMapping是@RequestMapping的组合注解,我们也可以自定义组合注解。
@PostMapping是@RequestMapping的method属性为POST,本示例将自定义注解@PostJsonMapping,基于@PostMapping的consumes,produces属性都是Application/json,utf-8
/** * * @File Name: PostJsonMapping.java * @Description: 自定义组合注解 * @version 1.0 * @since JDK 1.8 */ @Documented @Retention(RUNTIME) @Target(METHOD) @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public @interface PostJsonMapping { /** * Alias for {@link RequestMapping#name}. */ @AliasFor(annotation = RequestMapping.class) String name() default ""; /** * Alias for {@link RequestMapping#value}. */ @AliasFor(annotation = RequestMapping.class) String[] value() default {}; /** * Alias for {@link RequestMapping#path}. */ @AliasFor(annotation = RequestMapping.class) String[] path() default {}; /** * Alias for {@link RequestMapping#params}. */ @AliasFor(annotation = RequestMapping.class) String[] params() default {}; /** * Alias for {@link RequestMapping#headers}. */ @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; }
1.4 自定义映射实现
Spring mvc支持自定义请求URL到方法的映射逻辑实现。通过继承RequestMappingHandlerMapping,重写getCustomMethodCondition方法,它的返回值是RequestCondition类型。
1.5 url中的通配符
url中的通配符有以下三个
- ? 匹配单个字符
- * 匹配0或多个字符
- ** 匹配url路径的多个层次,例如test/**,会匹配test/a,test/a/b,test/a/b/c
1.6 url映射的规则
- 第一步,会根据方法的URL中变量(1),通配符(1),double通配符(2)的个数计算URL的count值,值越大,URL路径越不精确。方法的URL越精确,匹配优先级越高。
- 第二步,会根据方法的URL层次长度匹配,在count值相等的情况下,层次越长,方法的URL越精确,例如test/a/b/c比test/abcd要长。
- 第三步,根据方法URL上的后缀匹配,例如*.do。不建议这种方式,是因为spring mvc会根据请求的后缀判断请求内容的MIME类型。
1.7 代码方式配置url
在使用spring mvc时,通常是在Controller的方法上直接添加@RequestMapping或它的组合注解,通过设置注解的属性值配置URL。
另外一种不常用,只是为了学习了解一下,通过代码方式
@Configuration @ComponentScan(basePackages = "controller") public class ControllerConfig { @Autowired public void setHandlerMapping(RequestMappingHandlerMapping mapping, TestController controller) throws NoSuchMethodException { // 创建RequestMappingInfo对象 RequestMappingInfo info = RequestMappingInfo.paths("/test/exception").methods(RequestMethod.GET).build(); // 获取Method对象 Method method = TestController.class.getMethod("testViewResolver"); // 建立映射关系 mapping.registerMapping(info, controller, method); } }
可以看到本质是建立Method对象与RequestMappingInfo对象之间的关系。
2、响应
与请求相比,响应的注解比较少。
- @ResponseBody:获取response对象的输出流,此时返回的任何值都是输入流中的内容。
- @JsonView:与@ResponseBody配合使用,将返回值转换为JSON字符串,写入到输入流中。JSON的API为Jackson。