Java之旅--Web.xml解析,java之旅--web.xml
Windows的IIS,是用UI介面進行網站的配置;Linux下面的幾乎所有系統,都是使用設定檔來進行配置,Java容器(JBoss/Tomcat/Jetty/WebSphere/WebLogic等等)也不例外,它們使用一個部署在WEB-INFO目錄下面的web.xml來作為網站設定檔。
本文參考互連網文章,學習並記錄web.xml的載入順序及配置詳解。
web.xml載入順序
應用伺服器啟動時web.xml的載入過程,和這些節點在xml檔案中的前後順序沒有關係,不過有些應用伺服器,比如WebSphere,就嚴格要求web.xml的節點順序,否則部署不成功,所以最好還是按照web.xml的標準格式寫,即:context-param --> listener --> filter --> servlet 。
對於某類配置節而言,與它們出現的順序是有關的。
以 filter 為例,web.xml 中當然可以定義多個 filter,與 filter 相關的一個配置節是 filter-mapping,這裡一定要注意,對於擁有相同 filter-name 的 filter 和 filter-mapping 配置節而言,filter-mapping 必須出現在 filter 之後,否則當解析到 filter-mapping 時,它所對應的 filter-name 還未定義。
web 容器啟動時初始化每個 filter 時,是按照 filter 配置節出現的順序來初始化的,當請求資源匹配多個 filter-mapping 時,filter 攔截資源是按照 filter-mapping 配置節出現的順序來依次調用 doFilter() 方法的。
servlet 同 filter 類似,此處不再贅述。
比如filter 需要用到 bean ,但載入順序是: 先載入filter 後載入spring,則filter中初始化操作中的bean為null;所以,如果過濾器中要使用到 bean,可以將spring 的載入 改成 Listener的方式:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
web.xml節點解析
<context-param />
用來設定web網站的環境參數
它包含兩個子項目:<param-name></param-name> 用來指定參數的名稱;<param-value></param-value> 用來設定參數值
在此設定的參數,可以在servlet中用 getServletContext().getInitParameter("my_param") 來取得
例子:
<context-param><param-name>webAppRootKey</param-name><param-value>privilege.root</param-value></context-param><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/applicationContext*.xmlclasspath*:/cas-authority.xml</param-value></context-param><context-param><param-name>log4jConfigLocation</param-name><param-value>/WEB-INF/classes/log4j.xml</param-value></context-param><context-param> <param-name>spring.profiles.default</param-name> <param-value>dev</param-value> </context-param>
<listener />
用來設定Listener介面
它的主要子項目為 <listener-class></listener-class> ,用來定義Listener的類名稱
例子:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<filter />
用來聲明filter的相關設定
<filter-name></filter-name> 指定filter的名字
<filter-class></filter-class> 用來定義filter的類的名稱
<init-param></init-param> 用來定義參數,它有兩個子項目: <param-name></param-name> 用來指定參數的名稱, <param-value></param-value> 用來設定參數值
與<filter></filter>一起使用的是
<filter-mapping></filter-mapping> 用來定義filter所對應的URL,包含兩個子項目:
<filter-name></filter-name> 指定filter的名稱
<url-pattern></url-pattern> 指定filter所對應的URL
例子:
<!-- 解決中文亂碼問題 --><filter><filter-name>encodingFilter</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><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>*.do</url-pattern></filter-mapping>
<servlet />
用來聲明一個servlet的資料,主要有以下子項目:
<servlet-name></servlet-name> 指定servlet的名稱
<servlet-class></servlet-class> 指定servlet的類名稱
<jsp-file></jsp-file> 指定web月台中的某個JSP網頁的完整路徑
<init-param></init-param> 用來定義參數
與<servlet></servlet>一起使用的是
<servlet-mapping></servlet-mapping> 用來定義servlet所對應的URL,包含兩個子項目:
<servlet-name></servlet-name> 指定servlet的名稱
<url-pattern></url-pattern> 指定servlet所對應的URL
例子:
<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><!-- 用dubbo提供hessian服務 --><servlet> <servlet-name>dubbo</servlet-name> <servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dubbo</servlet-name> <url-pattern>/hessian/*</url-pattern> </servlet-mapping>
基本節點
1、<description/> 是對網站的描述
例子:<description>傳道、授業、解惑</description>
2、<display-name/> 定義網站的名稱
例子:<display-name>我的網站</display-name>
3、<icon>
icon元素包含small-icon和large-icon兩個子項目,用來指定web網站中小表徵圖和大表徵圖的路徑。
<small-icon>/路徑/smallicon.gif</small-icon>
small-icon元素應指向web月台中某個小表徵圖的路徑,大小為16 X 16 pixel,但是圖象檔案必須為GIF或JPEG格式,副檔名必須為:.gif或.jpg。
<large-icon>/路徑/largeicon-jpg</large-icon>
large-icon元素應指向web月台中某個大圖表路徑,大小為32 X 32 pixel,但是圖象檔案必須為GIF或JPEG的格式,副檔名必須為: gif或jpg。
例子:
<icon>
<small-icon>/images/small.gif</small-icon>
<large-icon>/images/large.gir</large-icon>
</icon>
4、 <distributable/> 是指定該網站是否可分散式處理
5、 <session-config/> 用來定義web月台中的session參數
包含一個子項目:
<session-timeout></session-timeout> 用來定義這個web月台所有session的有效期間限,單位為 分鐘
6、 <mime-mapping /> 定義某一個副檔名和某一個MIME Type做對應,它包含兩個子項目:
<extension></extension> 副檔名的名稱
<mime-type></mime-type> MIME格式
例子:
<mime-mapping><extension>csv</extension><mime-type>application/octet-stream</mime-type></mime-mapping>
7、 <error-page>
通過錯誤碼來配置error-page
<error-page> <error-code>404</error-code> <location>/message.jsp</location> </error-page>
通過異常類來配置error-page
<error-page> <exception-type>java.lang.NullException</exception-type> <location>/error.jsp</location> </error-page>
8、 <welcome-file-list/>
<welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list>
9、 <resource-ref></resource-ref> 定義利用JNDI取得月台可利用的資源
有五個子項目:
<description></description> 資源說明
<rec-ref-name></rec-ref-name> 資源名稱
<res-type></res-type> 資源種類
<res-auth></res-auth> 資源經由Application或Container來許可
<res-sharing-scope></res-sharing-scope> 資源是否可以共用,有Shareable和Unshareable兩個值,預設為Shareable
比如,設定資料庫串連池就可在此配置
<resource-ref>
<description>JNDI JDBC DataSource of shop</description>
<res-ref-name>jdbc/sample_db</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
怎用java在webxml檔案中取值
如果是要取出全部的值.建議解析WEB.XML然後取值.如果是取某個特定的值可以用下面的:
web.xml裡面可以定義兩種參數:
(1)application範圍內的參數,存放在servletcontext中,在web.xml中配置如下:xml 代碼
<context-param>
<param-name>context/param</param-name>
<param-value>avalible during application</param-value>
</context-param> (2)servlet範圍內的參數,只能在servlet的init()方法中取得,在web.xml中配置如下:xml 代碼
<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>com.wes.controller.MainServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>avalible in servlet init()</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet> 在servlet中可以通過代碼分別取用:java 代碼
package com.test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class TestServlet extends HttpServlet ...{
public TestServlet() ...{
super();
}
public void init() throws ServletException ...{
System.out.println("下面的兩個參數param1是在servlet中存放的");
System.out.println(this.getInitParameter("param1"));
System.out.println("下面的參數是存放在servletcontext中的");
System.out.println(getServletContext().getInitParameter("context/param"));
} ......餘下全文>>
java webxml
1. 啟動一個WEB項目的時候,容器(如:Tomcat)會去讀它的設定檔web.xml.讀兩個節點: <listener></listener> 和 <context-param></context-param>
2.緊接著,容器建立一個ServletContext(上下文),這個WEB項目所有部分都將共用這個上下文.
3.容器將<context-param></context-param>轉化為索引值對,並交給ServletContext.
4.容器建立<listener></listener>中的類執行個體,即建立監聽.
5.在監聽中會有contextInitialized(ServletContextEvent args)初始化方法,在這個方法中獲得ServletContext = ServletContextEvent.getServletContext();context-param的值 = ServletContext.getInitParameter("context-param的鍵");
6.得到這個context-param的值之後,你就可以做一些操作了.注意,這個時候你的WEB項目還沒有完全啟動完成.這個動作會比所有的Servlet都要早.換句話說,這個時候,你對<context-param>中的索引值做的操作,將在你的WEB項目完全啟動之前被執行.
7.舉例.你可能想在項目啟動之前就開啟資料庫.那麼這裡就可以在<context-param>中設定資料庫的串連方式,在監聽類中初始化資料庫的串連.
8.這個監聽是自己寫的一個