關于JSP的錯誤頁面處理
關于JSP中的錯誤頁面處理
通常JSP 在執行時,在兩個階段下會發生錯誤。
JSP 網頁 → Servlet 類
Servlet 類處理每一個請求時
在第一階段時,產生的錯誤我們稱為Translation Time Processing Errors;在第二階段時,產生的錯誤我們稱為Client Request Time Processing Errors。接下來我們針對這兩個階段產生錯誤的原因和處理方法,進行介紹。
1、 Translation Time Processing Errors
Translation Time Processing Errors 產生的主要原因:我們在撰寫JSP時的語法有錯誤,導致JSP Container 無法將JSP 網頁編譯成Servlet 類文件( .class),例如:500 Internal Server
Error,500 是指HTTP 的錯誤狀態碼,因此是Server Error。
通常產生這種錯誤時,可能是JSP 的語法有錯誤,或是JSP Container 在一開始安裝、設定時,有不適當的情形發生。解決的方法就是再一次檢查程序是否有寫錯的,不然也有可能是JSPContainer 的bug。
2、 Client Request Time Processing Errors
Client Request Time Processing Errors 錯誤的發生,往往不是語法錯誤,而可能是邏輯上的錯誤,簡單地說,你寫一個計算除法的程序,當用戶輸入的分母為零時,程序會發生錯誤并拋出異常(Exception),交由異常處理(Exception Handling)機制做適當的處理。對于這種錯誤的處理,我們通常會交給errorPage 去處理。下面舉個例子:
使用errorPage 的范例程序 :ErrorPage.jsp
<%@ page contentType="text/html;charset=GB2312" errorPage="Error.jsp" %> //設置Error.jsp頁為本頁的錯誤處理頁
<html>
<head>
<title>CH4 - ErrorPage.jsp</title>
</head>
<body>
<h2>errorPage 的范例程序</h2>
<%!
private double toDouble(String value)
{
return(Double.valueOf(value).doubleValue());
}
%>
<%
double num1 = toDouble(request.getParameter("num1"));
double num2 = toDouble(request.getParameter("num2"));
%>
您傳入的兩個數字為:<%= num1 %> 和 <%= num2 %><br>
兩數相加為 <%= (num1+num2) %>
</body>
</html>
ErrorPage.jsp 程序中,我們使用page 指令中的errorPage 屬性,告訴JSP Container,如果在程序中有錯誤產生時(指的是servlet運行時產生的錯誤或顯示用throw拋出的異常),會自動交給Error.jsp 處理。
Error.jsp
<%@ page contentType="text/html;charset=GB2312" isErrorPage="true" %> //設置該頁為錯誤處理頁
<%@ page import="java.io.PrintWriter" %>
<html>
<head>
<title>CH4 - Error.jsp</title>
</head>
<body>
<h2>errorPage 的范例程序</h2>
<p>ErrorPage.jsp 錯誤產生:<I><%= exception %></I></p><br>
<pre>
問題如下:<% exception.printStackTrace(new PrintWriter(out)); %> //輸出錯誤的原因
</pre>
</body>
</html>
Error.jsp 主要處理ErrorPage.jsp 所產生的錯誤,所以在ErrorPage.jsp 中page 指令的屬性errorPage設為Error.jsp,因此,若ErrorPage.jsp有錯誤發生時,會自動轉到Error.jsp來處理。Error.jsp 必須設定page 指令的屬性isErrorPage為true,因為Error.jsp是專門用來處理錯誤的網頁。設定page 指令的屬性isErrorPage為true后,在Error.jsp里就可以使用exception異常類了。
由于在這個程序中并沒有做一個窗體來輸入兩個數字,所以必須手動在URL后輸入num1和num2的值,如http://localhost:8080/ErrorPage.jsp?num1=100&num2=245。當ErrorPage.jsp 產生錯誤時(如加數為字符串型),就會交由Error.jsp 去處理,所以我們看到的結果,不
再是原始的服務器提示的亂七把糟的錯誤提示,將是執行Error.jsp 后的結果。
在jsp中顯式地拋出異常時,系統也會轉到錯誤處理頁面:
<%@page language="java" contentType="text/html;charset=GBK" import= "java.util.* " errorPage="exception.jsp"
%>
<jsp:useBean id="user" scope="session" class="S_userObj"/>
<%
if(user= =null)
throw new Exception("您沒有登陸或者登陸超時,請重新登陸");
。。。 。。。
當user為空時系統會自動轉到錯誤處理頁面。
總之,以下情況jsp會轉到錯誤處理頁面:
前提:jsp成功的轉換到了servlet,轉換過程中沒有發生錯誤。
當servlet運行時,程序中碰到異常。
當servlet運行時,程序控制轉到了顯式拋出的異常。例如:if(…) throw new exception();