1.Springmvc的启动原理是什么?为什么可以作为web服务?
因为springmvc的入口就是一个servlet,所以可以作为web服务使用,而controller实际上做了一层封装,对dodispart做了解析操作,可以Springmvc可以支持rest风格请求。
Springmvc的原理分析:
- DispatcherServlet 为Springmvc的顶层servlet入口,继承了frameworkservlet继承了httpservlet,所以就是一个servlet。
- dispatcherServlet中有handlermapping list 以及adapterlist ,mutilpartreslover,exeptionresolver,viewreslover,
dispatcherservlet 实现了applicationcontentaware 接口,因此可以监听容器的启动状态,例如当容器关闭时,关闭web 服务等等,设置容器等等,
initWebApplicationContext()用来初始化一个webapplicationcontent,并设置父亲为applicationcontent,所以,webapplicationcontent的parent为applicationcontent。
- service()方法为http请求入口,用来对http提供处理,如果不是patch执行super.service,用来解析header,请求方式,判断使用哪种请求风格,所有请求统一走processRequest方法,
- 最后处理方法统一为dodispatch()方法,首先判断是否为multipart格式的request,如果是则转化成multuparthttpservlertrequest对象,否则不处理,根据request获取对应的HandlerExecutionChain对象,
- 获取HandlerExecutionChain 的方式:先拿到所有的handlermapping结合,然后进行遍历,找到第一个符合的handlerexecutionchain对象。
- 筛选handlerexecutionchain的规则:根据request,先通过path进行查找,如果找到匹配上的handler时,并且handler为string,用name去容器中获取bean,找到后去容器中拿到所有的intecepters,然后就行过滤后组装到handlerexcutionchain对象中,返回。
- 检查modified,header请求方式
- 通过handlerexecutionchain的handler拿到adapter,然后执行prehandler(),方法,chain.prehandler(req,resp);
- 执行handler方法,mv = ad.handler(req,resp,chain.gethandler)
10.执行posthandler
11.执行processresult,对exception,modelandview 进行解析,当exe不为空时,判断是否为ModelAndViewDefiningException ,如果是,找到对应异常的modelandview,否则使用默认的errmodelandview
12.执行render方法将modelandview进行解析,先根据view name解析拿到view,执行view render,是转发还是直接对data输出逻辑。