【前言】爲了web安全改造做點前期準備,界面錯誤統一定向到一個error.jsp上,不能出現tomcat的版本號。
【原文】http://www.51cto.com/art/200704/46521.htm
由於JSP文件被編譯成Servlet執行,出現異常的默認操作就是顯示異常的堆棧。JSP頁面提供了重寫這個默認行爲的功能,並且將異常處理轉到另一個文件中:
<%@ page errorPage="error.jsp"%> |
這樣在這個JSP頁面中,如果遇到任何未捕獲到的Throwable對象,那麼就會顯示指定的出錯頁面error.jsp上。
下面我們來看一個具體的例子。首先我們開發一個會出錯的頁面,如:會出錯的頁面(mustBeError.jsp)
從代碼可以看出,這個頁面必定會出錯誤。在這個頁面的page指令中,通過errorPage="error.jsp"指定出錯時的錯誤處理頁面。
我們來看錯誤處理頁面的具體代碼,如錯誤處理頁面(error.jsp)
在error.jsp中,首先在page指令中指定:
isErrorPage="true"
這是非常關鍵的地方,只有這樣指定,這個頁面才能進行錯誤處理,才能使用exception對象。
exception對象有幾個非常重要的方法,用於獲得出錯的信息,這些方法如下:
<%=exception.getMessage()%> |
最後一個方法用於打印錯誤堆棧。如果需要在錯誤頁面以外使用這個exception對象,那麼可以這樣把exception對象保存起來:
session.setAttribute("myError",exception); |
在另一個頁面使用:
Exception exception=( Exception )session.getAttribute("myError"); |
把這個異常對象引入進來。
在瀏覽器裏輸入:http://127.0.0.1:8080/mustBeError.jsp。由於這個頁面必定產生運行時異常,它將自動調用http://127.0.0.1:8080/error.jsp頁面。
以上是JSP頁面內部出現錯誤的處理情況。如果異常在JavaBean中產生,那麼將怎麼辦呢?具體的方法是在JavaBean中把異常拋出到JSP頁面,如果JSP頁面沒有捕獲這個異常,那麼也到錯誤頁面中處理。我們再來看一個例子,假設有一個JavaBean,用於計算兩個整數的和,代碼如:
可能在Integer.parseInt方法中出現異常。當出現這個異常時,就把這個異常拋出到JSP頁面。我們看在JSP頁面中怎麼使用這個類,並且怎麼處理異常,
從代碼可以看出,在這個頁面中沒有捕獲JavaBean中產生的異常,這樣就會自動調用錯誤處理頁面。
在瀏覽器裏輸入http://127.0.0.1:8080/add.jsp?x=12&y=112將會運行正常。在表單中填寫以下的值:
x=12,y=sdkjf
那麼必定產生運行異常,這個異常將在error.jsp中進行處理。
當輸入以上的值提交後,將在error.jsp中捕獲到NumberFormatException。
我們進一步把以上的實踐昇華一下,總結出一句話:JSP錯誤處理本質就是在不同的頁面或者類中傳遞異常,並且在目標頁面處理異常。