初始化过程
解析web.xml文件,获取监听和servlet配置
servletContextListener初始化,并通过观察者模式监听filer和servlet的初始化和销毁
初始化DispatchServlet,执行父类HttpServlet的init方法
执行initServletBean初始化HttpServletBean
执行initWebApplicationContext,初始化WebApplicationContext
执行initFrameworkServlet,初始化FrameworkServlet
之后执行DispatchServlet的onReFresh和initStrategies方法
自定义springMVC
根据配置文件扫描路径,获取扫描路径下所有类全限定类名
扫描有@controller或@restController等注解的类,并实例化,并获取注解对应url
扫描类的方法中有@getMapping,@postMapping等注解的方法,获取对应url
创建一个handler,包括类的信息和方法信息和拼接的url以及方法参数信息paramIndexMapping
解析方法参数名及类型到handler中
检查有没有对该请求的拦截器,有的话也存到handler中
建立url和method之间的映射关系(map缓存起来) handlerMapping.add(handler);
springMVC请求过程
用户请求DispatchServlet
DispatchServlet根据请求路径调用具体HandlerMapping返回一个HandlerExcutionChain(Handler+拦截器)
DispatchServlet调用HandlerAdapter适配器,HandlerAdapter调用具体的Handler处理业务
Handler处理结束返回一个具体的ModelAndView给适配器,适配器将ModelAndView给DispatchServlet
DispatchServlet把视图名称给ViewResolver视图解析器
ViewResolver返回一个具体的视图给DispatchServlet(在解析出View视图对象的过程中会判断是否重定向、是否转发等,不同的情况封装的是不同的 View实现)
渲染视图,展示给用户
handlerMapping和HandlerAdapter
controller有多种实现方式
1.增加@controller和@requestMapping注解
2.实现Controller接口,重写handleRequest方法
3.实现HttpRequestHandler,重写handleRequest方法
HandlerMapping将controller以BeanNameUrlHandlerMapping
、RequestMappingHandlerMapping等方式
封装为handler
DispatchServlet通过请求获取handler时,获取的是HandlerExcutionChain
HandlerExcutionChain需要通过反射的方式获取以哪种方式执行object类型的handler
因此需要HandlerAdapter识别object类型的handler具体是哪种类型(RequestMappingHandlerAdapter,HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter
)
再解析handler为request和response,servlet执行完成后返回modelAndView