后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节30(注解,Handler方法注解)

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方法设置根路径。它的属性如下:

  1. value:设置方法的url值。
  2. method:设置请求方法的类型,值为枚举类型,GET,POST等等,当使用简便方式时,可以忽略。
  3. consumes:设置请求的数据类型,当请求数据类型不符合时,映射失败。等价于在请求映射时添加数据类型的条件。
  4. produces: 设置响应的数据类型。它们都是枚举值,参考MediaType类型。或字符串的MIME类型
  5. 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中的通配符有以下三个

  1. ? 匹配单个字符
  2. * 匹配0或多个字符
  3. ** 匹配url路径的多个层次,例如test/**,会匹配test/a,test/a/b,test/a/b/c

1.6   url映射的规则

  1. 第一步,会根据方法的URL中变量(1),通配符(1),double通配符(2)的个数计算URL的count值,值越大,URL路径越不精确。方法的URL越精确,匹配优先级越高。
  2. 第二步,会根据方法的URL层次长度匹配,在count值相等的情况下,层次越长,方法的URL越精确,例如test/a/b/c比test/abcd要长。
  3. 第三步,根据方法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、响应

  与请求相比,响应的注解比较少。

  1. @ResponseBody:获取response对象的输出流,此时返回的任何值都是输入流中的内容。
  2. @JsonView:与@ResponseBody配合使用,将返回值转换为JSON字符串,写入到输入流中。JSON的API为Jackson。
原文地址:https://www.cnblogs.com/rain144576/p/12902946.html