访问路径与方式
大约 3 分钟
设置访问路径
@RequestMapping注解的作用就是将请求的 URL 地址和处理请求的方式(handler方法)关联起来,建立映射关系;由 handlerMapping 管理。
- 访问路径是web容器内的路径,外部访问还需要加上web上下文。
- 只有被@RequestMapping标注的方法,才会被纳入handlerMapping 管理。
@RequestMapping 注解有如下用法:
精准路径匹配
@Controller public class UserController { /** * 精准设置访问地址 /user/login */ @RequestMapping(value = {"/user/login"}) @ResponseBody public String login(){ System.out.println("UserController.login"); return "login success!!"; } /** * 精准设置访问地址 /user/register */ @RequestMapping(value = {"/user/register"}) @ResponseBody public String register(){ System.out.println("UserController.register"); return "register success!!"; } }模糊路径匹配
/*为单层任意字符串,即所有的下级路径(即使下级路径为"",也得保留/符号)。/ /awsd匹配/*,""不匹配/*。/**为任意层任意字符串,即所有的下级路径和多级路径。/asdw/sdawsda/asdaw/...都匹配/**。*为任意子串;pathAAA pathdawdasd都匹配path*。- 当一个路径同时匹配
/*和/**时,优先/*。
@Controller public class PathController { @RequestMapping("path/*") @ResponseBody public String anySub(){ System.out.println("PathController.anySub"); return "path/*"; } @RequestMapping("path/**") @ResponseBody public String anySubSub(){ System.out.println("PathController.anySubSub"); return "path/**"; } @RequestMapping("path*") @ResponseBody public String any(){ System.out.println("PathController.any"); return "path*"; } }可以在Controller类上使用
@RequestMapping,提取公共的路径前缀。- 访问路径 = 类上@RequestMapping路径 + 方法上@RequestMapping路径
- 外部访问需要在前面加上web上下文路径,才能访问到web容器。
//1.标记到handler方法 @RequestMapping("/user/login") @RequestMapping("/user/register") @RequestMapping("/user/logout") @RequestMapping("/user") //2.优化标记类+handler方法 //类上 @RequestMapping("/user") //handler方法上 @RequestMapping("/login") @RequestMapping("/register") @RequestMapping("/logout") @RequestMapping("")
指定请求方式
SpringMVC提供了一个枚举类,给出了HTTP协议的八大请求方式:
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}默认情况下,@RequestMapping 注解允许全部的请求方式,可以指定请求方式:
// 指定单一的请求方式
@RequestMapping(value = {"/user/login"} , method = RequestMethod.POST)
// 指定多种请求方式
@RequestMapping(alue = {"/user/register"},method = {RequestMethod.POST,RequestMethod.GET})对于Controller类上的@RequestMapping同样适用,即作用于此类中的所有handler方法。
对于指定单一请求方式的情况,SpringMVC还提供了等价于**@RequestMapping+指定方法**的注解:
// 用法等同于 @RequestMapping
@GetMapping
@PostMapping
@PutMapping
...- 指定请求方式时,如果接收到请求方式不允许,则返回
405 Method Not Allowed给客户端。 - HandlerMapping在映射Handler时,是根据 路径+方法 来匹配handler的,故可以相同的路径针对不同的请求方式来区别业务逻辑。
访问静态资源
当DispatcherServlet 的 url-pattern 配置的是 / 时,所有的请求都会交给 DispatcherServlet,而 DispatcherServlet 又会分发给 HandlerMapping 查找对应的hander。对于访问静态资源而言,并没有对应的handler,故访问静态资源会报404.
要开启静态资源的访问,需要加入 default-servlet-handler,对于 handlerMapping 没有找到handler的请求,交给它来查找对应的静态资源,从而实现静态资源的访问。
@Configuration
@EnableWebMvc
@ComponentScan("com.guitar.mvc.controller")
public class SpringMvcConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); // 启用即可
}
}- 当DispatcherServlet 的 url-pattern 配置的是
*.action时,机制未知?。
