Spring MVC 的 研發之路 (二)
二、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) 銷毀方法.用於關閉應用前釋放資源,比方說數據庫連接的關閉。一、
<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 的 研發之路 (二)