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