2.2 SpringMVC 对控制器的支持
2.2.1 SpringMVC 执行流程
2.2.2 处理器查找
SpringMVC中常见的三种映射策略
1.直接URL映射
通过向 Spring 注册 SimpleUrlHandlerMapping 类型的 Bean 实现, 可以为SimpleUrlHandlerMapping 传入Map类型的映射关系。Map的Key是URL,支持通配符,示例代码如下:
// 声明为 Spring的配置类
@ Configuration
public class HandlerMappingConfig {
// 声明为 Spring 的 Bean
@ Bean
public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
// 创建实例
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMappisg();
// 设置URL与 Handler的映射关系, 通过 SimpleUrlRequestHandler处理请求
mapping. setUrlMap( Collections. singletonMap("/simpleUrl", Handler));
return mapping;
}
}
2.BeanName与URL映射
该映射方式通过BeanName自动进行 URL 映射。如果 Bean的 Name声明以“/”开头,或者这个 Bean的别名以“/”开头, 则该 Bean会自动作为 Handler 进行映射, URL 为 Bean的 Name, Handler为该 Bean自身。这个自动注册的逻辑发生在 BeanNameUrlHandlerMapping中。示例代码如下:
@ Configuration
public class HandlerMappingTest {
// 为这个 Bean注册两个名字: /beanNameUrl和/aliasNameUrl, 访问这两个 URL时,会通过下面声明的 Handler 处理该请求
@ Bean( name = {"/beanNameUrl", "/aliasNameUrl"})
public HttpRequestHandler beanNameUrlHandler() {
// 这是一个HttpRequestHandler类型的 Handler
return new BeanNameUrlHttpRequestHandler();
}
}
当然声明BeanName 不止这一种方式, 也可以按照下面这种方式声明。
@ Component("/beanNameUrl")
public class BeanNameUrlHttpRequestHandler {
//...省略代码
)
3.@RequestMapping映射
通过简单的注解, 即可达到HTTP 请求与控制器处理方法映射的目的, 其Handler查找策略是通过RequestMappingHandlerMapping实现的。示例代码如下:
@ Controller
public class MyRequestMapping {
@RequestMapping( path = "/myRequestMapping", method = RequestMethod.GET) public String requestMappingGet() {
//...省略处理逻辑
}
@RequestMapping( path = "/myRequestMapping", method = RequestMethod.POST) public String requestMappingPost () {
//...省略处理逻辑
}
}
当请求路径requestMappingUrl时, RequestMappingHandlerMapping 会根据请求的 URL查找到@RequestMapping 注解标记的方法, 同时还会判断 HTTP 请求方法。如果是 GET 方法, 则获取 requestMappingGet 并封装为 HandlerMethod, 如果是 POST 方法, 则获取requestMappingPost 方法并封装为 HandlerMethod。下一步会交由 HandlerAdapter去执行这个HandlerMethod。
可以看到该映射机制更加灵活且可选择条件更多,如果要在SimpleUrlHanderMapping或者 BeanNameUrlHandlerMapping 中实现该功能, 其实是做不到的, 它们只支持简单的 URL映射。
@ReuqestMapping映射机制是 Web开发者最常使用的映射机制, 该组件的映射机制不仅仅是 URL 这么简单,它还支持其他如请求方法、请求头等各种不同的筛选条件来进行 Handler映射。