對於一個J2EE應用的開發者,或者叫java web後臺的開發者來講。常常會和web.xml打交道,偶爾用到幾個標籤不知道啥意思。而後就度娘一下,長此以往雖然大概知道web.xml的基本使用方法,可是沒有一個系統的學習。我就是這樣一我的,今天來系統的學習一遍。(http://docs.oracle.com/cd/E11035_01/wls100/webapp/web_xml.html#wp1070143)html
<?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_2_5.xsd " version="2.5"> </web-app>
<link rel="shortcut icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon" /> <link rel="icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon" />
display-name:The optional display-name
element specifies the Web application display name, a short name that can be displayed by GUI tools.可見意義也不是很大。java
description:The optional description element provides descriptive text about the Web application.web
<context-param> <param-name>param_name</param-name> <param-value>param_value</param-value> </context-param>
在JSP頁面讀取:sql
${initParam.param_name}
在servlet中讀取:json
String param_name=getServletContext().getInitParamter("param_name");
在Filter中讀取:api
String param_name = request.getServletContext().getInitParameter("param_key");
元素 | 選項 | 描述 |
<icon> | 可選 | 指定icon表明GUI的IDE中表明Filter,沒有實際意義 |
<filter-name> | 必選 | 定義過濾器的名字,在部署描述文件的其餘地方進行引用 |
<display-name> | 可選 | 在GUI的IDE中顯示縮略名 |
<description> | 可選 | A text description of the filter. |
<filter-class> | 必選 | 過濾器對應的class |
<init-param> | 可選 | 包含一個鍵值對,做爲過濾器的初始屬性 |
一個簡單的例子:tomcat
<filter> <filter-name>LoginFilter</filter-name> <filter-class>com.xxxx.filter.LogFilter</filter-class> <init-param> <param-name>Site</param-name> <param-value>Hello world</param-value> </init-param> </filter>
在過濾器初始化方法獲取鍵值:安全
public void init(FilterConfig config) throws ServletException { logger.info("Filter init"); // 獲取初始化參數 String site = config.getInitParameter("Site"); // 輸出初始化參數 logger.info("網站名稱: " + site); }
元素 | 選項 | 描述 |
<filter-name> | 必選 | 映射URL或servlet的filter的名字 |
<url-pattern> | 必選或使用<servlet進行映射> | 指定須要過濾的URL模式 |
<servlet-name> | 必選或者使用<url-pattern> | 指定須要過濾的servlet name |
簡要說明:使用<url-pattern>經過匹配URI調用過濾器,使用<servlet-name>,通過改servlet的全部請求都會走過濾器。若是同時配置<url-pattern>和<servlet-name>,只要知足其一都會走過濾器。cookie
一個簡單的例子,全部的請求都會走LoginFilter過濾器:session
<filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern> <!--<servlet-name>helloWorld</servlet-name>--> </filter-mapping>
元素 | 選項 | 描述 |
<icon> | 可選 | 指定icon表明GUI的IDE中表明Filter,沒有實際意義 |
<servlet-name> | 必選 | 定義servlet名字,在部署描述文件其餘地方可引用 |
<display-name> | 可選 | 在GUI的IDE中顯示縮略名,沒實際意義 |
<description> | 可選 | servlet描述信息 |
<servlet-class> | 必選或使用<jsp- file> |
servlet對應的class,需使用徹底限定名稱(包含包名),在<servlet>中只能使用<servlet-class>或<jsp- file>其中之一 |
<jsp-file> | 必選或使用<servlet-class> | 使用相對於應用程序根目錄的全路徑,在<servlet>中只能使用<servlet-class>或<jsp- file>其中之一 |
<init-param> | 可選 | 包含一個鍵值對做爲servertd的初始化參數,每一個鍵值對用<init-param> 分開 |
<load-on-startup> | 可選 | 設置web容器加載servlet的順序,值爲正整數,值越小優先級越高。不指定或者指定的值爲非正整數加載順序隨機。 |
<run-as> | 可選 | 指定運行web程序的標識着,包含兩個子標籤 <description>和<role-name> |
<security-role- ref> |
可選 | 引用定義在<security-role>中的安全角色名稱,角色名稱被硬編碼在<security-role>,角色最終定義在容器對應的配置文件中,好比Tomcat中的tomcat-users.xml。該標籤引用官網的一段說明以下: The security-role-ref element is used when an application uses the HttpServletRequest.isUserInRole(String role) method. The value of the role-name element must be the String used as the parameter to the HttpServletRequest.isUserInRole(String role) method. The role-link must contain the name of one of the security roles defined in the security-role elements. The container uses the mapping of security-role-ref to security-role when determining the return value of the call. (https://docs.oracle.com/cd/E19226-01/820-7627/bncbb/index.html) 我理解的大概意思就是,爲了配合servlet中代碼對角色權限的控制,主要是isUserInRole方法,來決定servlet中的業務處理邏輯。 |
servlet-mapping元素定義了servlet和URL之間的映射
元素 | 選項 | 描述 |
<servlet-name> | 必選 | 須要和URL映射的servlet的名稱,名稱和<servlet>中定義的名稱一致 |
<url-pattern> | 必選 | http://host:port + WebAppName後的部分的URL將會和這定義的URL比較,若是匹配的話就會調用其映射的servlet處理此次請求 |
元素 | 選項 | 描述 |
<description> | 可選 | 安全角色描述文本 |
<role-name> | 必選 | 角色名稱。對於Tomcat和WebLogic,必須是兩個容器中定義的角色,對於Tomcat在配置文件 tomcat-users.xml中有相應角色和用戶的對應。 |
十一、<security-role-ref>
元素 | 選項 | 描述 |
role-link |
必選 | The <role-link> element in the security-role-ref element must match a <role-name> defined in the <security-role>element of the same web.xml deployment descriptor |
role-name |
可選 | 在servlet中調用isUserInRole("tomcat-role"),參數就是該標籤對應的值或者直接role-link標籤對應的值。 |
十二、<security-constraint>
定義對資源集合的訪問權限
元素 | 選項 | 描述 |
<web-resource- collection> |
必選 | 定義web應用程序資源集合 |
<auth-constraint> | 可選 | 定義訪問這個集合資源的權限 |
<user-data- constraint> |
可選 | Defines how the client should communicate with the server.具體參考 user-data-constraint |
1三、 <login-config>
該標籤用於配置驗證方式。
元素 | 選項 | 描述 |
<auth-method> | 可選 | 指定驗證的方法,可能值:
|
<realm-name> | 可選 | The name of the realm that is referenced to authenticate the user credentials |
<form-login- config> |
可選 | Use this element if you configure the <auth-method> to FORM. 若是使用form表單進行驗證的話還要配置form表單對應的文件,以及驗證錯誤的跳轉頁面,具體參考:form-login-config |
針對以上八、九、十、十一、十二、13舉個例子:
<servlet> <servlet-name>ApiServlet</servlet-name> <servlet-class>com.xxxx.servlet.ApiServlet</servlet-class> <security-role-ref> <role-name>tomcat-role</role-name> <role-link>tomcat</role-link> </security-role-ref> </servlet> <servlet-mapping> <servlet-name>ApiServlet</servlet-name> <url-pattern>/api</url-pattern> </servlet-mapping> <security-constraint> <web-resource-collection> <web-resource-name>api</web-resource-name> <url-pattern>/api</url-pattern> <http-method>PUT</http-method> <http-method>DELETE</http-method> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>tomcat</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>My Hello World Application</realm-name> </login-config> <security-role> <role-name>tomcat</role-name> </security-role>
tomcat對應的tomcat-users.xml設置:
<role rolename="tomcat"/> <!--<role rolename="role1"/>--> <user username="tomcat" password="tomcat123" roles="tomcat"/> <!--<user username="both" password="tomcat123" roles="tomcat,role1"/>--> <!-- <user username="role1" password="<must-be-changed>" roles="role1"/>-->
ApiServlet中部分代碼:
@Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RandomPwd randomPwd = RandomStringGenerator.getRandomString(); Cookie cookie = new Cookie("tes123", "456"); cookie.setMaxAge(60); response.addCookie(cookie); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); PrintWriter out = response.getWriter(); out.println(JSON.toJSONString(randomPwd)); if (request.isUserInRole("tomcat")) { logger.info("Have tomcat role!"); } else { logger.info("Don't have tomcat role!"); } String param_name = getServletContext().getInitParameter("testkey"); logger.info(param_name); }
加上以上設置,只要訪問/api接口就須要BASIC認證,驗證經過了才能訪問接口。
定義對外部資源的引用
元素 | 選項 | 描述 |
<description> | 可選 | 簡單的文本描述 |
<res-ref-name> | 必選 | 資源在JNDI樹中的名字,servletz在web程序中使用這個名字去尋找這個資源的引用 |
<res-type> | 必選 | 資源在Java中定義的類型,必須使用徹底限定名稱。例如:<res-type>javax.sql.DataSource</res-type> |
<res-auth> | 必選 | 用於控制資源的安全性。 If set to |
<res-sharing-scope> | 可選 | 指定資源是否能夠被共享,可選的值:
|
定義一個程序監聽器
元素 | 選項 | 描述 |
<listener-class> | 可選 | 響應web應用程序的的class |
注意:
<listener>
element. The event declaration defines the event listener class that is invoked when the event occurs. The <listener>
element must directly follow the <filter>
and <filter-mapping>
elements and directly precede the <servlet>
element. You can specify more than one event listener class for each type of event. WebLogic Server invokes the event listener classes in the order that they appear in the deployment descriptor (except for shutdown events, which are invoked in the reverse order). For example:<listener> <listener-class>myApp.MyContextListenerClass</listener-class> </listener> <listener> <listener-class>myApp.MySessionAttributeListenerClass</listener-class> </listener>
大概意思是,listener-class必須跟在<filter>後面,<servlet>前面。
經常使用的幾個監聽器:
javax.servlet.http.HttpSessionEvent
provides access to the HTTP session object
javax.servlet.ServletContextEvent
provides access to the servlet context object.
javax.servlet.ServletContextAttributeEvent
provides access to servlet context and its attributes
javax.servlet.http.HttpSessionBindingEvent
provides access to an HTTP session and its attributes
Servlet Context Event Listener Class Example package myApp; import javax.servlet.http.*; public final class MyContextListenerClass implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { /* This method is called when the servlet context is initialized(when the Web application is deployed). You can initialize servlet context related data here. */ } public void contextDestroyed(ServletContextEvent event) { /* This method is invoked when the Servlet Context (the Web application) is undeployed or WebLogic Server shuts down. */ } }
參考連接:http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/app_events.html#178122
可選的welcome-file-list包含一個有順序的welcome-file列表,當request請求的是一個目錄的時候,該列表的第一個文件會被查找並返回,若是沒找到就按列表順序一值往下找。
元素 | 選項 | 描述 |
<welcome-file> | 可選 | 被指定歡迎文件的名稱,例如:index.html |
一個例子:
<welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> </welcome-file-list>
元素 | 選項 | 描述 |
<session-timeout> | 可選 | 指定應用程序中session的有效時間,單位分鐘。該值的設置會覆蓋Tomcat或weblogic中的配置文件的設置, Default value: -2 Maximum value: Integer.MAX_VALUE ÷ 60
|
元素 | 選項 | 描述 |
<description> | 可選 | 設定的說明 |
<display-name> | 可選 | 設定名稱 |
<url-pattern> | 必選 | 設定值所影響的範圍,如: /CH2 或 /*.jsp |
<el-ignored> | 可選 | 若爲 true,表示不支持 EL 語法 |
<scripting-invalid> | 可選 | 若爲 true,表示不支持 <% scripting %>語法 |
<page-encoding> | 可選 | 設定 JSP 網頁的編碼 |
<include-prelude> | 可選 | 設置 JSP 網頁的擡頭,擴展名爲 .jspf |
<include-coda> | 可選 | 設置 JSP 網頁的結尾,擴展名爲 .jspf |
trim-directive-whitespaces> | 可選 | sp中會常用到使用jsp標籤和jstl的標籤,好比<%@ page ..%>, <%@ taglib ...%>, <c:forEach....%>, 尤爲是循環標籤,在jsp最終輸出的html中會產生大量的空行,使得性能下降。 |
一個簡單例子以下:
<jsp-config> <taglib> <taglib-uri>Taglib</taglib-uri> <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location> </taglib> <jsp-property-group> <description>Special property group for JSP Configuration JSP example.</description> <display-name>JSPConfiguration</display-name> <url-pattern>/jsp/* </url-pattern>
<trim-directive-whitespaces>true </trim-directive-whitespaces> <el-ignored>true</el-ignored> <page-encoding>GB2312</page-encoding> <scripting-invalid>true</scripting-invalid> <include-prelude>/include/prelude.jspf</include-prelude> <include-coda>/include/coda.jspf</include-coda> </jsp-property-group> </jsp-config>