舉例說明:mustBeError.jsp <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,javax.servlet.*,javax.servlet.http.*" errorPage="error.jsp" %> <% //這個頁面一定會出錯。 int i=0; int j=1; out.println(j/i); %> 在此中通過errorPage="error.jsp"來指定出錯時錯誤處理頁面 --------------------------- error.jsp <%@ page contentType="text/html; charset=gb2312" language="java" isErrorPage="true" import="java.io.*"%> <html> <head> <title>出錯了!</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> 出錯了!<br> 發生了以下的錯誤: <br><hr><font color=red><hr> getMessage():<br> <%=exception.getMessage()%><br><hr> getLocalizedMessage():<br> <%=exception.getLocalizedMessage()%><br><hr> PrintStatckTrace():<br> <% StringWriter sw=new StringWriter(); PrintWriter pw=new PrintWriter(sw); exception.printStackTrace(pw); out.println(sw); %><br> </font></body> </html> 在error.jsp中,page指令中指定:isErrorPage="true" <----------------------> 在web.xml中聲明異常和錯誤頁面 例如: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd" version="2.4"> <error-page> <error-code>404</error-code> <location>/pageNotFound.html</location> </error-page> <error-page> <exception-type>java.lang.NumberFormatException</exception-type> <location>/NumberFormatException.html</location> </error-page> </web-app> 說明:指定錯誤碼為404是,調用/pageNotFound.html 也可以指定錯誤類型如:java.lang.NumberFormatException,出現此錯誤類型是調用/NumberFormatException.html 文章引用自:http://www.zhuoda.org/air_tuyh/26516.html ========================= http://www.51cto.com/art/200704/46521.htm 由於JSP檔案被編譯成Servlet執行,出現異常的預設操作就是顯示異常的堆棧。JSP頁面提供了重寫這個預設行為的功能,並且將異常處理轉到另一個檔案中:
<%@ page errorPage="error.jsp"%>
|
這樣在這個JSP頁面中,如果遇到任何未捕獲到的Throwable對象,那麼就會顯示指定的出錯頁面。 下面我們來看一個具體的例子。首先我們開發一個會出錯的頁面,如常式10-10所示。 常式10-10 會出錯的頁面(mustBeError.jsp)
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,javax.servlet.*,javax.servlet.http.*" errorPage="error.jsp" %> <% //這個頁面一定會出錯 int i=0; int j=1; //以下代碼一定產生執行階段錯誤 out.println(j/i); %>
|
從代碼可以看出,這個頁面必定會出錯誤。在這個頁面的page指令中,通過errorPage="error.jsp"指定出錯時的錯誤處理頁面。 我們來看錯誤處理頁面的具體代碼,如常式10-11所示。 常式10-11 錯誤處理頁面(error.jsp)
<%@ page contentType="text/html; charset=gb2312" language="java" isErrorPage="true" import="java.io.*"%> <html> <head> <title>出錯了!</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> 出錯了!<br>
|
發生了以下的錯誤:
<br><hr><font color=red><hr> getMessage():<br> <%=exception.getMessage()%><br><hr> getLocalizedMessage():<br> <%=exception.getLocalizedMessage()%><br><hr> PrintStatckTrace():<br> <% StringWriter sw=new StringWriter(); PrintWriter pw=new PrintWriter(sw); exception.printStackTrace(pw); out.println(sw); %><br> </font></body> </html>
|
在error.jsp中,首先在page指令中指定:
這是非常關鍵的地方,只有這樣指定,這個頁面才能進行錯誤處理,才能使用exception對象。 exception對象有幾個非常重要的方法,用於獲得出錯的資訊,這些方法如下:
<%=exception.getMessage()%> <%=exception.getLocalizedMessage()%> <% exception.printStackTrace(PrintWriter);%>
|
最後一個方法用於列印錯誤堆棧。如果需要在錯誤頁面以外使用這個exception對象,那麼可以這樣把exception對象儲存起來:
session.setAttribute("myError",exception);
|
在另一個頁面使用:
Exception exception=( Exception )session.getAttribute("myError");
|
把這個異常對象引入進來。 在瀏覽器裡輸入:http://127.0.0.1:8080/ch10/mustBeError.jsp。由於這個頁面必定產生運行時異常,它將自動調用http://127.0.0.1:8080/ch10/error.jsp頁面。啟動並執行效果10-3所示。
以上是JSP頁面內部出現錯誤的處理情況。如果異常在JavaBean中產生,那麼將怎麼辦呢?具體的方法是在JavaBean中把異常拋出到JSP頁面,如果JSP頁面沒有捕獲這個異常,那麼也到錯誤頁面中處理。我們再來看一個例子,假設有一個JavaBean,用於計算兩個整數的和,代碼如常式10-12所示。 常式10-12 計算兩個整數和的JavaBean(AddJavaBean.java)
package com.jspdev.ch10; //用於計算兩個整數的和,可能在Integer.parseInt方法中出現異常 public class AddJavaBean { public int add(String x,String y)throws Exception { int ret=0; try { ret=Integer.parseInt(x)+Integer.parseInt(y); } catch(Exception e) { throw e; } return ret; } }
|
在常式10-12中,可能在Integer.parseInt方法中出現異常。當出現這個異常時,就把這個異常拋出到JSP頁面。我們看在JSP頁面中怎麼使用這個類,並且怎麼處理異常,如常式10-13所示。 常式10-13 JSP對JavaBean中拋出異常的處理(add.jsp)
<%@ page contentType="text/html; charset=gb2312" import="com.jspdev.ch10.*" language="java" errorPage="error.jsp" %> <html> <head> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <hr> <center> <% String x=request.getParameter("x"); String y=request.getParameter("y"); AddJavaBean addBean=new AddJavaBean(); %> <%=x%>+<%=y%>=<%=addBean.add(x,y)%> <hr> add.test<br> <form action="add.jsp" method="get"> <table><tr><td>x: <input type="text" name="x"></td></tr> <tr><td>y:<input type="text" name="y"></td></tr> <tr><td><input type="submit" value=add></td></tr> </table> </form> </center> </body> </html>
|
從代碼可以看出,在這個頁面中沒有捕獲JavaBean中產生的異常,這樣就會自動調用錯誤處理頁面。 在瀏覽器裡輸入http://127.0.0.1:8080/ch10/add.jsp?x=12&y=112將會運行正常。在表單中填寫以下的值: x=12,y=sdkjf 那麼必定產生運行異常,這個異常將在error.jsp中進行處理,10-4所示。 當輸入以上的值提交後,將在error.jsp中捕獲到NumberFormatException,10-5所示。
|
圖10-4 在add.jsp中輸入會產生異常的資訊 |
|
圖10-5 在error.jsp中處理add.jsp中的異常 |
我們進一步把以上的實踐升華一下,總結出一句話:JSP錯誤處理本質就是在不同的頁面或者類中傳遞異常,並且在目標頁面處理異常。 |