1. 程式人生 > >Spring MVC 的 研發之路 (二)

Spring MVC 的 研發之路 (二)

eight 對象 files tin servlet映射 資源 研發 領域 延遲

二、web.xml的簡單配置介紹1

1、啟動Web項目時,容器回去讀web.xml配置文件裏的兩個節點<context-param>和<listener> 2、接著容器會創建一個servletContext(上下文)應用範圍內都能使用這個上下文 3、接著容器會將讀取到<context-param>轉化為鍵值對,並交給ServletContext。 4、通過<listener>創建監聽 5、在監聽的類中會有一個contextInitialized(ServletContextEvent event)初始化方法,在這種方法中能夠通過event.getServletContext().getInitParameter("contextConfigLocation") 來得到context-param 設定的值。在這個類中還必須有一個contextDestroyed(ServletContextEvent event) 銷毀方法.用於關閉應用前釋放資源,比方說數據庫連接的關閉。
6、得到這個context-param的值之後,你就能夠做一些操作了.註意,這個時候你的WEB項目還沒有全然啟動完畢.這個動作會比全部的Servlet都要早。

一、

<span style="font-size:18px;"><context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/spring/application-datasource.xml
        </param-value>
</context-param></span></span>

該元素用來聲明應用範圍內的上下文初始化參數(整個web項目中)比如對數據庫連接池的配置等

param-name 設定上下文的參數名稱。名稱必須唯一

param-value 設定的參數名稱的值 指定響應的xml文件名稱,假設有多個文件能夠寫在一起用“,”分隔

能夠採用通配符形式applicationContext-*.xml 能夠將此類開頭的文件所有加載

1、能夠直接將之放到/web-inf下

2、放到classpath下 classpath:/spring/application-datasource.xml

如:

<span style="font-size:18px;"><!-- Context Configuration locations for Spring XML files -->  
<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>  
</context-param> </span><span style="font-size: 14px;">
</span></span>


以此供web容器載入


二、

<span style="font-size:18px;"><listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener></span></span>

listener標簽是用於監聽的,ContextLoaderListener實現了ServletContextListener接口,能夠監聽全部的servlet、session、request等接口。 ContextLoaderListener的作用就是啟動Web容器時。自己主動裝配ApplicationContext的配置信息,它實現了ServletContextListener這個接口,在web.xml中配置這個監聽器,啟動容器時,就是默認運行它的實現方法。


ServletContext:每一個web應用都有一個servletContext與之相關.servletContext對象在應用啟動的時候被創建,在應用關閉的時候被銷毀。

ervletContextListener: 使用listener接口。開發人員可以在為client請求提供服務之前向ServletContext中加入隨意的對象。

這個對象在ServletContext啟動的時候被初始化,然後在ServletContext整個執行期間都是可見的。

該接口擁有兩個方法例如以下所看到的:

三、
<filter>
    <filter-name></filter-name>
    <filter-class></filter-class>
</filter>

filter運行是依照web.xml配置的filter-mapping先後順序進行運行
<span style="font-size:18px;">    <filter>
        <filter-name>Character Encoding</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>

    </filter>

    <filter-mapping>
        <filter-name>Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping></span><span style="font-size: 14px;">
</span>

以上是防止亂碼
<span style="font-size:18px;"><filter>
        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
        <init-param>
            <param-name>entityManagerFactoryBeanName</param-name>
            <param-value>entityManagerFactory</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping></span><span style="font-size: 14px;">
</span>

在Java Web項目中使用Hibernate常常會遇到LazyInitializationException。

這是由於controller和model層(java代碼)將通過JPA的一些啟用了延遲載入功能的領域(如用getRefrence()方法或者在關聯關系中採用fetch=FetchType.LAZY)返回給view層(jsp代碼)的時候,由於載入領域對象的JPA Session已經關閉,導致這些延遲載入的數據訪問異常。

這時就能夠使用OpenEntityManagerInViewFilter來將一個JPAsession與一次完整的請求過程相應的線程相綁定。

假設沒使用OpenEntityManagerInViewFilter,session會在service.find()方法後就被關閉。用了以後session在整個view層結束後才關閉。

四、

<span style="font-size:18px;"><servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

	<servlet-mapping>
		<servlet-name>mvc-dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping></span><span style="font-size: 14px;">
</span>

DispatcherServlet是前端控制器設計模式的實現,提供Spring Web MVC的集中訪問點。並且負責職責的分派。並且與Spring IoC容器無縫集成,從而能夠獲得Spring的全部優點。

詳細請參考第二章的圖2-1。

DispatcherServlet主要用作職責調度工作。本身主要用於控制流程,主要職責例如以下:

1、文件上傳解析,假設請求類型是multipart將通過MultipartResolver進行文件上傳解析;

2、通過HandlerMapping,將請求映射到處理器(返回一個HandlerExecutionChain,它包含一個處理器、多個HandlerInterceptor攔截器)。

3、 通過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);

4、通過ViewResolver解析邏輯視圖名到詳細視圖實現;

5、本地化解析;

6、渲染詳細的視圖等;

7、假設運行過程中遇到異常將交給HandlerExceptionResolver來解析。

load-on-startup:表示啟動容器時初始化該Servlet;

url-pattern:表示哪些請求交給Spring WebMVC處理, “/” 是用來定義默認servlet映射的。也能夠如“*.html”表示攔截全部以html為擴展名的請求。

DispatcherServlet默認使用WebApplicationContext作為上下文。Spring默認配置文件為“/WEB-INF/[servlet名字]-servlet.xml”。


以上是看了眾多關於web.xml文章中整理出來的easy理解的部分。

Spring MVC 的 研發之路 (二)