jsp頁面中主要有兩種錯(cuò)誤
(1)編譯時(shí)錯(cuò)誤
(2)運(yùn)行時(shí)錯(cuò)誤
編譯時(shí)錯(cuò)誤是容器把JSP代碼翻譯為JAVA源代碼時(shí)出現(xiàn)的,而運(yùn)行時(shí)錯(cuò)誤則是在執(zhí)行已編譯的JAVA字節(jié)碼來處理一個(gè)到來的請(qǐng)求時(shí)出現(xiàn)。對(duì)于編譯時(shí)錯(cuò)誤并沒有一個(gè)一般的方法可遵循,但運(yùn)行時(shí)錯(cuò)誤一般有下列兩種處理方法。
一、通過JSTL<c:catch>標(biāo)記來處理JSP頁面所產(chǎn)生的錯(cuò)誤,一般形式如下:
<c:catch [var="變量名"]>
...... 這里是可能導(dǎo)致錯(cuò)誤的JSP代碼
</c:catch>
例:下面代碼假定沒有定義errobj對(duì)象。
<c:catch>
<jsp:include page="nosuch.jsp" />
<jsp:setProperty name="errobj" property="nosuch"
value="This is invalid" />
</c:catch>
這段代碼沒有指定var屬性,盡管會(huì)捕獲錯(cuò)誤,但是不能做進(jìn)一步的處理。應(yīng)該為它增加一個(gè)var屬性,如:
<c:catch var="localerr" >
< jsp:include page="nosuch.jsp" />
<jsp:setProperty name="errobj" property="nosuch" value="This is invalid" />
</c:catch>
$ {localerr}
這次輸出如下:
Page with error in JSP directive and actions
org.apache.jasper.JasperException
使用localerr對(duì)象的stackTrace性質(zhì),可以得到出現(xiàn)錯(cuò)誤時(shí)的一個(gè)java VM棧軌跡??梢允褂肊L<c:forEach> 循環(huán)標(biāo)記來訪問這個(gè)信息。修改這個(gè)例子如下:
<c:catch var="localerr">
<jsp:include page="nosuch.jsp" />
<jsp:setProperty name="errobj" property="nosuch" value="This is invalid" />
</c:catch>
<c:forEach var="trace" items="$ {localerr.stackTrace}">
<p>$ {trace}</p>
</c:forEach>
運(yùn)行后輸出如下:
Page with error in JSP directive and actions
org.apache.jasper.runtime.JspRuntimeLibrary.internalIntrospecthelper(JspRuntimeLibrary.java:359)
org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(JspRuntimeLibrary.java:306)
org.apache.jsp.example3.index_jsp._jspx_meth_c_catch_0(org.apache.jsp.example3.index_jsp:104)
org.apache.jsp.example3.index_jsp._jspService(org.apache.jsp.example3.index_jsp:63)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
java.lang.Thread.run(Thread.java:595)
注意:
變量localerr的類型是org.apache.jasper.JasperException
二、使用JSP錯(cuò)誤頁面轉(zhuǎn)發(fā)處理錯(cuò)誤
使用JSP的錯(cuò)誤頁面轉(zhuǎn)發(fā)機(jī)制,可以使用一個(gè)特定的JSP頁面來處理或顯示錯(cuò)誤。相對(duì)于前面的<c:catch>標(biāo)記,這樣能提供一個(gè)更為全局的錯(cuò)誤處理機(jī)制,還能為多個(gè)JSP頁面提供同一個(gè)錯(cuò)誤頁面來處理錯(cuò)誤。
必須在一個(gè)JSP頁面中通過<@% page %>指令指定errorPage屬性,把一個(gè)JSP頁面與一個(gè)錯(cuò)誤頁面相關(guān)聯(lián)。如:
<%@page errorPage="showerr.jsp" %>
這里指定showerr.jsp來完成錯(cuò)誤處理,在showerr.jsp中必須包含<%@page isErrorPage="true" %>以表明這是一個(gè)應(yīng)用于多個(gè)JSP頁面的錯(cuò)誤處理頁面。
看下面的一個(gè)實(shí)例:
1、這是一個(gè)會(huì)產(chǎn)生錯(cuò)誤的頁面index.jsp,并指出了錯(cuò)誤處理頁面。
<%@ taglib prefix="c" uri="<%@page errorPage="showerr.jsp" %>
<html>
<head>
<jsp:useBean id="errgen" class="com.wrox.begjsp.ch10.ErrorGenerator" />
<title>Error Generating page</title>
</head>
<body>
<h1>Page to Generate Error</h1>
<table>
<tr>
<td><h3>$ {errgen.divideByZero}</h3></td>
</tr>
</table>
</body>
</html>
這個(gè)頁面中調(diào)用了一個(gè)bean的方法,這個(gè)bean代碼如下:
package com.wrox.begjsp.ch10;
public class ErrorGenerator {
private Integer[] tpArray = new Integer[3];
public ErrorGenerator() {
}
public String getOutOfRange() {
tpArray[3] = tpArray[2];
return "";
}
public String getDivideByZero() {
tpArray[3] = new Integer(1/0);
return "";
}
}
兩個(gè)方法會(huì)導(dǎo)至java代碼中出現(xiàn)一個(gè)運(yùn)行時(shí)錯(cuò)誤。
2、看看錯(cuò)誤處理頁面是如何訪問錯(cuò)誤信息的
<%@ taglib prefix="c" uri="<%@page isErrorPage="true" %>
<html>
<head>
<title>An Error is detected</title>
</head>
<body>
<h1>Error Detected</h1>
<table width="600" border="1">
<tr valign="top">
<td ><b>Error:</b></td>
<td>$ {pageContext.exception}</td>
</tr>
<tr valign="top">
<td><b>URI:</b></td>
<td>$ {pageContext.errorData.requestURI}</td>
</tr>
<tr valign="top">
<td><b>Status code:</b></td>
<td>$ {pageContext.errorData.statusCode}</td>
</tr>
<tr valign="top">
<td><b>Stack trace:</b></td>
<td>
<c:forEach var="trace" items="$ {pageContext.exception.stackTrace}">
<p>$ {trace}</p>
</c:forEach>
</td>
</tr>
</table>
</body>
</html>
說明:
(I)pageContext.exception是java.lang.Throwable的一個(gè)子類,通過它可獲取錯(cuò)誤信息,只有在頁面發(fā)生錯(cuò)誤時(shí)才會(huì)有一個(gè)可用的pageContext.exception,通過pageContext.exception.stackTrace可訪問棧軌跡.
(II)在錯(cuò)誤處理期間可以訪問pagecontext.errorDate對(duì)象,這個(gè)對(duì)象類型為javax.servlet.jsp.ErrorDate,它有兩個(gè)有用的性質(zhì):
pageContext.errorData.statusCode 錯(cuò)誤返回的HTTP狀態(tài)碼
pageContext.errorData.requestURI 導(dǎo)至錯(cuò)誤的頁面原URL
聯(lián)系客服