1. 程式人生 > >Servlet學習筆記(二)之Servlet路徑對映配置、Servlet介面、ServletConfig、ServletContext

Servlet學習筆記(二)之Servlet路徑對映配置、Servlet介面、ServletConfig、ServletContext

Servlet路徑對映配置
要使Servlet物件正常的執行,需要進行適當的配置,以告訴Web容器哪個請求呼叫哪個Servlet物件處理,對Servlet起到一個註冊的作用。Servlet的配置資訊包含在web.xml檔案中,主要通過兩步進行配置:
(1)宣告Servlet物件
通過< servlet>標籤宣告一個Servlet物件,在此標籤下包含兩個主要子元素,為別為< servlet-name>與< servlet-class>,其中< servlet-name>用於指定Servlet的名稱,該名稱可以是自定義的名稱,< servlet-class>用於指定Servlet物件的完整位置,包含Servlet物件的包名和類名。


(2)對映Servlet
由於客戶端是通過URL地址訪問web伺服器中的資源,所以Servlet程式若想被外界訪問,必須把Servlet程式對映到一個URL地址上,在web.xml檔案中宣告Servlet物件後,需要對映Servlet的URL。該操作是使用< servlet-mapping>標籤進行配置。< servlet-mapping>標籤包含兩個子元素,分別為< servlet-name>與< url-pattern>。·,其中< servlet-name>元素與< servlet>標籤中的< servlet-name>元素相對應,不可以隨意命名。< url-pattern>用於對映訪問URL。

例如:

其中訪問URL的相對路徑為“/servlet/MyServlet”
(3)同一個Servlet可以被對映到多個URL上,即多個 < servlet-mapping>元素的< servlet-name>子元素的設定值可以是同一個Servlet的註冊名,如下修改就為一個Servlet指定了兩個url-pattern,通過這兩個URL都可以訪問同一個Servlet程式。

URL 配置格式

  1. 完全路徑匹配 (以/開始 ) 例如:/hello、 /init (注意:如果沒有“/”,會發生404,are you ok當前工程沒有被正確釋出,訪問該工程所有靜態資源、動態資源 發生404 —– 工程啟動時出錯了)

  2. 目錄匹配 (以/開始) 例如:/* 、/abc/* (代表abc目錄下的所有資源,即“/adc/hjhsdfkj”也可以訪問)
    / 代表網站根目錄

  3. 副檔名 (不能以/開始) 例如:* .do(即“dhjhs/dsajh/dsjkdn.do”,只要是以.do結尾的即可訪問) 、* .action
    典型錯誤 /*.do

優先順序:完全匹配>目錄匹配 > 副檔名匹配

路徑問題

這裡寫圖片描述

相對路徑:相對當前網頁地址
絕對路徑 解決相對路徑,會根據當前地址改變問題。

Servlet介面

init方法
在Servlet的配置檔案中,可以使用一個或者多個< init-param>標籤為servlet配置一些初始化引數。

ServletConfig
在Servlet程式中通過ServletConfig物件*(ServletConfig介面位於javax.servlet包中,它封裝了Servlet的配置資訊,在Servlet初始化期間被傳遞) 獲得cast對應資料

ServletConfig物件定義了4個方法:

getInitParameter —— 通過name獲得value

getInitParameterNames —– 獲得所有name

思考 :如何在doGet 或 doPost 方法中 獲得 Servlet初始化引數
將ServletConfig物件儲存例項成員變數
GenericServlet 已經將ServletConfig 儲存成員變數 —– 在子類中通過 getServletConfig方法 獲得 初始化引數

結論:子類Servlet不需要覆蓋 init(ServletConfig) , 只需要通過GenericServlet中 getServletConfig() 獲得ServletConfig物件
因此,假如在doGet方法中獲得Servlet初始化引數,可以:

應用:在init-param 指定配置檔案位置和名稱,配置Servlet隨伺服器啟動建立 load-on-startup

ServletConfig 配置初始化資料,只能在配置Servlet獲得(當前的),其它Servlet無法獲得 —– 每個Servlet程式都對應一個ServletConfig物件,並且是獨立的,不可以互相使用(其獲得自己已配置的初始化引數)

ServletContext

  • WEB容器在啟動時,它會為每個WEB應用程式都建立一個對應的ServletContext物件,考雅思還是考託福它代表當前web應用。
  • ServletConfig物件維護了ServletContext物件的引用,在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext物件。
  • 一個WEB應用中的所有servlet共享同一個ServletContext物件,因此Servlet物件之間可以通過ServletContext物件來實現通訊。ServletContext物件通常也被稱之為context域物件 。

應用:
1、 獲得整個web應用初始化引數
2、 實現全域性資料共享(例如統計訪問次數)
3、 實現伺服器端轉發功能
4、 讀取web工程資原始檔

1、獲取WEB應用的初始化引數 和 ServletConfig 物件不同
* ServletConfig物件 配置引數,只對配置Servlet有效,如果配置引數,所有Servlet都可以訪問 通過ServletContext,通過標籤< context-param>(注意:不同於初始化引數配置,標籤不巢狀在< servlet>標籤中)實現

ServletConfig與ServletContext的區別:

這裡寫圖片描述

2、通過ServletContext 在多個Servlet間 共享資料
在ServletContext中 儲存站點訪問次數 ,每當一個使用者訪問站點,將訪問次數+1
在CountServlet 初始化過程中,向ServletContext 儲存訪問次數 —- 0 ————–> ServletContext setAttribute

每次訪問次數 +1 — 資料存放ServletContext中 —- 所有Servlet都可以獲得該資料

在ServletContext中儲存資料,所有Servlet都可以訪問

這裡寫圖片描述

3、通過ServletContext 完成伺服器程式轉發

什麼是轉發? 轉發和重定向區別 ?

這裡寫圖片描述

使用轉發還是重定向? —- 轉發效能好於重定向,請求次數少

4.預設Servlet

  • 預設Servlet 功能:處理其他Servlet都不處理請求
    tomcat/conf/web.xml org.apache.catalina.servlets.DefaultServlet 作為預設Servlet
  • 當訪問Tomcat伺服器中的某個靜態HTML檔案和圖片時,實際上是在訪問這個預設Servlet

這裡寫圖片描述