一、SpringMVC的实现思想
二、SpringMVC处理请求流程
HandlerMapping:IOC容器一启动就要去生成bean对象,每扫描一个Controller对象,就会扫描里面的RequestMapping,看这个Controller对象能处理什么请求,扫描到了就保存在handlerMap中。下次请求过来的时候直接看遍历这个map里面找到可以处理这个请求的处理器,然后进行对应的操作
- 浏览器向服务器发送请求,服务器接受到请求以后,由Dispatcher进行处理;
- 遍历HandlerMapping,里面保存了RequestMapping和handler的映射规则;
- 看当前HandlerMapping里面是否可以处理当前请求,如果可以找到对应的HandlerAdapter;如果不可以,继续遍历下一个HandlerMapping(这里可以进行SpringBoot的扩展,可以自定义HandlerMapping)
- 找到了以后,使用HandlerAdapter来执行目标方法,处理浏览器的请求
这里对map中所有的HandlerMapping进行遍历,类似于设计模式中的责任链模式
三、支持Rest风格的URL请求,使用HiddenHttpMethodFilter
- 浏览器form表单只支持GET和POST方法,而不支持DELETE、PUT等方法,但是SringMVC支持Rest风格的URL请求,但是在编写form表单的时候POST、DELETE和PUT的method=POST,如下图所示:
- 这里的name必须是指定的"_method",但是可以自定义,Spring里面和SpringBoot里面都可以自定义name。
- 源码如下所示,先获得_method里面的值,判断当前的请求是否是post请求,如果都符合条件,那么就会使用装饰器模式,来对原来的方法进行包装,把request和method一起包装成为一个HttpServletRequest请求。