SpringMVC分析
# SpringMVC分析
草稿
# 注册 Controller 的几种方式
Contoller 的定义方式有 2 种类型,3 种实现。
2 种类型:BeanName、@Controller,体现在 HandlerMapping 上
3 种实现:实现 HttpRequestHandler 接口、实现 Controller 接口、加 @Controller
⭐ 实现 Controller 接口,重写 handleRequest 方法
@Component("/test1.do")
public class BeanNameController implements Controller {
@Override
public ModelAndView hadnleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 处理业务
return null;
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
⭐ 实现 HttpRequestHandler 接口,重写 handeRequest 方法
@Component("/test2.do")
public class HandleController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
// 处理业务
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
⭐ 使用 @Controller 注解(最常用)
@Controller
public class TestController {
@RequestMapping("/test3.do")
public void handleRequest() {
// 处理业务
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
为什么要设计 HandlerMapping?
主要用于解决找到通过不同方式注册的 Controller,这里是是一个策略模式,遍历 HandlerMappings 拿到所有不同 handlerMapping 的实现,分别进行处理。
HandlerMapping 包含两类,对应 Controller 注册的两种方式
- RequeustMappingHandlerMapping:获取通过 @Controller 注解注入的 Controller
- BeanNameUrlHandlerMapping:获取通过 BeanName 方式注入的 Controller
所以说,HandlerMapping 主要就是用于找到 Controller。
HandlerAdapter 包含三类,对应 Controller 注册的三种实现
这里应该是适配器模式
- RequestMappingHandlerAdapter
如果是用 @Controller 注解注册的,那么需要通过反射调用里面的方法;如果通过 BeanName 的方法注册的,那么通过 bean 对象调用方法。
SpringMVC 找到 Controller 流程:
- 扫描整个项目(Spring来完成),定义一个 map 集合
- 拿到所有带有 @Controller 注解的类
- 遍历类里面所有的方法对象,判断方法是否加了 @RequestMapping 注解
- 把 @RequestMapping 注解中的 URI 作为 key,方法作为 value 放入 map 集合。
- 根据用户发送的请求,拿到请求中的 URI
- 使用请求的 uri 作为 key 去 map 中获取,看看是否有返回值
编辑 (opens new window)
上次更新: 2023/08/20, 21:21:52