心的方向

          新的征途......
          posts - 75,comments - 19,trackbacks - 0

           web.xml配置的詳細說明 2
          4 禁止激活器servlet
          對servlet或JSP頁面建立定制URL的一個原因是,這樣做可以注冊從 init(servlet)或jspInit(JSP頁面)方法中讀取得初始化參數。但是,初始化參數只在是利用定制URL模式或注冊名訪問 servlet或JSP頁面時可以使用,用缺省URL http://host/webAppPrefix/servlet/ServletName 訪問時不能使用。因此,你可能會希望關閉缺省URL,這樣就不會有人意外地調用初始化servlet了。這個過程有時稱為禁止激活器servlet,因為多數服務器具有一個用缺省的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,并使用前一節討論的url-pattern元素將所有匹配請求轉向該 servlet。只要簡單地使用:
          <url-pattern>/servlet/*</url-pattern>
          作為servlet-mapping元素中的模式即可。
          例如,程序清單5-5給出了將SorryServlet servlet(程序清單5-6)與所有以http://host/webAppPrefix/servlet/ 開頭的URL相關聯的部署描述符文件的一部分。
          程序清單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"
          "

          <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/.
          * © 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頁面的啟動行為的方法。特別是,說明了怎樣分配初始化參數以及怎樣更改服務器生存期中裝載servlet和JSP頁面的時刻。
          5.1 分配servlet初始化參數
          利用init-param元素向servlet提供初始化參數,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>
          在涉及初始化參數時,有幾點需要注意:
          l 返回值。GetInitParameter的返回值總是一個String。因此,在前一個例子中,可對param2使用Integer.parseInt獲得一個int。
          l JSP中的初始化。JSP頁面使用jspInit而不是init。JSP頁面還需要使用jsp-file元素代替servlet-class。
          l 缺省URL。初始化參數只在通過它們的注冊名或與它們注冊名相關的定制URL模式訪問Servlet時可以使用。因此,在這個例子中,param1和 param2初始化參數將能夠在使用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/.
          * © 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(說明初始化參數的摘錄)
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <!DOCTYPE web-app
          PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "

          <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初始化參數
          給JSP頁面提供初始化參數在三個方面不同于給servlet提供初始化參數。
          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的對初始化參數具有訪問權的版本。但在用于JSP頁面時,許多用戶似乎不喜歡應用常規的servlet的URL。此外,如果 JSP頁面位于服務器為其提供了目錄清單的目錄中(如,一個既沒有index.html也沒有index.jsp文件的目錄),則用戶可能會連接到此 JSP頁面,單擊它,從而意外地激活未初始化的頁面。因此,好的辦法是使用url-pattern(5.3節)將JSP頁面的原URL與注冊的 servlet名相關聯。這樣,客戶機可使用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或許已經使用了inti方法。因此,使用JSP聲明提供一個init方法是不合法的,必須制定jspInit方法。
          為了說明初始化JSP頁面的過程,程序清單5-9給出了一個名為InitPage.jsp的JSP頁面,它包含一個jspInit方法且放置于 deployDemo Web應用層次結構的頂層。一般,http://host/deployDemo/InitPage.jsp 形式的URL將激活此頁面的不具有初始化參數訪問權的版本,從而將對firstName和emailAddress變量顯示null。但是, web.xml文件(程序清單5-10)分配了一個注冊名,然后將該注冊名與URL模式/InitPage.jsp相關聯。

          程序清單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參數的摘錄)
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <!DOCTYPE web-app
          PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "

          <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 提供應用范圍內的初始化參數
          一般,對單個地servlet或JSP頁面分配初始化參數。指定的servlet或JSP頁面利用ServletConfig的getInitParameter方法讀取這些參數。但是,在某些情形下,希望提供可由任意servlet或JSP頁面借助ServletContext的getInitParameter方法讀取的系統范圍內的初始化參數。
          可利用context-param元素聲明這些系統范圍內的初始化值。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元素必須出現任意與文檔有關的元素(icon、display-name或description)之后及filter、filter-mapping、listener或 servlet元素之前。
          5.4 在服務器啟動時裝載servlet
          假如servlet或JSP頁面有一個要花很長時間執行的init (servlet)或jspInit(JSP)方法。例如,假如init或jspInit方法從某個數據庫或ResourceBundle查找產量。這種情況下,在第一個客戶機請求時裝載servlet的缺省行為將對第一個客戶機產生較長時間的延遲。因此,可利用servlet的load-on- startup元素規定服務器在第一次啟動時裝載servlet。下面是一個例子。
          <servlet>
          <servlet-name> … </servlet-name>
          <servlet-class> … </servlet-class> <!-- Or jsp-file -->
          <load-on-startup/>
          </servlet>
          可以為此元素體提供一個整數而不是使用一個空的load-on-startup。想法是服務器應該在裝載較大數目的servlet或JSP頁面之前裝載較少數目的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頁面發出的相應。在執行一個servlet或JSP頁面之前,必須執行第一個相關的過濾器的doFilter方法。在該過濾器對其FilterChain對象調用doFilter時,執行鏈中的下一個過濾器。如果沒有其他過濾器,servlet或JSP頁面被執行。過濾器具有對到來的ServletRequest對象的全部訪問權,因此,它們可以查看客戶機名、查找到來的cookie等。為了訪問servlet或JSP頁面的輸出,過濾器可將響應對象包裹在一個替身對象(stand-in object)中,比方說把輸出累加到一個緩沖區。在調用FilterChain對象的doFilter方法之后,過濾器可檢查緩沖區,如有必要,就對它進行修改,然后傳送到客戶機。
          例如,程序清單5-11帝國難以了一個簡單的過濾器,只要訪問相關的servlet或JSP頁面,它就截取請求并在標準輸出上打印一個報告(開發過程中在桌面系統上運行時,大多數服務器都可以使用這個過濾器)。

          程序清單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/.
          * © 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元素中出現的次序不是任意的;允許服務器(但不是必需的)強制所需的次序,并且實際中有些服務器也是這樣做的。但這里要注意,所有filter元素必須出現在任意filter-mapping元素之前, filter-mapping元素又必須出現在所有servlet或servlet-mapping元素之前。
          例如,給定上述的ReportFilter類,可在web.xml中作出下面的filter聲明。它把名稱Reporter與實際的類ReportFilter(位于moreservlets程序包中)相關聯。
          <filter>
          <filter-name>Reporter</filter-name>
          <filter-class>moresevlets.ReportFilter</filter-class>
          </filter>
          一旦命名了一個過濾器,可利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。關于此項工作有兩種選擇。
          首先,可使用filter-name和servlet-name子元素把此過濾器與一個特定的servlet名(此servlet名必須稍后在相同的 web.xml文件中使用servlet元素聲明)關聯。例如,下面的程序片斷指示系統只要利用一個定制的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頁面或靜態內容相關聯。例如,相面的程序片段指示系統只要訪問Web應用中的任意URL,就運行名為Reporter的過濾器。
          <filter-mapping>
          <filter-name>Reporter</filter-name>
          <url-pattern>/*</url-pattern>
          </filter-mapping>
          例如,程序清單5-12給出了將ReportFilter過濾器與名為PageName的servlet相關聯的web.xml文件的一部分。名字 PageName依次又與一個名為TestPage.jsp的JSP頁面以及以模式http: //host/webAppPrefix/UrlTest2/ 開頭的URL相關聯。TestPage.jsp的源代碼已經JSP頁面命名的談論在前面的3節"分配名稱和定制的URL"中給出。事實上,程序清單5- 12中的servlet和servlet-name項從該節原封不動地拿過來的。給定這些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"
          "

          <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>


          主站蜘蛛池模板: 长兴县| 金秀| 称多县| 凤城市| 闵行区| 新巴尔虎左旗| 铁岭县| 亚东县| 精河县| 凉山| 黔西| 璧山县| 柳州市| 都昌县| 肇源县| 东港市| 通化县| 资阳市| 湖南省| 天台县| 高阳县| 青神县| 宣城市| 介休市| 谢通门县| 上杭县| 昌平区| 桐柏县| 高平市| 罗江县| 兴海县| 抚远县| 丹阳市| 卫辉市| 阳江市| 广宁县| 新化县| 钦州市| 临海市| 嘉定区| 桓仁|