<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    即使世界明天毀滅,我也要在今天種下我的葡萄樹。
    posts - 112, comments - 14, trackbacks - 0, articles - 11

    Tomcat中用web.xml控制Web應用詳解(1)

    Posted on 2006-07-20 14:17 閱讀(248) 評論(0)  編輯  收藏 所屬分類: XML Design

    1 定義頭和根元素

    部署描述符文件就像所有XML文件一樣,必須以一個XML頭開始。這個頭聲明可以使用的XML版本并給出文件的字符編碼。
    DOCYTPE聲明必須立即出現(xiàn)在此頭之后。這個聲明告訴服務器適用的servlet規(guī)范的版本(如2.2或2.3)并指定管理此文件其余部分內容的語法的DTD(Document Type Definition,文檔類型定義)。
    所有部署描述符文件的頂層(根)元素為web-app。請注意,XML元素不像HTML,他們是大小寫敏感的。因此,web-App和WEB-APP都是不合法的,web-app必須用小寫。

    2 部署描述符文件內的元素次序

    XML元素不僅是大小寫敏感的,而且它們還對出現(xiàn)在其他元素中的次序敏感。例如,XML頭必須是文件中的第一項,DOCTYPE聲明必須是第二項,而web-app元素必須是第三項。在web-app元素內,元素的次序也很重要。服務器不一定強制要求這種次序,但它們允許(實際上有些服務器就是這樣做的)完全拒絕執(zhí)行含有次序不正確的元素的Web應用。這表示使用非標準元素次序的web.xml文件是不可移植的。
    下面的列表給出了所有可直接出現(xiàn)在web-app元素內的合法元素所必需的次序。例如,此列表說明servlet元素必須出現(xiàn)在所有servlet-mapping元素之前。請注意,所有這些元素都是可選的。因此,可以省略掉某一元素,但不能把它放于不正確的位置。
    l icon icon元素指出IDE和GUI工具用來表示W(wǎng)eb應用的一個和兩個圖像文件的位置。
    l display-name display-name元素提供GUI工具可能會用來標記這個特定的Web應用的一個名稱。
    l description description元素給出與此有關的說明性文本。
    l context-param context-param元素聲明應用范圍內的初始化參數(shù)。
    l filter 過濾器元素將一個名字與一個實現(xiàn)javax.servlet.Filter接口的類相關聯(lián)。
    l filter-mapping 一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯(lián)。
    l listener servlet API的版本2.3增加了對事件監(jiān)聽程序的支持,事件監(jiān)聽程序在建立、修改和刪除會話或servlet環(huán)境時得到通知。Listener元素指出事件監(jiān)聽程序類。
    l servlet 在向servlet或JSP頁面制定初始化參數(shù)或定制URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務的。
    l servlet-mapping 服務器一般為servlet提供一個缺省的URL:
    http://host/webAppPrefix/servlet/ServletName 。但是,常常會更改這個URL,以便servlet可以訪問初始化參數(shù)或更容易地處理相對URL。在更改缺省URL時,使用servlet-mapping元素。
    l session-config 如果某個會話在一定時間內未被訪問,服務器可以拋棄它以節(jié)省內存。可通過使用HttpSession的setMaxInactiveInterval方法明確設置單個會話對象的超時值,或者可利用session-config元素制定缺省超時值。
    l mime-mapping 如果Web應用具有想到特殊的文件,希望能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證。
    l welcom-file-list welcome-file-list元素指示服務器在收到引用一個目錄名而不是文件名的URL時,使用哪個文件。
    l error-page error-page元素使得在返回特定HTTP狀態(tài)代碼時,或者特定類型的異常被拋出時,能夠制定將要顯示的頁面。
    l taglib taglib元素對標記庫描述符文件(Tag Libraryu Descriptor file)指定別名。此功能使你能夠更改TLD文件的位置,而不用編輯使用這些文件的JSP頁面。
    l resource-env-ref resource-env-ref元素聲明與資源相關的一個管理對象。
    l resource-ref resource-ref元素聲明一個資源工廠使用的外部資源。
    l security-constraint security-constraint元素制定應該保護的URL。它與login-config元素聯(lián)合使用
    l login-config 用login-config元素來指定服務器應該怎樣給試圖訪問受保護頁面的用戶授權。它與sercurity-constraint元素聯(lián)合使用。
    l security-role security-role元素給出安全角色的一個列表,這些角色將出現(xiàn)在servlet元素內的security-role-ref元素的role-name子元素中。分別地聲明角色可使高級IDE處理安全信息更為容易。
    l env-entry env-entry元素聲明Web應用的環(huán)境項。
    l ejb-ref ejb-ref元素聲明一個EJB的主目錄的引用。
    l ejb-local-ref ejb-local-ref元素聲明一個EJB的本地主目錄的應用。

    3 分配名稱和定制的UL

    在web.xml中完成的一個最常見的任務是對servlet或JSP頁面給出名稱和定制的URL。用servlet元素分配名稱,使用servlet-mapping元素將定制的URL與剛分配的名稱相關聯(lián)。
    3.1 分配名稱
    為了提供初始化參數(shù),對servlet或JSP頁面定義一個定制URL或分配一個安全角色,必須首先給servlet或JSP頁面一個名稱。可通過servlet元素分配一個名稱。最常見的格式包括servlet-name和servlet-class子元素(在web-app元素內),如下所示:
    <servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>moreservlets.TestServlet</servlet-class>
    </servlet>

    這表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已經(jīng)得到了注冊名Test。給servlet一個名稱具有兩個主要的含義。首先,初始化參數(shù)、定制的URL模式以及其他定制通過此注冊名而不是類名引用此servlet。其次,可在URL而不是類名中使用此名稱。因此,利用剛才給出的定義,URL http://host/webAppPrefix/servlet/Test 可用于 http://host/webAppPrefix/servlet/moreservlets.TestServlet 的場所。
    請記住:XML元素不僅是大小寫敏感的,而且定義它們的次序也很重要。例如,web-app元素內所有servlet元素必須位于所有servlet-mapping元素(下一小節(jié)介紹)之前,而且還要位于5.6節(jié)和5.11節(jié)討論的與過濾器或文檔相關的元素(如果有的話)之前。類似地,servlet的servlet-name子元素也必須出現(xiàn)在servlet-class之前。5.2節(jié)"部署描述符文件內的元素次序"將詳細介紹這種必需的次序。
    例如,程序清單5-1給出了一個名為TestServlet的簡單servlet,它駐留在moreservlets程序包中。因為此servlet是扎根在一個名為deployDemo的目錄中的Web應用的組成部分,所以TestServlet.class放在deployDemo/WEB-INF/classes/moreservlets中。程序清單5-2給出將放置在deployDemo/WEB-INF/內的web.xml文件的一部分。此web.xml文件使用servlet-name和servlet-class元素將名稱Test與TestServlet.class相關聯(lián)。圖5-1和圖5-2分別顯示利用缺省URL和注冊名調用TestServlet時的結果。

    程序清單5-1 TestServlet.java
    package moreservlets;

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    /** 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/ .
    * &copy; 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\">\n" +
    "<H2>URI: " + uri + "</H2>\n" +
    "</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 ">

    <web-app>
    <!-- … -->
    <servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>moreservlets.TestServlet</servlet-class>
    </servlet>
    <!-- … -->
    </web-app>

    3.2 定義定制的URL
    大多數(shù)服務器具有一個缺省的serlvet URL:
    http://host/webAppPrefix/servlet/packageName.ServletName 。雖然在開發(fā)中使用這個URL很方便,但是我們常常會希望另一個URL用于部署。例如,可能會需要一個出現(xiàn)在Web應用頂層的URL(如, http://host/webAppPrefix/Anyname ),并且在此URL中沒有servlet項。位于頂層的URL簡化了相對URL的使用。此外,對許多開發(fā)人員來說,頂層URL看上去比更長更麻煩的缺省URL更簡短。
    事實上,有時需要使用定制的URL。比如,你可能想關閉缺省URL映射,以便更好地強制實施安全限制或防止用戶意外地訪問無初始化參數(shù)的servlet。如果你禁止了缺省的URL,那么你怎樣訪問servlet呢?這時只有使用定制的URL了。
    為了分配一個定制的URL,可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet-name元素提供了一個任意名稱,可利用此名稱引用相應的servlet;url-pattern描述了相對于Web應用的根目錄的URL。url-pattern元素的值必須以斜杠(/)起始。
    下面給出一個簡單的web.xml摘錄,它允許使用URL
    http://host/webAppPrefix/UrlTest 而不是 http://host/webAppPrefix/servlet/Test
    http://host/webAppPrefix/servlet/moreservlets.TestServlet 。請注意,仍然需要XML頭、DOCTYPE聲明以及web-app封閉元素。此外,可回憶一下,XML元素出現(xiàn)地次序不是隨意的。特別是,需要把所有servlet元素放在所有servlet-mapping元素之前。
    <servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>moreservlets.TestServlet</servlet-class>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name>Test</servlet-name>
    <url-pattern>/UrlTest</url-pattern>
    </servlet-mapping>
    URL模式還可以包含通配符。例如,下面的小程序指示服務器發(fā)送所有以Web應用的URL前綴開始,以..asp結束的請求到名為BashMS的servlet。
    <servlet>
    <servlet-name>BashMS</servlet-name>
    <servlet-class>msUtils.ASPTranslator</servlet-class>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name>BashMS</servlet-name>
    <url-pattern>/*.asp</url-pattern>
    </servlet-mapping>
    3.3 命名JSP頁面
    因為JSP頁面要轉換成sevlet,自然希望就像命名servlet一樣命名JSP頁面。畢竟,JSP頁面可能會從初始化參數(shù)、安全設置或定制的URL中受益,正如普通的serlvet那樣。雖然JSP頁面的后臺實際上是servlet這句話是正確的,但存在一個關鍵的猜疑:即,你不知道JSP頁面的實際類名(因為系統(tǒng)自己挑選這個名字)。因此,為了命名JSP頁面,可將jsp-file元素替換為servlet-calss元素,如下所示:
    <servlet>
    <servlet-name>Test</servlet-name>
    <jsp-file>/TestPage.jsp</jsp-file>
    </servlet>
    命名JSP頁面的原因與命名servlet的原因完全相同:即為了提供一個與定制設置(如,初始化參數(shù)和安全設置)一起使用的名稱,并且,以便能更改激活JSP頁面的URL(比方說,以便多個URL通過相同頁面得以處理,或者從URL中去掉.jsp擴展名)。但是,在設置初始化參數(shù)時,應該注意,JSP頁面是利用jspInit方法,而不是init方法讀取初始化參數(shù)的。
    例如,程序清單5-3給出一個名為TestPage.jsp的簡單JSP頁面,它的工作只是打印出用來激活它的URL的本地部分。TestPage.jsp放置在deployDemo應用的頂層。程序清單5-4給出了用來分配一個注冊名PageName,然后將此注冊名與
    http://host/webAppPrefix/UrlTest2/anything 形式的URL相關聯(lián)的web.xml文件(即,deployDemo/WEB-INF/web.xml)的一部分。

    程序清單5-3 TestPage.jsp
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE>
    JSP Test Page
    </TITLE>
    </HEAD>
    <BODY BGCOLOR="#FDF5E6">
    <H2>URI: <%= request.getRequestURI() %></H2>
    </BODY>
    </HTML>


    程序清單5-4 web.xml(說明JSP頁命名的摘錄)
    <?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 ">

    <web-app>
    <!-- ... -->
    <servlet>
    <servlet-name>PageName</servlet-name>
    <jsp-file>/TestPage.jsp</jsp-file>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name> PageName </servlet-name>
    <url-pattern>/UrlTest2/*</url-pattern>
    </servlet-mapping>
    <!-- ... -->
    </web-app>


    4 禁止激活器servlet

    對servlet或JSP頁面建立定制URL的一個原因是,這樣做可以注冊從init(servlet)或jspInit(JSP頁面)方法中讀取得初始化參數(shù)。但是,初始化參數(shù)只在是利用定制URL模式或注冊名訪問servlet或JSP頁面時可以使用,用缺省URL http://host/webAppPrefix/servlet/ServletName 訪問時不能使用。因此,你可能會希望關閉缺省URL,這樣就不會有人意外地調用初始化servlet了。這個過程有時稱為禁止激活器servlet,因為多數(shù)服務器具有一個用缺省的servlet URL注冊的標準servlet,并激活缺省的URL應用的實際servlet。
    有兩種禁止此缺省URL的主要方法:
    l 在每個Web應用中重新映射/servlet/模式。
    l 全局關閉激活器servlet。
    重要的是應該注意到,雖然重新映射每個Web應用中的/servlet/模式比徹底禁止激活servlet所做的工作更多,但重新映射可以用一種完全可移植的方式來完成。相反,全局禁止激活器servlet完全是針對具體機器的,事實上有的服務器(如ServletExec)沒有這樣的選擇。下面的討論對每個Web應用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet的詳細內容。
    4.1 重新映射/servlet/URL模式
    在一個特定的Web應用中禁止以
    http://host/webAppPrefix/servlet/ 開始的URL的處理非常簡單。所需做的事情就是建立一個錯誤消息servlet,并使用前一節(jié)討論的url-pattern元素將所有匹配請求轉向該servlet。只要簡單地使用:
    <url-pattern>/servlet/*</url-pattern>
    作為servlet-mapping元素中的模式即可。
    例如,程序清單5-5給出了將SorryServlet servlet(程序清單5-6)與所有以
    http://host/webAppPrefix/servlet/ 開頭的URL相關聯(lián)的部署描述符文件的一部分。

    程序清單5-5 web.xml(說明JSP頁命名的摘錄)
    <?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 ">

    <web-app>
    <!-- ... -->
    <servlet>
    <servlet-name>Sorry</servlet-name>
    <servlet-class>moreservlets.SorryServlet</servlet-class>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name> Sorry </servlet-name>
    <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
    <!-- ... -->
    </web-app>


    程序清單5-6 SorryServlet.java
    package moreservlets;

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    /** 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/ .
    * &copy; 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\">\n" +
    "<H2>" + title + "</H2>\n" +
    "Sorry, access to servlets by means of\n" +
    "URLs that begin with\n" +
    "
    http://host/webAppPrefix/servlet/\n " +
    "has been disabled.\n" +
    "</BODY></HTML>");
    }

    public void doPost(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    doGet(request, response);
    }
    }


    4.2 全局禁止激活器:Tomcat
    Tomcat 4中用來關閉缺省URL的方法與Tomcat 3中所用的很不相同。下面介紹這兩種方法:
    1.禁止激活器: Tomcat 4
    Tomcat 4用與前面相同的方法關閉激活器servlet,即利用web.xml中的url-mapping元素進行關閉。不同之處在于Tomcat使用了放在install_dir/conf中的一個服務器專用的全局web.xml文件,而前面使用的是存放在每個Web應用的WEB-INF目錄中的標準web.xml文件。
    因此,為了在Tomcat 4中關閉激活器servlet,只需在install_dir/conf/web.xml中簡單地注釋出/servlet/* URL映射項即可,如下所示:
    <!--
    <servlet-mapping>
    <servlet-name>invoker</servlet-name>
    <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
    -->
    再次提醒,應該注意這個項是位于存放在install_dir/conf的Tomcat專用的web.xml文件中的,此文件不是存放在每個Web應用的WEB-INF目錄中的標準web.xml。
    2.禁止激活器:Tomcat3
    在Apache Tomcat的版本3中,通過在install_dir/conf/server.xml中注釋出InvokerInterceptor項全局禁止缺省servlet URL。例如,下面是禁止使用缺省servlet URL的server.xml文件的一部分。
    <!--
    <RequsetInterceptor
    className="org.apache.tomcat.request.InvokerInterceptor"
    debug="0" prefix="/servlet/" />
    -->

    5 初始化和預裝載servlet與JSP頁面

    這里討論控制servlet和JSP頁面的啟動行為的方法。特別是,說明了怎樣分配初始化參數(shù)以及怎樣更改服務器生存期中裝載servlet和JSP頁面的時刻。
    5.1 分配servlet初始化參數(shù)
    利用init-param元素向servlet提供初始化參數(shù),init-param元素具有param-name和param-value子元素。例如,在下面的例子中,如果initServlet servlet是利用它的注冊名(InitTest)訪問的,它將能夠從其方法中調用getServletConfig().getInitParameter("param1")獲得"Value 1",調用getServletConfig().getInitParameter("param2")獲得"2"。
    <servlet>
    <servlet-name>InitTest</servlet-name>
    <servlet-class>moreservlets.InitServlet</servlet-class>
    <init-param>
    <param-name>param1</param-name>
    <param-value>value1</param-value>
    </init-param>
    <init-param>
    <param-name>param2</param-name>
    <param-value>2</param-value>
    </init-param>
    </servlet>
    在涉及初始化參數(shù)時,有幾點需要注意:
    l 返回值。GetInitParameter的返回值總是一個String。因此,在前一個例子中,可對param2使用Integer.parseInt獲得一個int。
    l JSP中的初始化。JSP頁面使用jspInit而不是init。JSP頁面還需要使用jsp-file元素代替servlet-class。
    l 缺省URL。初始化參數(shù)只在通過它們的注冊名或與它們注冊名相關的定制URL模式訪問Servlet時可以使用。因此,在這個例子中,param1和param2初始化參數(shù)將能夠在使用URL
    http://host/webAppPrefix/servlet/InitTest 時可用,但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet 時不能使用。
    例如,程序清單5-7給出一個名為InitServlet的簡單servlet,它使用init方法設置firstName和emailAddress字段。程序清單5-8給出分配名稱InitTest給servlet的web.xml文件。
    程序清單5-7 InitServlet.java
    package moreservlets;

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    /** 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/ .
    * &copy; 2002 Marty Hall; may be freely used or adapted.
    */

    public class InitServlet extends HttpServlet {
    private String firstName, emailAddress;

    public void init() {
    ServletConfig config = getServletConfig();
    firstName = config.getInitParameter("firstName");
    emailAddress = config.getInitParameter("emailAddress");
    }

    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("Init Servlet") +
    "<BODY BGCOLOR=\"#FDF5E6\">\n" +
    "<H2>Init Parameters:</H2>\n" +
    "<UL>\n" +
    "<LI>First name: " + firstName + "\n" +
    "<LI>Email address: " + emailAddress + "\n" +
    "</UL>\n" +
    "</BODY></HTML>");
    }
    }


    程序清單5-8 web.xml(說明初始化參數(shù)的摘錄)
    <?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 ">

    <web-app>
    <!-- ... -->
    <servlet>
    <servlet-name>InitTest</servlet-name>
    <servlet-class>moreservlets.InitServlet</servlet-class>
    <init-param>
    <param-name>firstName</param-name>
    <param-value>Larry</param-value>
    </init-param>
    <init-param>
    <param-name>emailAddress</param-name>
    <param-value>Ellison@Microsoft.com</param-value>
    </init-param>
    </servlet>
    <!-- ... -->
    </web-app>

    5.2 分配JSP初始化參數(shù)
    給JSP頁面提供初始化參數(shù)在三個方面不同于給servlet提供初始化參數(shù)。
    1)使用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文件的servlet元素如下所示:
    <servlet>
    <servlet-name>PageName</servlet-name>
    <jsp-file>/RealPage.jsp</jsp-file>
    <init-param>
    <param-name>...</param-name>
    <param-value>...</param-value>
    </init-param>
    ...
    </servlet>
    2)幾乎總是分配一個明確的URL模式。對servlet,一般相應地使用以
    http://host/webAppPrefix/servlet/ 開始的缺省URL。只需記住,使用注冊名而不是原名稱即可。這對于JSP頁面在技術上也是合法的。例如,在上面給出的例子中,可用URL http://host/webAppPrefix/servlet/PageName 訪問RealPage.jsp的對初始化參數(shù)具有訪問權的版本。但在用于JSP頁面時,許多用戶似乎不喜歡應用常規(guī)的servlet的URL。此外,如果JSP頁面位于服務器為其提供了目錄清單的目錄中(如,一個既沒有index.html也沒有index.jsp文件的目錄),則用戶可能會連接到此JSP頁面,單擊它,從而意外地激活未初始化的頁面。因此,好的辦法是使用url-pattern(5.3節(jié))將JSP頁面的原URL與注冊的servlet名相關聯(lián)。這樣,客戶機可使用JSP頁面的普通名稱,但仍然激活定制的版本。例如,給定來自項目1的servlet定義,可使用下面的servlet-mapping定義:
    <servlet-mapping>
    <servlet-name>PageName</servlet-name>
    <url-pattern>/RealPage.jsp</url-pattern>
    </servlet-mapping>
    3)JSP頁使用jspInit而不是init。自動從JSP頁面建立的servlet或許已經(jīng)使用了inti方法。因此,使用JSP聲明提供一個init方法是不合法的,必須制定jspInit方法。
    為了說明初始化JSP頁面的過程,程序清單5-9給出了一個名為InitPage.jsp的JSP頁面,它包含一個jspInit方法且放置于deployDemo Web應用層次結構的頂層。一般,
    http://host/deployDemo/InitPage.jsp 形式的URL將激活此頁面的不具有初始化參數(shù)訪問權的版本,從而將對firstName和emailAddress變量顯示null。但是,web.xml文件(程序清單5-10)分配了一個注冊名,然后將該注冊名與URL模式/InitPage.jsp相關聯(lián)。

    程序清單5-9 InitPage.jsp
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD><TITLE>JSP Init Test</TITLE></HEAD>
    <BODY BGCOLOR="#FDF5E6">
    <H2>Init Parameters:</H2>
    <UL>
    <LI>First name: <%= firstName %>
    <LI>Email address: <%= emailAddress %>
    </UL>
    </BODY></HTML>
    <%!
    private String firstName, emailAddress;

    public void jspInit() {
    ServletConfig config = getServletConfig();
    firstName = config.getInitParameter("firstName");
    emailAddress = config.getInitParameter("emailAddress");
    }
    %>


    程序清單5-10 web.xml(說明JSP頁面的init參數(shù)的摘錄)
    <?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 ">

    <web-app>
    <!-- ... -->
    <servlet>
    <servlet-name>InitPage</servlet-name>
    <jsp-file>/InitPage.jsp</jsp-file>
    <init-param>
    <param-name>firstName</param-name>
    <param-value>Bill</param-value>
    </init-param>
    <init-param>
    <param-name>emailAddress</param-name>
    <param-value>gates@oracle.com</param-value>
    </init-param>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name> InitPage</servlet-name>
    <url-pattern>/InitPage.jsp</url-pattern>
    </servlet-mapping>
    <!-- ... -->
    </web-app>


    5.3 提供應用范圍內的初始化參數(shù)
    一般,對單個地servlet或JSP頁面分配初始化參數(shù)。指定的servlet或JSP頁面利用ServletConfig的getInitParameter方法讀取這些參數(shù)。但是,在某些情形下,希望提供可由任意servlet或JSP頁面借助ServletContext的getInitParameter方法讀取的系統(tǒng)范圍內的初始化參數(shù)。
    可利用context-param元素聲明這些系統(tǒng)范圍內的初始化值。context-param元素應該包含param-name、param-value以及可選的description子元素,如下所示:
    <context-param>
    <param-name>support-email</param-name>
    <param-value>blackhole@mycompany.com</param-value>
    </context-param>
    可回憶一下,為了保證可移植性,web.xml內的元素必須以正確的次序聲明。但這里應該注意,context-param元素必須出現(xiàn)任意與文檔有關的元素(icon、display-name或description)之后及filter、filter-mapping、listener或servlet元素之前。
    5.4 在服務器啟動時裝載servlet
    假如servlet或JSP頁面有一個要花很長時間執(zhí)行的init(servlet)或jspInit(JSP)方法。例如,假如init或jspInit方法從某個數(shù)據(jù)庫或ResourceBundle查找產量。這種情況下,在第一個客戶機請求時裝載servlet的缺省行為將對第一個客戶機產生較長時間的延遲。因此,可利用servlet的load-on-startup元素規(guī)定服務器在第一次啟動時裝載servlet。下面是一個例子。
    <servlet>
    <servlet-name> … </servlet-name>
    <servlet-class> … </servlet-class> <!-- Or jsp-file -->
    <load-on-startup/>
    </servlet>
    可以為此元素體提供一個整數(shù)而不是使用一個空的load-on-startup。想法是服務器應該在裝載較大數(shù)目的servlet或JSP頁面之前裝載較少數(shù)目的servlet或JSP頁面。例如,下面的servlet項(放置在Web應用的WEB-INF目錄下的web.xml文件中的web-app元素內)將指示服務器首先裝載和初始化SearchServlet,然后裝載和初始化由位于Web應用的result目錄中的index.jsp文件產生的servlet。
    <servlet>
    <servlet-name>Search</servlet-name>
    <servlet-class>myPackage.SearchServlet</servlet-class> <!-- Or jsp-file -->
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
    <servlet-name>Results</servlet-name>
    <servlet-class>/results/index.jsp</servlet-class> <!-- Or jsp-file -->
    <load-on-startup>2</load-on-startup>
    </servlet>

    6 聲明過濾器

    servlet版本2.3引入了過濾器的概念。雖然所有支持servlet API版本2.3的服務器都支持過濾器,但為了使用與過濾器有關的元素,必須在web.xml中使用版本2.3的DTD。
    過濾器可截取和修改進入一個servlet或JSP頁面的請求或從一個servlet或JSP頁面發(fā)出的相應。在執(zhí)行一個servlet或JSP頁面之前,必須執(zhí)行第一個相關的過濾器的doFilter方法。在該過濾器對其FilterChain對象調用doFilter時,執(zhí)行鏈中的下一個過濾器。如果沒有其他過濾器,servlet或JSP頁面被執(zhí)行。過濾器具有對到來的ServletRequest對象的全部訪問權,因此,它們可以查看客戶機名、查找到來的cookie等。為了訪問servlet或JSP頁面的輸出,過濾器可將響應對象包裹在一個替身對象(stand-in object)中,比方說把輸出累加到一個緩沖區(qū)。在調用FilterChain對象的doFilter方法之后,過濾器可檢查緩沖區(qū),如有必要,就對它進行修改,然后傳送到客戶機。
    例如,程序清單5-11帝國難以了一個簡單的過濾器,只要訪問相關的servlet或JSP頁面,它就截取請求并在標準輸出上打印一個報告(開發(fā)過程中在桌面系統(tǒng)上運行時,大多數(shù)服務器都可以使用這個過濾器)。

    程序清單5-11 ReportFilter.java
    package moreservlets;

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;

    /** Simple filter that prints a report on the standard output
    * whenever the associated servlet or JSP page is accessed.
    * <P>
    * Taken from More Servlets and JavaServer Pages
    * from Prentice Hall and Sun Microsystems Press,
    *
    http://www.moreservlets.com/ .
    * &copy; 2002 Marty Hall; may be freely used or adapted.
    */

    public class ReportFilter implements Filter {
    public void doFilter(ServletRequest request,
    ServletResponse response,
    FilterChain chain)
    throws ServletException, IOException {
    HttpServletRequest req = (HttpServletRequest)request;
    System.out.println(req.getRemoteHost() +
    " tried to access " +
    req.getRequestURL() +
    " on " + new Date() + ".");
    chain.doFilter(request,response);
    }

    public void init(FilterConfig config)
    throws ServletException {
    }

    public void destroy() {}
    }

    一旦建立了一個過濾器,可以在web.xml中利用filter元素以及filter-name(任意名稱)、file-class(完全限定的類名)和(可選的)init-params子元素聲明它。請注意,元素在web.xml的web-app元素中出現(xiàn)的次序不是任意的;允許服務器(但不是必需的)強制所需的次序,并且實際中有些服務器也是這樣做的。但這里要注意,所有filter元素必須出現(xiàn)在任意filter-mapping元素之前,filter-mapping元素又必須出現(xiàn)在所有servlet或servlet-mapping元素之前。
    例如,給定上述的ReportFilter類,可在web.xml中作出下面的filter聲明。它把名稱Reporter與實際的類ReportFilter(位于moreservlets程序包中)相關聯(lián)。
    <filter>
    <filter-name>Reporter</filter-name>
    <filter-class>moresevlets.ReportFilter</filter-class>
    </filter>
    一旦命名了一個過濾器,可利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯(lián)。關于此項工作有兩種選擇。
    首先,可使用filter-name和servlet-name子元素把此過濾器與一個特定的servlet名(此servlet名必須稍后在相同的web.xml文件中使用servlet元素聲明)關聯(lián)。例如,下面的程序片斷指示系統(tǒng)只要利用一個定制的URL訪問名為SomeServletName的servlet或JSP頁面,就運行名為Reporter的過濾器。
    <filter-mapping>
    <filter-name>Reporter</filter-name>
    <servlet-name>SomeServletName</servlet-name>
    </filter-mapping>
    其次,可利用filter-name和url-pattern子元素將過濾器與一組servlet、JSP頁面或靜態(tài)內容相關聯(lián)。例如,相面的程序片段指示系統(tǒng)只要訪問Web應用中的任意URL,就運行名為Reporter的過濾器。
    <filter-mapping>
    <filter-name>Reporter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    例如,程序清單5-12給出了將ReportFilter過濾器與名為PageName的servlet相關聯(lián)的web.xml文件的一部分。名字PageName依次又與一個名為TestPage.jsp的JSP頁面以及以模式
    http://host/webAppPrefix/UrlTest2/ 開頭的URL相關聯(lián)。TestPage.jsp的源代碼已經(jīng)JSP頁面命名的談論在前面的3節(jié)"分配名稱和定制的URL"中給出。事實上,程序清單5-12中的servlet和servlet-name項從該節(jié)原封不動地拿過來的。給定這些web.xml項,可看到下面的標準輸出形式的調試報告(換行是為了容易閱讀)。
    audit.irs.gov tried to access
    http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html
    on Tue Dec 25 13:12:29 EDT 2001.

    程序清單5-12 Web.xml(說明filter用法的摘錄)
    <?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 ">

    <web-app>
    <filter>
    <filter-name>Reporter</filter-name>
    <filter-class>moresevlets.ReportFilter</filter-class>
    </filter>
    <!-- ... -->
    <filter-mapping>
    <filter-name>Reporter</filter-name>
    <servlet-name>PageName</servlet-name>
    </filter-mapping>
    <!-- ... -->
    <servlet>
    <servlet-name>PageName</servlet-name>
    <jsp-file>/RealPage.jsp</jsp-file>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name> PageName </servlet-name>
    <url-pattern>/UrlTest2/*</url-pattern>
    </servlet-mapping>
    <!-- ... -->
    </web-app>

    主站蜘蛛池模板: 在线观看的免费网站无遮挡| 视频一区二区三区免费观看| 最好免费观看韩国+日本| 亚洲AV综合色区无码一区爱AV| 免费看黄视频网站| 国产v精品成人免费视频400条| 久草在视频免费福利| 777亚洲精品乱码久久久久久| 亚洲色成人WWW永久网站| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲最大在线观看| 亚洲最大成人网色香蕉| 亚洲码和欧洲码一码二码三码 | 222www免费视频| 国产片免费在线观看| 亚洲人成人网站在线观看| 国产成人无码综合亚洲日韩| 亚洲理论在线观看| 有色视频在线观看免费高清在线直播| 一级做α爱过程免费视频| 五月婷婷在线免费观看| 四虎影院永久免费观看| 亚洲国产最大av| 亚洲午夜精品一级在线播放放 | 免费看美女被靠到爽| 全黄A免费一级毛片| 日本在线高清免费爱做网站| 日韩亚洲翔田千里在线| 91免费福利精品国产| 亚洲综合av一区二区三区不卡| 久久国产精品国产自线拍免费| 免费a级毛片无码a∨蜜芽试看| 亚洲无线码一区二区三区| 久久久久久精品免费看SSS| 老妇激情毛片免费| 亚洲精品自在线拍| 国产亚洲日韩一区二区三区| 国产91成人精品亚洲精品| 午夜a级成人免费毛片| 午夜免费啪视频在线观看| 亚洲国产精品无码久久久不卡|