如下爲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;
- 交付數據模型,以視圖形式響應給客戶,整個請求流程完成。