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}

这次输出如下:

扫描二维码关注公众号,回复: 2682459 查看本文章

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

猜你喜欢

转载自blog.csdn.net/thomassamul/article/details/81296103