如下为web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
<display-name>Archetype Created Web Application</display-name>
<!-- Spring和mybatis的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- Spring MVC servlet -->
<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:spring-mvc.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>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
先摘抄一下一些概念:
<context-param>的做用:
web.xml的配置中<context-param>配置做用 html
1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>
2.紧接着,容器建立一个ServletContext(上下文),这个WEB项目全部部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4.容器建立<listener></listener>中的类实例,即建立监听. 前端
换句话说,这个时候,你对<context-param>中的键值作的操做,将在你的WEB项目彻底启动以前被执行.java
context-param和init-param区别
web.xml里面能够定义两种参数:
(1)application范围内的参数,存放在servletcontext中(context-param)
(2)servlet范围内的参数,只能在servlet的init()方法中取得(init-param)web
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>spring
ContextLoaderListener的做用就是启动Web容器时,自动装配spring-mybatis.xml的配置信息。由于它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。apache
(实现上下文,引入配置)设计模式
如下详解api
org.springframework.web.context.ContextLoaderListener类实现了javax.servlet.ServletContextListener接口。ServletContextListener接口可以监听ServletContext对象的生命周期,由于每一个web应用仅有一个ServletContext对象,故实际上该接口监听的是整个web应用。spring-mvc
实现该接口的类在web.xml中做为监听器配置后,当web应用启动后,会触发ServletContextEvent事件,调用ContextLoaderListener的contextInitialized(ServletContextEvent sce)方法。缓存
ContextLoaderListener经过一个ContextLoader对象来初始化Spring容器。在contextInitialized方法中调用contextLoader.initWebApplicationContext(event.getServletContext())。
web.xml的配置在我理解里面至关告诉容器有哪些须要加载的文件
<context-param>引入须要加载的配置文件classpath在idea里面就是资源目录的意思,通常默认在WEB-INF目录下
不清楚的话通常会忘记配置监听器ContextLoaderListener,它的做用就是装配你引入的配置文件的信息,若是不配置在后面的操做中就会发现你始终找不到dao接口的实例(mapper)
若是配置仍是找不到通常就是路径问题,或是在pom.xml引入资源
<build>
<finalName>text</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
这个可配可不配
引入一下api的翻译
- /**
- * org.springframework.web.util.IntrospectorCleanupListener的用途
- * @see -------------------------------------------------------------------------------------------------------------------
- * @see 此监听器出用于主要为了解决java.beans.Introspector致使内存泄漏的问题
- * @see 此监听器应该配置在web.xml中与Spring相关监听器中的第一个位置(也要在ContextLoaderListener的前面)
- * @see -------------------------------------------------------------------------------------------------------------------
- * @see JDK中的java.beans.Introspector类的用途是发现Java类是否符合JavaBean规范
- * @see 若是有的框架或程序用到了Introspector类,那么就会启用一个系统级别的缓存,此缓存会存放一些曾加载并分析过的JavaBean的引用
- * @see 当Web服务器关闭时,因为此缓存中存放着这些JavaBean的引用,因此垃圾回收器没法回收Web容器中的JavaBean对象,最后致使内存变大
- * @see 而org.springframework.web.util.IntrospectorCleanupListener就是专门用来处理Introspector内存泄漏问题的辅助类
- * @see IntrospectorCleanupListener会在Web服务器中止时清理Introspector缓存,使那些Javabean能被垃圾回收器正确回收
- * @see -------------------------------------------------------------------------------------------------------------------
- * @see Spring自身不会出现这种问题
- * @see 由于Spring在加载并分析完一个类以后会立刻刷新JavaBeans Introspector缓存,这就保证Spring中不会出现这种内存泄漏的问题
- * @see 但有些程序和框架在使用了JavaBeans Introspector以后,没有进行清理工做(如Quartz,Struts),最后致使内存泄漏
- * @see -------------------------------------------------------------------------------------------------------------------
- * @create Sep 24, 2013 9:10:09 PM
- * @author 玄玉<http://blog.csdn.net/jadyer>
- */
DispatcherServlet
DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,并且负责职责的分派,并且与Spring IoC容器无缝集成,从而能够得到Spring的全部好处。
DispatcherServlet主要用做职责调度工做,自己主要用于控制流程,主要职责以下:
一、文件上传解析,若是请求类型是multipart将经过MultipartResolver进行文件上传解析;
二、经过HandlerMapping,将请求映射处处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
三、经过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
四、经过ViewResolver解析逻辑视图名到具体视图实现;
五、本地化解析;
六、渲染具体的视图等;
七、若是执行过程当中遇到异常将交给HandlerExceptionResolver来解析。
从以上咱们能够看出DispatcherServlet主要负责流程的控制(并且在流程中的每一个关键点都是很容易扩展的)。
工做流程:
- Web中,无非是请求和响应;
- 在SpringMVC中,请求的第一站是DispatcherServlet,充当前端控制器角色;
- DispatcherServlet会查询一个或多个处理器映射(handler mapping)并根据请求所携带的URL信息进行决策,将请求发送给哪一个SpringMVC控制器(controller);
- 控制器作两件事:一是将数据打包,二是定义逻辑视图名,而后返回给DispatcherServlet;
- DispatcherServlet经过视图解析器(view resolver)来将逻辑视图名匹配为一个特定的视图实现,它多是也可能不是JSP;
- 交付数据模型,以视图形式响应给客户,整个请求流程完成。