1、MVC模式:
2、Web环境中使用Spring MVC
Spring Mvc是建立在IOC容器基础上的,所以需要在web环境中进行配置,在tomcat中web.xml相关的代码:
<!-- 指定Spring Bean的配置文件所在路径。默认配置在WEB-INF目录下 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/config/applicationContext.xml</param-value>
</context-param>
<!-- 一个监听器,与WEB服务器的生命周期相关联,ContextLoaderListener负责完成Ioc容器在web环境中的启动工作 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 可以使用RequestContextHolder.currentRequestAttributes() 获取到请求的attr -->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- 如果DispatcherServlet的过滤格式是/时,过滤掉静态资源 详细可参考:http://elf8848.iteye.com/blog/875830/-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<!--DispatcherServlet作为处理web请求的转发器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servlet-name>]/WEB-INF/springmvc-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/config/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 设置servlet编码,防止中文乱码 -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<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>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、在Web环境启动过程
ContentLoaderListener-->ContextLoader,ContentLoaderListener通过ContextLoader完成实际的WebApplicationContext,以及IOC容器的初始化。
ContentLoaderListener的方法contextInitialized()调用ContextLoader的initWebApplicationContext()方法,在initWebApplicationContext方法中,生成XmlWebApplicationContext,并读取contextConfigLocation指定spring配置文件,生成对应的IOC容器。
图解:
4、Spring MVC的设计与实现
(映射策略、各种视图实现、拦截器的应用,国际化支持,自定义区域解析器)
DispatchServlet大致工作分两部分:
一个是初始化部分...,一个是对HTTP请求分发处理部分...
初始化部分:Servlet的init作为入口,读取配置在ServletContext中的Bean属性参数,这些属性参数设置在web.xml中的Web容器初始化参数中(如dispatcher-servlet.xml路径),紧接着 建立DispatchServlet持有的上下文以及初始化Ioc容器。在DispatchServlet的initStrategies方法中,启动整个Spring MVC框架的初始化,包括各种MVC框架的实现元素,比如:支持国际化的LocalResolver、支持request映射的HandlerMapping、以及视图生成的ViewResolver等
/**
* Initialize the strategy objects that this servlet uses.
* <p>May be overridden in subclasses in order to initialize further strategy objects.
*/
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
对于生成映射的initHandlerMappings(context);进一步分析:
生成handlerMappings,handlerMappings包含RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,
AbstractHandlerMethodMapping中定义了一个map(叫handlerMethods)来持有一系列的映射关系,即URL请求和控制器的对应关系。
具体来说,这些映射关系通过接口类HandlerMapping来封装,该接口中定义了一个getHandler方法,通过这个方法,可以获得与HTTP请求对应的HandlerExecutionChain。
建立了Controller控制器和HTTP请求之间的映射关系。
分发处理部分:
DispatchServlet是核心部分,是整个MVC框架的调度枢纽,其中的的doDispatch方法很重要:调用getHandler来响应HTTP请求,然后通过执行handler处理业务逻辑,得到返回的ModelAndView结果,最后通过render方法把这个ModelAndView对象交给相应的视图对象去呈现。可以看到这是MVC模式的核心实现。
Excel视图:spring提供了POI和JExcelAPI两个方案
PDF视图:spring使用了第三方的iText