作者:顽石1129_659 | 来源:互联网 | 2023-09-25 16:36
1.SimplUrlHandlerMapping01.在applicationContext.xml中配置:02.定义控制器03.web.xml中的配置还如上篇博客2.Handll
1.SimplUrlHandlerMapping
01.在applicationContext.xml中配置:
02.定义控制器
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("username","Spring-MVC");
mv.setViewName("index"); //逻辑视图名
return mv;
}
}
03.web.xml中的配置还如上篇博客
2.HandllerMapping执行流程
请求过来先碰见中央调度器(前端调度器)
对当前请求决定交给哪个handler, 当前请求地址过来
处理器执行链处理请求,接着我们去找getHandler的实现
hm是HandlerMapping对象,下图选定位置调用HandlerMapping的getHandler()方法通过请求找到Handler,但是返回值为HandlerExecutionChain(执行链)
这个servlet所支持的处理器映射器的集合,这里有N个处理器映射器。hm就是指HandlerMapping ,下面的if中的代码是指记录日志,日志跟踪。HandlerMapping处理器映射器中有N个拦截器,处理客服端请求的处理器只有一个,就是handler处理器。
getHandler我们跟进去,
看过来的handler是不是执行链,要是就把handler强转成执行链,如果不是我new出一个执行链并且把handler给执行链。
HandlerInterceptor是处理器的拦截器。而且不是一个是多个拦截器(this.adaptedInterceptors),然后做了一个操作。如果当期拦截器,是映射用的拦截器,就把他给强转成处理器映射器。
然后做了一个匹配,和查找的路径做匹配。然后加到了执行链拦截器中。那么如果不是就直接用一个的参数来添加。所有可以看出HandlerExecutionChain中只包含一个handler。包含N个拦截器。在把这个对象返回给了中央调度器。
HandlerMapping总结:
DispatcherServlet
--->doDispatcher()
---->getHandler(request):
---->HandlerExecutionChain
------> hm.getHandler(request)-----》方法体中
----->ExecutionChain executiOnChain= getHandlerExecutionChain(handler, request);
----->new HandlerExecutionChain(handler)
----->chain.addInterceptor(interceptor);
HandlerMapping:处理器映射器
作用:根据【请求】找到【处理器Handler】,但并不是简单的返回处理器,而是
将处理器和拦截器封装,形成一个处理器执行链(HandlerExecuteChain)。
4..DispatcherServlet 拿着执行链去寻找对应的处理器适配器(HandlerAdapter)
为什么要引入适配器?
因为处理器(Handler)有很多种,DispatcherServlet没办法统一管理,所以出现了适配器。让适配器统一处理Handler,而DispatcherServlet统一处理适配器。根据请求去找对应的handler
3.HandlerAdapto执行流程
1.0在DispatcherServlet中找到getHandlerAdapter()方法
2.0进入getHandlerAdapter()具体的方法实现内
3.0获取ModelAndView:
4.0真正的执行者:
4.HashMap和LinkedHashMap
HashMap底层是通过一个Entry [] table,接下来单个entry数据类型:是HashMap静态内部类。静态内部类中有一个成员变量:Entry next :通过该成员变量,其底层用的是单向链表,性能低。
LinkedHashMap:底层也是一个Entry数组,接下来单个Entry数据类型Entry before,after;(双向链表)
5.AbstractController:
若处理器继承自AbstractController类,那么该控制类就具有了一些新功能。因为AbstractController类还继承自一个父类WebControllerGenerator, WebControllerGenerator具有supportMethods属性,可以设置支持的HTTP数据提交方式。默认支持GET/POST/HEAD
01.AbstractController限定请求提交方式
6.MultiActionController默认方法名称解析器
7.PropertiesMethodNameResolveer属性方法名称解析器