【JSP】页面的异常处理

在JSP页面中,对于异常信息,我们可以进行下面的处理。

1、在可能出现异常的Java脚本中,加上try...catch

<%

try{

}

catch(){

}

%>

2、在page指令中增加errorPage属性

<%@   page  errorPage="/error.jsp" %>

errorPage的属性必须使用相对路径,如果一“/”开发,那么代表Web工程的根目录

 

如果我们指定了errorPage属性的值为error.jsp,那么在访问出现错误时,就会跳转到error.jsp(是转发过去的),如果想要了解异常的信息和对其进行处理,那么就要在error.jsp中设置page指令中的isErrorPage属性

<%@  page  isErrorPage="true"%>

那么,在这个页面中,就可以调用exception隐式对象。如果没有将isErrorPage属性设置为true的话,exception隐式对象是不可以调用的。

 

3、在web.xml配置文件中对异常处理做出全局的配置

也可以不再jsp页面中指定page指令的errorPage属性,而在web.xml文件中设置全局的异常处理

<error-page>
    <exception-type>java.lang.ArithmeticException</exception-type>
    <location>/error.jsp</location>
  </error-page>

设置好要捕获的异常和要跳转的对象

 

web.xml中不仅可以设置对异常的处理,还可以处理一些请求错误

<error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
  </error-page>

指定要处理的404错误,代表处理请求资源不存在的HTTP状态码,指定跳转到404.jsp页面

 

 

如果在web.xml文件中配置了异常的处理,在JSP页面中也设置了errorPage的属性,那么JSP页面里的errorPage的配置会覆盖掉web.xml中的设置。




sp中错误处理页面-isErrorPage="true"

2008-11-18 11:03
举例说明: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指令中指定:

isErrorPage="true"

这是非常关键的地方,只有这样指定,这个页面才能进行错误处理,才能使用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所示。

图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错误处理本质就是在不同的页面或者类中传递异常,并且在目标页面处理异常




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值