【SSM】SpringMVC中的@RequestMapping注解(含源码解析)

推荐文献

一文掌握@RequestMapping注解

SpringMVC请求参数和路径变量

SpringMVC官方文档

路径匹配工具(AntPathMatcher vs PathPattern

Request Mapping

下面是官方解释

You can use the annotation to map requests to controllers methods. It has various attributes to match by URL, HTTP method, request parameters, headers, and media types. You can use it at the class level to express shared mappings or at the method level to narrow down to a specific endpoint mapping.@RequestMapping

意思就是说:可以通过该 @RequestMapping 注解去映射控制器(指MVC中的Controller端)中的相关方法。它内部有很多属性可以用来匹配 URL、HTTP 方法、请求参数、表头…。这个注解可以使用在类上,也可以使用在方法上。

注意:这个的Controller端是指一个普通Bean,用@Controller注解标注了,如果使用其他申明Bean 的方式(@Component,@Service,@Repository)的话,组件扫描不正确会出错的。

下面是 @RequestMapping 注解的源代码
看 @Target 元注解可以得出请求映射注解只能用在类和方法上。
看其相关属性也可以猜测上面的官方解释的合理性。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective(ControllerMappingReflectiveProcessor.class)
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 {};
}

针对特定的 HTTP 方法,@ReuqestMapping 有特定快捷式变体(子注解):

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

源码分析,探索这些子注解的作用

小编知道,SpringMVC 中的核心处理器为 DispatcherServlet ,而它的 UML 类图如下:

在这里插入图片描述

而通过小编一阵瞎找,发现 DispatcherServlet 的父类 FrameworkServlet 中重写了 HttpServlet 中重载的那个 service 方法。

在这里插入图片描述
不仅如此, FrameworkServlet 还重写了 HttpServlet 利用模板方法设计模式所构的方法,而且这些方法最终去向都是 processRequest 方法。而 processRequest 方法是 final 类型的,然后它内部又调了doService 方法,是抽象的,其实现该方法的类即是子类 DispatcherServlet实现的。

在这里插入图片描述

小编脑袋瓜子逐渐变的清晰,这些‘子注解’无非就是去映射到特定的HTTP方法上,无非就是去利用好 HttpServlet 中重载的那个 service 方法,多了个判断请求方式。而如果直接使用 @RequestMapping 注解的话,就没有这个请求方式的判断。

当然也可以通过设置 @RequestMapping 中的 method 属性去设置请求方式(下面可以看见其默认值是空的)。

在这里插入图片描述

而其他‘子注解’是对该 method 属性进行了设置的。比如下面的 @GetMapping 注解。

在这里插入图片描述

下面是简单的测试。

@Controller
public class DemoAction2 {
    @GetMapping("/demo")
    public String demo2(){
        System.out.println("SpringMVC 测试2....");
        return "xmq";
    }
}

在这里插入图片描述

@RequestMapping(value = "/demo3", method = RequestMethod.GET)
    public String demo3(){
        System.out.println("demo3 测试....");
        return "xmq";
    }

在这里插入图片描述

@RequestMapping注解的位置

1)此注解可加在方法上,是为此方法注册一个可以访问的名称(路径)。

2)此注解可以加在类上,相当于包名(虚拟路径),区分不同类中形同的action的名称。

测试一波:

@Controller
@RequestMapping("/xc")
public class DemoAction2 {
    @GetMapping("/demo")
    public String demo(){
        System.out.println("demo 测试....");
        return "xmq";
    }

    @GetMapping("/demo2")
    public String demo2(){
        System.out.println("demo2 测试....");
        return "xmq";
    }
}

在这里插入图片描述
点击课程2后看控制台输出:

在这里插入图片描述

Ant 风格的路径匹配

当我们使用 @RequestMapping 进行路径映射的时候,有时路径是不好确定的。SpringMVC支持ant风格的路径。映射时可以使用以下规则匹配的URL:

  • ? 匹配一个字符
  • *匹配零个或多个字符
  • **匹配路径中的零个或多个目录

注意:在Spring MVC 5.3之前,都是默认以 org.springframework.util.AntPathMatcher 进行模式匹配,而之后是以 org.springframework.web.util.pattern.PathPattern为默认的模式匹配。
其中后者仅用了web中,前者还可以用于非web的模式匹配,但后者匹配速度更快。还有就是后者用 ** 匹配时不能放在中间。

@RequestMapping("/a?a/test")

@RequestMapping("/a*a/test")

@RequestMapping("/**/test")

再详细一点的介绍可以看一篇:

Spring5的新宠

测试

@Controller
@RequestMapping("/t?")
public class DataSubmitAction {

    @GetMapping("/demo1")
    public String demo1(String name,int age){
        System.out.println("name = " + name + ", age = " + age);
        return "xmq";
    }

}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Spring MVC的@NotNull注解是用于验证请求参数或方法参数是否为null的注解。在使用@NotNull注解时,需要先引入相关的依赖。根据引用和引用所提供的信息,可以使用以下依赖解决这个问题: ```xml <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.7.Final</version> </dependency> ``` 在Spring MVC使用@NotNull注解时,需要在参数上添加该注解以进行验证。例如: ```java @RequestMapping("/example") public void exampleMethod(@NotNull String parameter) { // method implementation } ``` 这样,在请求参数"parameter"为null时,会抛出验证异常。通过使用@NotNull注解,可以有效地验证参数的有效性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringMVC @NotNull校验不生效](https://blog.csdn.net/YKRY35/article/details/100778402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Javaspringmvc@NotNull报错,校验不生效!](https://blog.csdn.net/Mrs_chens/article/details/102664415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于mysql+ssm+bootstrap的员工管理系统项目源码](https://download.csdn.net/download/qq_35831906/88227142)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假正经的小柴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值