在〈簡介 EL〉中曾使用一個簡單的加法網頁來示範。在該範例中使用了 errorPage="error.jsp"
設定當錯誤發生時,轉發至 error.jsp 顯示錯誤,若使用者輸入的並非數字時,EL 無法進行剖析為基本型態進行加法時,就會發生錯誤,而轉發 error.jsp。
如果你不想在錯誤發生時,轉發其它網頁來顯示錯誤訊息,而打算在目前網頁捕捉例外,並顯示相關訊息,那該如何進行?
這個問題的答案似乎很簡單,撰寫 Scriptlet,在當中使用 Java 的 try-catch 語法捕捉例外就可以解決這個需求。不過可以的話實在不希望再出現 Scriptlet,那該怎麼辦?
你可以使用 JSTL 的 <c:catch>
標籤:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>加法網頁</title>
</head>
<body>
<c:catch var="error">
${param.a} + ${param.b} = ${param.a + param.b}
</c:catch>
<c:if test="${error != null}">
<br><span style="color: red;">${error.message}</span>
<br>${error}
</c:if>
</body>
</html>
如果要在發生例外的網頁直接捕捉例外物件,可以使用 <c:catch>
將可能產生例外的網頁段落包起來。若例外真的發生,這個例外物件會設定給 var
屬性所指定的名稱,這樣才有機會使用這個例外物件。
例如範例中,使用了 <c:if>
標籤測試 error
是否參考至例外物件,如果是的話,由於例外都是 Throwable
的子類別,都擁有 getMessage()
方法,因此才能透過 ${error.message}
的方式取得例外相關訊息。
注意!只有設定 isErrorPage="true"
的JSP網頁才會有 exception
隱含物件,代表錯誤發生的來源網頁所傳進來的 Throwable
物件,所以不可以在上面的範例中,直接使用 exception
隱含物件。