部署描述符文件就像所有xml文件一樣,必須以一個(gè)XML頭開始。這個(gè)頭聲明可以使用的XML版本并給出文件的字符編碼。 DOCYTPE聲明必須立即出現(xiàn)在此頭之后。這個(gè)聲明告訴服務(wù)器適用的servlet規(guī)范的版本(如2.2或2.3)并指定治理此文件其余部分內(nèi)容的語法的DTD(Document Type Definition,文檔類型定義)。 所有部署描述符文件的頂層(根)元素為web-app。請注重,XML元素不像Html,他們是大小寫敏感的。因此,web-App和WEB-APP都是不合法的,web-app必須用小寫。
2 部署描述符文件內(nèi)的元素次序
XML元素不僅是大小寫敏感的,而且它們還對出現(xiàn)在其他元素中的次序敏感。例如,XML頭必須是文件中的第一項(xiàng),DOCTYPE聲明必須是第二項(xiàng),而web-app元素必須是第三項(xiàng)。在web-app元素內(nèi),元素的次序也很重要。服務(wù)器不一定強(qiáng)制要求這種次序,但它們答應(yīng)(實(shí)際上有些服務(wù)器就是這樣做的)完全拒絕執(zhí)行含有次序不正確的元素的Web應(yīng)用。這表示使用非標(biāo)準(zhǔn)元素次序的web.xml文件是不可移植的。 下面的列表給出了所有可直接出現(xiàn)在web-app元素內(nèi)的合法元素所必需的次序。例如,此列表說明servlet元素必須出現(xiàn)在所有servlet-mapping元素之前。請注重,所有這些元素都是可選的。因此,可以省略掉某一元素,但不能把它放于不正確的位置。 l icon icon元素指出IDE和GUI工具用來表示W(wǎng)eb應(yīng)用的一個(gè)和兩個(gè)圖像文件的位置。 l display-name display-name元素提供GUI工具可能會(huì)用來標(biāo)記這個(gè)特定的Web應(yīng)用的一個(gè)名稱。 l description description元素給出與此有關(guān)的說明性文本。 l context-param context-param元素聲明應(yīng)用范圍內(nèi)的初始化參數(shù)。 l filter 過濾器元素將一個(gè)名字與一個(gè)實(shí)現(xiàn)javax.servlet.Filter接口的類相關(guān)聯(lián)。 l filter-mapping 一旦命名了一個(gè)過濾器,就要利用filter-mapping元素把它與一個(gè)或多個(gè)servlet或jsp頁面相關(guān)聯(lián)。 l listener servlet API的版本2.3增加了對事件監(jiān)聽程序的支持,事件監(jiān)聽程序在建立、修改和刪除會(huì)話或servlet環(huán)境時(shí)得到通知。Listener元素指出事件監(jiān)聽程序類。 l servlet 在向servlet或JSP頁面制定初始化參數(shù)或定制URL時(shí),必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項(xiàng)任務(wù)的。 l servlet-mapping 服務(wù)器一般為servlet提供一個(gè)缺省的URL:http://host/webAppPRefix/servlet/ServletName。但是,經(jīng)常會(huì)更改這個(gè)URL,以便servlet可以訪問初始化參數(shù)或更輕易地處理相對URL。在更改缺省URL時(shí),使用servlet-mapping元素。 l session-config 假如某個(gè)會(huì)話在一定時(shí)間內(nèi)未被訪問,服務(wù)器可以拋棄它以節(jié)省內(nèi)存。可通過使用HttpSession的setMaxInactiveInterval方法明確設(shè)置單個(gè)會(huì)話對象的超時(shí)值,或者可利用session-config元素制定缺省超時(shí)值。 l mime-mapping 假如Web應(yīng)用具有想到非凡的文件,希望能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證。 l welcom-file-list welcome-file-list元素指示服務(wù)器在收到引用一個(gè)目錄名而不是文件名的URL時(shí),使用哪個(gè)文件。 l error-page error-page元素使得在返回特定HTTP狀態(tài)代碼時(shí),或者特定類型的異常被拋出時(shí),能夠制定將要顯示的頁面。 l taglib taglib元素對標(biāo)記庫描述符文件(Tag Libraryu Descriptor file)指定別名。此功能使你能夠更改TLD文件的位置,而不用編輯使用這些文件的JSP頁面。 l resource-env-ref resource-env-ref元素聲明與資源相關(guān)的一個(gè)治理對象。 l resource-ref resource-ref元素聲明一個(gè)資源工廠使用的外部資源。 l security-constraint security-constraint元素制定應(yīng)該保護(hù)的URL。它與login-config元素聯(lián)合使用 l login-config 用login-config元素來指定服務(wù)器應(yīng)該怎樣給試圖訪問受保護(hù)頁面的用戶授權(quán)。它與sercurity-constraint元素聯(lián)合使用。 l security-role security-role元素給出安全角色的一個(gè)列表,這些角色將出現(xiàn)在servlet元素內(nèi)的security-role-ref元素的role-name子元素中。分別地聲明角色可使高級IDE處理安全信息更為輕易。 l env-entry env-entry元素聲明Web應(yīng)用的環(huán)境項(xiàng)。 l ejb-ref ejb-ref元素聲明一個(gè)EJB的主目錄的引用。 l ejb-local-ref ejb-local-ref元素聲明一個(gè)EJB的本地主目錄的應(yīng)用。
/** Simple servlet used to illustrate servlet naming * and custom URLs. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * ? 2002 Marty Hall; may be freely used or adapted. */
public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String uri = request.getRequestURI(); out.println(ServletUtilities.headWithTitle("Test Servlet") + "<BODY BGCOLOR="#FDF5E6"> " + "<H2>URI: " + uri + "</H2> " + "</BODY></HTML>"); } }
程序清單5-2 web.xml(說明servlet名稱的摘錄) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
/** Simple servlet used to give error messages to * users who try to access default servlet URLs * (i.e., http://host/webAppPrefix/servlet/ServletName) * in Web applications that have disabled this * behavior. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * ? 2002 Marty Hall; may be freely used or adapted. */
public class SorryServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Invoker Servlet Disabled."; out.println(ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR="#FDF5E6"> " + "<H2>" + title + "</H2> " + "Sorry, access to servlets by means of " + "URLs that begin with " + "http://host/webAppPrefix/servlet/ " + "has been disabled. " + "</BODY></HTML>"); }
/** Simple servlet used to illustrate servlet * initialization parameters. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * ? 2002 Marty Hall; may be freely used or adapted. */
public class InitServlet extends HttpServlet { private String firstName, emailAddress;
程序清單5-13 NotFound.jsp <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD><TITLE>404: Not Found</TITLE></HEAD> <BODY BGCOLOR="#FDF5E6"> <H2>Error!</H2> I'm sorry, but I cannot find a page that matches <%= request.getRequestURI() %> on the system. Maybe you should try one of the following: <UL> <LI>Go to the server's <A HREF="/">home page</A>. <LI>Search for relevant pages.<BR> <FORM ACTION="http://www.Google.com/search"> <CENTER> KeyWords: <INPUT TYPE="TEXT" NAME="q"><BR> <INPUT TYPE="SUBMIT" VALUE="Search"> </CENTER> </FORM> <LI>Admire a random multiple of 404: <%= 404*((int)(1000*Math.random())) %>. <LI>Try a <A TARGET="_blank"> random 404 error message</A>. From the amazing and amusing plinko.net <A > 404 archive</A>. </UL> </BODY></HTML>
程序清單5-14 web.xml(指出HTTP錯(cuò)誤代碼的錯(cuò)誤頁面的摘錄) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
/** Exception used to flag particularly oNerous programmer blunders. Used to illustrate the exception-type web.xml element. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * ? 2002 Marty Hall; may be freely used or adapted. */
public class DumbDeveloperException extends Exception { public DumbDeveloperException() { super("Duh. What was I *thinking*?"); }
public static int dangerousComputation(int n) throws DumbDeveloperException { if (n < 5) { return(n + 10); } else { throw(new DumbDeveloperException()); } } }
程序清單5-16 RiskyPage.jsp <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD><TITLE>Risky JSP Page</TITLE></HEAD> <BODY BGCOLOR="#FDF5E6"> <H2>Risky Calculations</H2> <%@ page import="moreservlets.*" %> <% int n = ((int)(10 * Math.random())); %> <UL> <LI>n: <%= n %> <LI>dangerousComputation(n): <%= DumbDeveloperException.dangerousComputation(n) %> </UL> </BODY></HTML>
程序清單5-17 DDE.jsp <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD><TITLE>Dumb</TITLE></HEAD> <BODY BGCOLOR="#FDF5E6"> <H2>Dumb Developer</H2> We're brain dead. Consider using our competitors. </BODY></HTML>
程序清單5-18 web.xml(為異常指定錯(cuò)誤頁面的摘錄) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">