打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JSP页面中的错误处理(转载)

jsp页面中主要有两种错误
(1)编译时错误
(2)运行时错误
      编译时错误是容器把JSP代码翻译为JAVA源代码时出现的,而运行时错误则是在执行已编译的JAVA字节码来处理一个到来的请求时出现。对于编译时错误并没有一个一般的方法可遵循,但运行时错误一般有下列两种处理方法。

一、通过JSTL<c:catch>标记来处理JSP页面所产生的错误,一般形式如下:
<c:catch [var="变量名"]>
...... 这里是可能导致错误的JSP代码
</c:catch>

例:下面代码假定没有定义errobj对象。
<c:catch>
<jsp:include page="nosuch.jsp" />
<jsp:setProperty name="errobj" property="nosuch"
     value="This is invalid" />
</c:catch>

这段代码没有指定var属性,尽管会捕获错误,但是不能做进一步的处理。应该为它增加一个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对象的stackTrace性质,可以得到出现错误时的一个java VM栈轨迹。可以使用EL<c:forEach> 循环标记来访问这个信息。修改这个例子如下:

<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>
运行后输出如下:


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错误页面转发处理错误

   使用JSP的错误页面转发机制,可以使用一个特定的JSP页面来处理或显示错误。相对于前面的<c:catch>标记,这样能提供一个更为全局的错误处理机制,还能为多个JSP页面提供同一个错误页面来处理错误。

必须在一个JSP页面中通过<@% page %>指令指定errorPage属性,把一个JSP页面与一个错误页面相关联。如:

<%@page errorPage="showerr.jsp" %>

这里指定showerr.jsp来完成错误处理,在showerr.jsp中必须包含<%@page isErrorPage="true" %>以表明这是一个应用于多个JSP页面的错误处理页面。

看下面的一个实例:

1、这是一个会产生错误的页面index.jsp,并指出了错误处理页面。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@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>

这个页面中调用了一个bean的方法,这个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 "";
}

}
两个方法会导至java代码中出现一个运行时错误。

2、看看错误处理页面是如何访问错误信息的
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@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的一个子类,通过它可获取错误信息,只有在页面发生错误时才会有一个可用的pageContext.exception,通过pageContext.exception.stackTrace可访问栈轨迹.

(II)在错误处理期间可以访问pagecontext.errorDate对象,这个对象类型为javax.servlet.jsp.ErrorDate,它有两个有用的性质:
       pageContext.errorData.statusCode 错误返回的HTTP状态码
       pageContext.errorData.requestURI 导至错误的页面原URL

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JSP 的技术原理
自定义 Tomcat 404错误处理逻辑,以及错误现实页面
Java面试题全集(中)
图解JSP与Servlet的关系
Tomcat 报异常org.apache.catalina.core.standardwr...
MyEclipse下struts2、spring、hibernate整合
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服