憨厚生

          ----Java's Slave----
          ***Java's Host***

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            165 隨筆 :: 17 文章 :: 90 評論 :: 0 Trackbacks
          轉 http://blog.csdn.net/fenglibing/archive/2009/03/19/4005446.aspx

          3.2 定義定制的URL
          大多數服務器具有一個缺省的serlvet URL:
          http://host /webAppPrefix/servlet/packageName.ServletName。雖然在開發中使用這個URL很方便,但是我們常常會希望 另一個URL用于部署。例如,可能會需要一個出現在Web應用頂層的URL(如,http: //host/webAppPrefix/Anyname),并且在此URL中沒有servlet項。位于頂層的URL簡化了相對URL的使用。此外,對 許多開發人員來說,頂層URL看上去比更長更麻煩的缺省URL更簡短。
          事實上,有時需要使用定制的URL。比如,你可能想關閉缺省URL映射,以便更好地強制實施安全限制或防止用戶意外地訪問無初始化參數的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元素出現地次序不是隨意的。特別是,需要把所有servlet元素放在所有 servlet-mapping元素之前。
          Java代碼
          1. <servlet>   
          2. <servlet-name>Test</servlet-name>   
          3. <servlet-class>moreservlets.TestServlet</servlet-class>   
          4. </servlet>   
          5. <!-- ... -->   
          6. <servlet-mapping>   
          7. <servlet-name>Test</servlet-name>   
          8. <url-pattern>/UrlTest</url-pattern>   
          9. </servlet-mapping>  

          URL模式還可以包含通配符。例如,下面的小程序指示服務器發送所有以Web應用的URL前綴開始,以..asp結束的請求到名為BashMS的servlet。

          Java代碼
          1. <servlet>   
          2. <servlet-name>BashMS</servlet-name>   
          3. <servlet-class>msUtils.ASPTranslator</servlet-class>   
          4. </servlet>   
          5. <!-- ... -->   
          6. <servlet-mapping>   
          7. <servlet-name>BashMS</servlet-name>   
          8. <url-pattern>/*.asp</url-pattern>   
          9. </servlet-mapping>  


          3.3 命名JSP頁面
          因為JSP頁面要轉換成sevlet,自然希望就像命名servlet一樣命名JSP頁面。畢竟,JSP 頁面可能會從初始化參數、安全設置或定制的URL中受益,正如普通的serlvet那樣。雖然JSP頁面的后臺實際上是servlet這句話是正確的,但 存在一個關鍵的猜疑:即,你不知道JSP頁面的實際類名(因為系統自己挑選這個名字)。因此,為了命名JSP頁面,可將jsp-file元素替換為 servlet-calss元素,如下所示:

          Java代碼
          1. <servlet>   
          2. <servlet-name>Test</servlet-name>   
          3. <jsp-file>/TestPage.jsp</jsp-file>   
          4. </servlet>  

          命名JSP頁面的原因與命名servlet的原因完全相同:即為了提供一個與定制設置(如,初始化參數和安全設置)一起使用的名稱,并且,以便能更 改激活 JSP頁面的URL(比方說,以便多個URL通過相同頁面得以處理,或者從URL中去掉.jsp擴展名)。但是,在設置初始化參數時,應該注意,JSP頁 面是利用jspInit方法,而不是init方法讀取初始化參數的。
          例如,程序清單5-3給出一個名為TestPage.jsp的簡單JSP 頁面,它的工作只是打印出用來激活它的URL的本地部分。TestPage.jsp放置在deployDemo應用的頂層。程序清單5-4給出了用來分配 一個注冊名PageName,然后將此注冊名與http://host/webAppPrefix/UrlTest2/anything 形式的URL相關聯的web.xml文件(即,deployDemo/WEB-INF/web.xml)的一部分。

          程序清單5-3 TestPage.jsp

          Java代碼
          1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">   
          2. <HTML>   
          3. <HEAD>   
          4. <TITLE>   
          5. JSP Test Page   
          6. </TITLE>   
          7. </HEAD>   
          8. <BODY BGCOLOR="#FDF5E6">   
          9. <H2>URI: <%= request.getRequestURI() %></H2>   
          10. </BODY>   
          11. </HTML>  



          程序清單5-4 web.xml(說明JSP頁命名的摘錄)

          Java代碼
          1. <?xml version="1.0" encoding="ISO-8859-1"?>   
          2. <!DOCTYPE web-app   
          3. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
          4. "http://java.sun.com/dtd/web-app_2_3.dtd">   
          5.   
          6. <web-app>   
          7. <!-- ... -->   
          8. <servlet>   
          9. <servlet-name>PageName</servlet-name>   
          10. <jsp-file>/TestPage.jsp</jsp-file>   
          11. </servlet>   
          12. <!-- ... -->   
          13. <servlet-mapping>   
          14. <servlet-name> PageName </servlet-name>   
          15. <url-pattern>/UrlTest2/*</url-pattern>   
          16. </servlet-mapping>   
          17. <!-- ... -->   
          18. </web-app>  



          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頁命名的摘錄)

          Java代碼
          1. <?xml version="1.0" encoding="ISO-8859-1"?>   
          2. <!DOCTYPE web-app   
          3. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
          4. "http://java.sun.com/dtd/web-app_2_3.dtd">   
          5.   
          6. <web-app>   
          7. <!-- ... -->   
          8. <servlet>   
          9. <servlet-name>Sorry</servlet-name>   
          10. <servlet-class>moreservlets.SorryServlet</servlet-class>   
          11. </servlet>   
          12. <!-- ... -->   
          13. <servlet-mapping>   
          14. <servlet-name> Sorry </servlet-name>   
          15. <url-pattern>/servlet/*</url-pattern>   
          16. </servlet-mapping>   
          17. <!-- ... -->   
          18. </web-app>  



          程序清單5-6 SorryServlet.java

          Java代碼
          1. package moreservlets;   
          2.   
          3. import java.io.*;   
          4. import javax.servlet.*;   
          5. import javax.servlet.http.*;   
          6.   
          7. /** Simple servlet used to give error messages to
          8. * users who try to access default servlet URLs
          9. * (i.e., http://host/webAppPrefix/servlet/ServletName)
          10. * in Web applications that have disabled this
          11. * behavior.
          12. * <P>
          13. * Taken from More Servlets and JavaServer Pages
          14. * from Prentice Hall and Sun Microsystems Press,
          15. * http://www.moreservlets.com/.
          16. * © 2002 Marty Hall; may be freely used or adapted.
          17. */  
          18.   
          19. public class SorryServlet extends HttpServlet {   
          20. public void doGet(HttpServletRequest request,   
          21. HttpServletResponse response)   
          22. throws ServletException, IOException {   
          23. response.setContentType("text/html");   
          24. PrintWriter out = response.getWriter();   
          25. String title = "Invoker Servlet Disabled.";   
          26. out.println(ServletUtilities.headWithTitle(title) +   
          27. "<BODY BGCOLOR=\"#FDF5E6\">\n" +   
          28. "<H2>" + title + "</H2>\n" +   
          29. "Sorry, access to servlets by means of\n" +   
          30. "URLs that begin with\n" +   
          31. "http://host/webAppPrefix/servlet/\n" +   
          32. "has been disabled.\n" +   
          33. "</BODY></HTML>");   
          34. }   
          35.   
          36. public void doPost(HttpServletRequest request,   
          37. HttpServletResponse response)   
          38. throws ServletException, IOException {   
          39. doGet(request, response);   
          40. }   
          41. }  


          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映射項即可,如下所示:

          Java代碼
          1. <!--   
          2. <servlet-mapping>   
          3. <servlet-name>invoker</servlet-name>   
          4. <url-pattern>/servlet/*</url-pattern>   
          5. </servlet-mapping>   
          6. -->  

          再次提醒,應該注意這個項是位于存放在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文件的一部分。

          Java代碼
          1. <!--   
          2. <RequsetInterceptor   
          3. className="org.apache.tomcat.request.InvokerInterceptor"  
          4. debug="0" prefix="/servlet/" />   
          5. -->  


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

          Java代碼
          1. <servlet>   
          2. <servlet-name>InitTest</servlet-name>   
          3. <servlet-class>moreservlets.InitServlet</servlet-class>   
          4. <init-param>   
          5. <param-name>param1</param-name>   
          6. <param-value>value1</param-value>   
          7. </init-param>   
          8. <init-param>   
          9. <param-name>param2</param-name>   
          10. <param-value>2</param-value>   
          11. </init-param>   
          12. </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

          Java代碼
          1. package moreservlets;   
          2.   
          3. import java.io.*;   
          4. import javax.servlet.*;   
          5. import javax.servlet.http.*;   
          6.   
          7. /** Simple servlet used to illustrate servlet
          8. * initialization parameters.
          9. * <P>
          10. * Taken from More Servlets and JavaServer Pages
          11. * from Prentice Hall and Sun Microsystems Press,
          12. * http://www.moreservlets.com/.
          13. * © 2002 Marty Hall; may be freely used or adapted.
          14. */  
          15.   
          16. public class InitServlet extends HttpServlet {   
          17. private String firstName, emailAddress;   
          18.   
          19. public void init() {   
          20. ServletConfig config = getServletConfig();   
          21. firstName = config.getInitParameter("firstName");   
          22. emailAddress = config.getInitParameter("emailAddress");   
          23. }   
          24.   
          25. public void doGet(HttpServletRequest request,   
          26. HttpServletResponse response)   
          27. throws ServletException, IOException {   
          28. response.setContentType("text/html");   
          29. PrintWriter out = response.getWriter();   
          30. String uri = request.getRequestURI();   
          31. out.println(ServletUtilities.headWithTitle("Init Servlet") +   
          32. "<BODY BGCOLOR=\"#FDF5E6\">\n" +   
          33. "<H2>Init Parameters:</H2>\n" +   
          34. "<UL>\n" +   
          35. "<LI>First name: " + firstName + "\n" +   
          36. "<LI>Email address: " + emailAddress + "\n" +   
          37. "</UL>\n" +   
          38. "</BODY></HTML>");   
          39. }   
          40. }  


          程序清單5-8 web.xml(說明初始化參數的摘錄)

          Java代碼
          1. <?xml version="1.0" encoding="ISO-8859-1"?>   
          2. <!DOCTYPE web-app   
          3. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
          4. "http://java.sun.com/dtd/web-app_2_3.dtd">   
          5.   
          6. <web-app>   
          7. <!-- ... -->   
          8. <servlet>   
          9. <servlet-name>InitTest</servlet-name>   
          10. <servlet-class>moreservlets.InitServlet</servlet-class>   
          11. <init-param>   
          12. <param-name>firstName</param-name>   
          13. <param-value>Larry</param-value>   
          14. </init-param>   
          15. <init-param>   
          16. <param-name>emailAddress</param-name>   
          17. <param-value>Ellison@Microsoft.com</param-value>   


          posted on 2009-04-24 17:15 二胡 閱讀(238) 評論(0)  編輯  收藏 所屬分類: Javajspweb系統開發
          主站蜘蛛池模板: 乌恰县| 丰台区| 青河县| 吴桥县| 冀州市| 五大连池市| 凤山县| 保康县| 汝城县| 江川县| 台州市| 大新县| 元阳县| 平安县| 沿河| 柯坪县| 深水埗区| 甘德县| 拉萨市| 清镇市| 南川市| 武义县| 康保县| 邵东县| 科技| 贞丰县| 通辽市| 柯坪县| 郯城县| 志丹县| 黔江区| 江源县| 淮阳县| 通渭县| 陵川县| 来凤县| 渑池县| 克拉玛依市| 上栗县| 宿州市| 沙洋县|