关于JSP中的错误页面处理
通常JSP 在执行时,在两个阶段下会发生错误。
JSP 网页 → Servlet 类
Servlet 类处理每一个请求时
在第一阶段时,产生的错误我们称为Translation Time Processing Errors;在第二阶段时,产生的错误我们称为Client Request Time Processing Errors。接下来我们针对这两个阶段产生错误的原因和处理方法,进行介绍。
1、 Translation Time Processing Errors
Translation Time Processing Errors 产生的主要原因:我们在撰写JSP时的语法有错误,导致JSP Container 无法将JSP 网页编译成Servlet 类文件( .class),例如:500 Internal Server
Error,500 是指HTTP 的错误状态码,因此是Server Error。
通常产生这种错误时,可能是JSP 的语法有错误,或是JSP Container 在一开始安装、设定时,有不适当的情形发生。解决的方法就是再一次检查程序是否有写错的,不然也有可能是JSPContainer 的bug。
2、 Client Request Time Processing Errors
Client Request Time Processing Errors 错误的发生,往往不是语法错误,而可能是逻辑上的错误,简单地说,你写一个计算除法的程序,当用户输入的分母为零时,程序会发生错误并抛出异常(Exception),交由异常处理(Exception Handling)机制做适当的处理。对于这种错误的处理,我们通常会交给errorPage 去处理。下面举个例子:
使用errorPage 的范例程序 :ErrorPage.jsp
<%@ page contentType="text/html;charset=GB2312" errorPage="Error.jsp" %> //设置Error.jsp页为本页的错误处理页
<html>
<head>
<title>CH4 - ErrorPage.jsp</title>
</head>
<body>
<h2>errorPage 的范例程序</h2>
<%!
private double toDouble(String value)
{
return(Double.valueOf(value).doubleValue());
}
%>
<%
double num1 = toDouble(request.getParameter("num1"));
double num2 = toDouble(request.getParameter("num2"));
%>
您传入的两个数字为:<%= num1 %> 和 <%= num2 %><br>
两数相加为 <%= (num1+num2) %>
</body>
</html>
ErrorPage.jsp 程序中,我们使用page 指令中的errorPage 属性,告诉JSP Container,如果在程序中有错误产生时(指的是servlet运行时产生的错误或显示用throw抛出的异常),会自动交给Error.jsp 处理。
Error.jsp
<%@ page contentType="text/html;charset=GB2312" isErrorPage="true" %> //设置该页为错误处理页
<%@ page import="java.io.PrintWriter" %>
<html>
<head>
<title>CH4 - Error.jsp</title>
</head>
<body>
<h2>errorPage 的范例程序</h2>
<p>ErrorPage.jsp 错误产生:<I><%= exception %></I></p><br>
<pre>
问题如下:<% exception.printStackTrace(new PrintWriter(out)); %> //输出错误的原因
</pre>
</body>
</html>
Error.jsp 主要处理ErrorPage.jsp 所产生的错误,所以在ErrorPage.jsp 中page 指令的属性errorPage设为Error.jsp,因此,若ErrorPage.jsp有错误发生时,会自动转到Error.jsp来处理。Error.jsp 必须设定page 指令的属性isErrorPage为true,因为Error.jsp是专门用来处理错误的网页。设定page 指令的属性isErrorPage为true后,在Error.jsp里就可以使用exception异常类了。
由于在这个程序中并没有做一个窗体来输入两个数字,所以必须手动在URL后输入num1和num2的值,如http://localhost:8080/ErrorPage.jsp?num1=100&num2=245。当ErrorPage.jsp 产生错误时(如加数为字符串型),就会交由Error.jsp 去处理,所以我们看到的结果,不
再是原始的服务器提示的乱七把糟的错误提示,将是执行Error.jsp 后的结果。
在jsp中显式地抛出异常时,系统也会转到错误处理页面:
<%@page language="java" contentType="text/html;charset=GBK" import= "java.util.* " errorPage="exception.jsp"
%>
<jsp:useBean id="user" scope="session" class="S_userObj"/>
<%
if(user= =null)
throw new Exception("您没有登陆或者登陆超时,请重新登陆");
。。。 。。。
当user为空时系统会自动转到错误处理页面。
总之,以下情况jsp会转到错误处理页面:
前提:jsp成功的转换到了servlet,转换过程中没有发生错误。
当servlet运行时,程序中碰到异常。
当servlet运行时,程序控制转到了显式抛出的异常。例如:if(…) throw new exception();