spring-mvc 的启动流程
1、request 请求到达 dispatchServlet-> doService()->doDispatch() 开始处理请求
2、根据doDispatch() 再去调用getHandler() 目的是获取包含 处理器Handler和处理器拦截器 AdapterIntercepers 的处理器拦截链 HandlerExecutionChain
2.1 getHandler(HttpServletRequest request) 通过HandlerMappping对象获取HandlerExecutionChain
3、再通过getHandlerAdapter() 在拦截链中获取handler对应的处理器适配器 handleAdapter
4、ha.handler(processedRequest, response, mappedHandler.getHandler()) 通过handlerAdapter来调用具体的处理器 完成对请求的处理
4.1 hanler 调用 SimpleServletHandlerAdapter.service()->HttpServlet.service()->HttpServlet.service()->doGet(req, resp);
在这里我们发现不只是调用doGet()请求,而是根据请求方法来决定调用doGet()还是doPost(),或者其他
这里发现请求有如下:doGet(req, resp);doHead(req, resp);doPost(req, resp);
doPut(req, resp);doDelete(req, resp);doOptions(req,resp);doTrace(req,resp);
5、根据handler返回的ModleAndView来决定是否渲染试图 ModleAndView 将modle 和 view 封装在一起
6、ViewResolver:视图解析器 负责将处理结果生成view 试图
具体操作:ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View 进行渲染将处理结果通过页面展示给用户
7、view 是spring-mvc 的封装对象,是一个接口
springmvc框架提供了很多的View视图类型,包括:jspview,pdfview,jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
在阅读源码的过程中,发现在启动流程中,用到了适配器模式。。。。
适配器模式:大致对它的理解是这样的,假如现在有一个三方系统M,我们现在有个系统A需要和他交互,那么需要双方定义通信协议。那么问题来了,如果后期我们有很多系统都想于这个M来交互,那么都需要和M去定义通信协议,对于M来说,M会答应么?
解决方案:这个时候,我们来找一个C,来兼容所有的系统,而最后和M交互的只有C,其他系统想要和M交互,那么只需要和C交互在这里C就相当于我们的适配器,也及就是说适配各种系统的调用
网友评论