SpringMVC实现解析之开篇

原创
2019/06/13 10:21
阅读数 56

#启动流程 SpringMVC通过javaweb的web.xml配置来初始化Spring容器,启动web项目后,web容器首先回去找web.xml文件,读取这个文件,web.xml配置执行顺序为:context-param -> listener-> filter -> servlet。

context-param是参数配置如SpringMVC中Spring的xml路径配置

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:applicationcontext-*.xml</param-value>
	</context-param>

listener是web容器的监听器配置如SpringMVC中Spring容器加载器的配置

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

filter是web容器的过滤器配置如SpringMVC中字符集过滤器的配置

	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

servlet是web容器的请求收集器配置如SpringMVC中请求调度器的配置

	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath*:springmvc-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

SpringMVC中初始化Spring容器的主要有org.springframework.web.context.ContextLoaderListener和org.springframework.web.servlet.DispatcherServlet。web启动时会调用ContextLoaderListener#contextInitialized方法其功能主要是初始化Spring的xml的配置,接着调用DispatcherServlet#init方法其功能主要是初始化SpringMVC的xml的配置。

ContextLoaderListener#contextInitialized方法先会创建org.springframework.web.context.support.XmlWebApplicationContext类型的WebApplicationContext然后获取web.xml<context-param>中param-name为contextConfigLocation的xml的配置,并将xml的配置的路径设置到XmlWebApplicationContext中并调用XmlWebApplicationContext#refresh方法初始化容器。最后将初始化好的XmlWebApplicationContext设置到servlet的上下文对象中供后续使用。

DispatcherServlet#init方法同样先会创建org.springframework.web.context.support.XmlWebApplicationContext类型的WebApplicationContext,然后获取<servlet>/<init-param>中param-name为contextConfigLocation的xml的配置,并将xml的配置的路径设置到XmlWebApplicationContext中并调用XmlWebApplicationContext#refresh方法初始化容器,最后将之前在ContextLoaderListener#contextInitialized方法中初始化好的XmlWebApplicationContext设置到当前XmlWebApplicationContext的parent对象中。这时会有父子2个XmlWebApplicationContext,在使用时会优先获取找子对象如果找不到才会取查找父中的对象。初始化XmlWebApplicationContext后需要从Spring容器中获取供SpringMVC使用的组件,SpringMVC中主要组件如下:

1.MultipartResolver:文件上传解析器

系统带文件上传功能需要配置此解析器,可以将HttpServletRequest包装成MultipartHttpServletRequest来处理上传文件。

2.LocaleResolver:i18n国际化解析器

先获取用户配置的LocaleResolver,如果未配置使用AcceptHeaderLocaleResolver。其功能是使前端页面显示国际化可以使不同的地区显示不同的页面。

3.HandlerMapping:url映射器

Spring启动时会根据Controller初始化HandlerMapping,在请求时根据url获取HandlerMapping。

4.HandlerAdapter:Handler适配器

HandlerMapping中的Handler的类型Object,所以需要找到一个适配Handler执行的适配器。

5.HandlerExceptionResolver:异常处理器

当在执行过程中出现异常,会将其捕获交给异常处理器处理。

6.RequestToViewNameTranslator:默认视图转化器

先获取用户配置的RequestToViewNameTranslator,未配置使用DefaultRequestToViewNameTranslator,当请求的Controller没有设置视图时,会调用视图转化器取默认视图资源。

7.ViewResolver:视图解析器

先获取用户配置的ViewResolver(如velocity),未配置使用InternalResourceViewResolver,ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真

正的视图View,由View渲染视图。

8.FlashMapManager:闪存

先获取用户配置的FlashMapManager,未配置使用SessionFlashMapManager,重定向(Redirect)时如果设置了FlashMap会进行存储且存储带过期时间,可以将想要的数据带到重定向的Controller。

9.ThemeResolver:主题风格解析器

主要是前端页面使用,前端可以使用spring:theme 标签配置前端不同的样式

请求流程图

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部