目录,更新ing,学习Java的点滴记录
目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录
SpringMvc知识
第一篇---->SpringMvc初识|MVC|三层架构
第二篇---->IoC容器上下文和映射请求上下文
第三篇---->熟悉基本开发流程
第四篇---->接收各类请求参数的方式
第五篇---->获取请求中的Request,Session,Cookie等对象属性
第六篇---->拦截器开发
第七篇---->视图和视图解析器
第八篇---->数据校验
第九篇---->文件上传方式
第十篇---->数据转换和数据格式化
1 引入
- 看过第一篇的小伙伴不知是否还记得web.xml中配置的内容呢?重新贴一下配置内容回顾一下
- 当时入门案例里面用不到SpringIOC容器,所以SpringIOC容器的初始化时被注释掉的,打开注释也没关系,只需要在/WEB-INF目录下新建一个applicationContext.xml即可
- 现在我们来针对这个文件的内容进行细致的研究一下,这里面配置了DispatcherServlet和ContextLoaderListener,那么它们是如何初始化SpringIOC容器上下文和映射请求上下文的呢?PS:映射请求上下文是基于SpringIOC上下文扩展出来的.
2 初始化Spring IOC上下文
- JavaWeb容器在其生命周期中提供
ServletContextListener接口
,这个接口可以在Web容器初始化和结束期中执行一定的逻辑,换句话说,通过它可以使得在DispatcherServlet初始化前就可以完成SpringIOC容器的初始化,也可以在结束期完成对SpringIOC容器的销毁
,只要实现了ServletContextListener接口的方法就可以.SpringMvc交给了类ContextLoaderListener,现在我们看一下它的源码
- 从源码中可以看到ContextLoaderListener实现了ServletContextListener接口,并且在类中提供了初始化和销毁的方法,这样就可以明白在web.xml中配置ContextLoaderListener的作用了,可以在JavaWeb应用中初始化SpringIOC容器,并将其销毁.这样就可以让SpringIOC容器去管理整个Web工程的资源了.
3 初始化映射请求上下文
- 映射请求上下文是
通过DispatcherServlet初始化的
,它和普通的Servlet也是一样的,可以根据自己的需要配置它初始化的时间点,比如是在应用启动时就初始化还是等待用户第一次请求时进行初始化. - 上面提到过SpringIOC容器的初始化需要借助与ContextLoaderListener,但是即便即没有注册ContextLoaderListener,DispatcherServlet也会在其初始化的时候对SpringIOC容器进行初始化.但是这种方式不是最好的选择,下面会详谈,那么该怎么选择初始化DispatcherServlet的时刻呢?
- 首先,初始化一个SpringIOC容器是一个耗时的操作,所以这个工作不应该放到用户请求上,没必要让一个用户陷入长期的等待中,因此大部分场景下,都应该让DispatcherServlet在服务器启动期间就完成SpringIOC容器的初始化,可以选择在web容器刚启动的时候或者在web容器载入DispatcherServlet的时候进行初始化.
最好的时间点是--web容器刚开始的时候对SpringIOC进行初始化
,因为在整个web的初始化中,不只是DispatcherServlet需要使用到SpringIOC的资源,其他的组件可能也需要.在最开始就初始化可以让web中的各个组件共享资源.因此大部分情况下都建议使用ContextLoaderListener进行初始化
. - 下面看一下DispatcherServlet的设计类结构图
- 从结构图中可以看出,DispatcherServlet的父类是FrameworkServlet,而FrameworkServlet的父类则是HttpServletBean.HttpServletBean继承了Web容器所提供的HttpServlet,所以DispatcherServlet是一个可以载入Web容器中的Servet.
- Web容器对于Servlet的初始化,首先是调用其init方法,对于DispatcherServlet也是如此,DispatcherServlet的初始化方法在其父类HttpServletBean中
- 在类HttpServletBean中的init方法中可以看到ininServletBean()方法,这个方法是交给子类去实现的,现在我们去HttpServletBean的子类
FrameworkServlet中看看initServletBean方法
- 从上图中就可以清楚看到SpringIOC容器的初始化过程了.当IoC容器没有对应的初始化的时候,DispatcherServlet就会尝试去创建它,最后
调度onRefresh方法
,该方法也是DispatcherServlet中一个非常重要的方法,因为它`将初始化SpringMvc的各个组件,而onRefresh方法就在DispatcherServlet,我们马上看看它
- 这些组件很复杂,但确实SpringMvc的核心组件,了解一下基本内容
1) MultipartResolver:文件解析器,用于支持服务器的文件上传
2) LocaleResolver:国际化解析器,可以提供国际化的功能
3) ThemeResolver:主题解析器,类似于软件皮肤的转换功能
4) HandlerMappings:SpringMvc中非常重要的内容,它包装开发者提供的一个控制器方法和它的拦截器,通过调用它就能够运行控制器
5) HandlerAdapter:处理器适配器,因为处理器会在不同的上下文中运行,所以SpringMVC会先找到合适的适配器,然后运行处理器服务方法.
6)HandlerExceptionResolver:处理器异常解析器,处理器可能产生异常,如果产生异常,则可以通过异常解析器来处理它.
7) RequestToViewNameTranslator:视图逻辑名称转换器,在控制器中返回一个视图的名称,通过它可以找到实际的视图.当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名.
8) ViewResolver:视图解析器,当控制器返回后,通过视图解析器会把逻辑视图名进行解析,然后定位实际视图. - 由此可见,
启动期间DispatcherServlet会加载这些配置的组件进行初始化,这就是我们为什么并不需要很多配置就能够使用SpringMvc的原因了