2010年8月16日 星期一

JSP & Servlet 錯誤處理

錯誤頁面處理能在網站發生錯誤時,讓使用者看到比較親切的錯誤回應頁
當然有可能遇到必須依錯誤狀態指定不同的錯誤處理頁面的情形
這就是這一篇筆記所要談的

錯誤頁面的設置方法如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true"%>

使用page指令設置 isErrorPage="true"
這樣就告訴container這個頁面是錯誤頁面

接著在有可能發生錯誤或例外的頁面上作如下所示的設定:
<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="error.jsp"%>

在 errorPage 裡填入處理該錯誤的錯誤頁面位置
container會在錯誤發生時,將請求轉予該錯誤頁面

當然在所有的JSP上都使用page指令來指定錯誤頁面是很麻煩的事
在DD中也可以調整為整個Web Application宣告處理的錯誤頁面
container會使用DD中的<error-page>組態作為預設的錯誤頁面
但如果JSP頁面上有errorPage的page指令設置,會以頁面上的指令為優先
程式範例:
  <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/errorPage.jsp</location>
  </error-page>

範例會在任何錯誤發生時轉送請求到所設定的頁面
<location>必須相對於整個應用程式的根目錄來設定,所以會以斜線開頭
如果不想設定成統一的處理方式的話,試試類似下面範例的作法
設定在ArithmeticException發生時會呼叫arithErrorPage.jsp:
<error-page>
    <exception-type>java.lang.ArithmeticException</exception-type>
    <location>/arithErrorPage.jsp</location>
</error-page>

除此之外也能針對HTTP狀態代碼宣告錯誤頁面
以下示範在 404狀態(找不到頁面)的錯誤頁面設定
<error-page>
    <error-code>404</error-code>
    <location>/errorPage.jsp</location>
</error-page>

因為錯誤頁面處理發生的例外
而這個例外是由container所供給的
我們可以在錯誤頁面被呼叫時,通過他來獲知發生的例外
Scriptlet裡有exception隱含物件可以用
JSP中可以用EL隱含物件 ${pageContext.exception }
這樣可以獲得更詳細的細節

例外發生時,除了將請求轉送給錯誤頁面外
自行捕捉例外並處理掉它也是解決之道
這不會在本篇筆記被討論到
下一篇紀錄JSTL的筆記會有關於在JSP中處理例外的筆記

沒有留言:

張貼留言