天天看點

[Servlet&JSP] 部署描述設定Servlet的設定設定歡迎與錯誤處理頁面MIME與擴充名的對應

以下是在web.xml中設定servlet的範例片段:

當web應用程式啟動後,事實上并沒有加載所有的servlet。容器會在請求時,才将對應的servlet類加載、執行個體化并進行初始動作,然後再調用service()方法來處理請求。

如果希望在應用程式啟動時,就先把servlet類加載、執行個體化并做好初始化動作,就可以使用<code>&lt;load-on-startup&gt;</code>設定。設定大于0的值,表示在啟動應用程式後就要初始化servlet。數字表示了servlet的初始化順序,如果有多個servlet在設定<code>&lt;load-on-startup&gt;</code>時使用了相同的數字,則按其在web.xml中設定的順序來初始化servlet。

别嘗試在所有的servlet上都設定<code>&lt;load-on-startup&gt;</code>。越多的servlet在應用程式啟動時被初始化,表示應用程式的啟動越花時間。隻有在那些初始時會加載比較多資源的servlet上才設定<code>&lt;load-on-startup&gt;</code>,像是web架構(framework)中擔任前端控制器(front controller)角色的servlet。

可以在<code>&lt;url-pattern&gt;</code>中設定三種模式:

完全符合模式

必須以斜杠(/)作為開頭,也就是以web應用程式環境根目錄開始,指定完整的url模式。如:<code>&lt;url-pattern&gt;/admin/login.do&lt;/url-pattern&gt;</code>。

目錄符合模式

指定某個目錄下的所有url都交由某個servlet來處理,則可以在目錄斜杠(/)後加上星号(<code>*</code>)。如<code>&lt;url-pattern&gt;/guest/*&lt;/url-pattern&gt;</code>。

擴充名符合模式

指定以某個擴充名為結尾的所有url請求都交由對應的servlet處理,則可以使用星号(<code>*</code>)作為開頭,并加上擴充名。<code>&lt;url-pattern&gt;*.do&lt;/url-pattern&gt;</code>。

不能混用目錄符合模式與擴充名符合模式,即不能出現如<code>&lt;url-pattern&gt;/admin/*.do&lt;/url-pattern&gt;</code>這樣的url模式設定。

如果有url模式設定比對的規則在某些url請求時有所重疊,則請求時比對的原則依完全模式、目錄模式、擴充名模式的順序來決定,也就是從最嚴格的模式開始符合。

在設定過濾器時,<code>&lt;filter-mapping&gt;</code>上也可以設定<code>&lt;url-pattern&gt;</code>标簽,設定的原則與<code>&lt;servlet-mapping&gt;</code>上的<code>&lt;url-pattern&gt;</code>是相同的。在servlet2.5版本之後,可以直接在同一個<code>&lt;servlet-mapping&gt;</code>中設定多個<code>&lt;url-pattern&gt;</code>。例如:

同樣的,也可以在<code>&lt;filter-mapping&gt;</code>中設定多個<code>&lt;url-pattern&gt;</code>或<code>&lt;servlet-name&gt;</code>。例如:

如果使用者使用者請求某個類似于/bookmarkonline/user的url,而user在servlet的url模式設定中并不存在,它隻是一個目錄,若不想使用者看到資源不存在之類的錯誤資訊,則可以設定預設的歡迎頁面,在使用者請求某個目錄時可以自動挑選歡迎頁面加以顯示。

設定<code>&lt;welcome-file&gt;</code>時,注意態用斜杠(/)作為開頭(這不是在設定整個應用程式的預設首頁)。在請求某個目錄名稱時,容器會自動依<code>&lt;welcome-file&gt;</code>中的檔案順序,看看時候可找到對應的檔案,找到的話就顯示給使用者。

如果在存取應用程式的時候發生了異常或者錯誤,而沒有在servlet/jsp中處理這個異常或錯誤,則最後會由容器加以處理,一般容器就是直接顯示異常資訊與堆棧跟蹤資訊。如果希望容器發現這類異常或者錯誤時,可以自動轉發到某個url,則可以在web.xml中使用<code>&lt;error-page&gt;</code>進行設定。

例如,若想要在容器收到某個類型的異常對象時進行轉發,則可以做如下設定:

如果想要基于http的錯誤代碼轉發到處理頁面,則要搭配<code>&lt;error-code&gt;</code>來設定。例如:

這個設定在自行使用httpservletresponse的senderror()送出錯誤狀态碼時也有作用,因為senderror()隻是告知容器,以容器的預設方式或web.xml中的設定來産生錯誤狀态碼的資訊。

當自動響應串流給浏覽器時,為了讓浏覽器知道如何處理收到的串流對象,必須告知mime類型。若應用程式中使用到了mime類型,可以在web.xml中設定擴充名與mimie類型對應。例如:

<code>&lt;extension&gt;</code>設定檔案的擴充名,而<code>&lt;mime-type&gt;</code>設定對應的mime類型名稱。如果想要知道某個檔案的mime類型名稱,則可使用servletcontext的getmimetype()方法,這個方法讓你指定檔案名稱,然後根據web.xml總設定的對應擴充名,取得mime類型的名稱。