JSP异常处理
在异常处理页中处理异常
JSP在运行时抛出的异常,可以通过下面的指令将请求转发给另一个专门处理异常的网页:
<%@ page errorPage="errorpage.jsp" %>
errorpage.jsp是一个专门负责处理异常的网页,在这个处理异常的网页中,必须通过如下语句将该网页声明为异常处理网页:
<%@ page is ErrorPage="true" %>
用于处理异常的网页可以直接访问exception隐含对象,获取当前异常的详细信息,例如:
<p>
The error is caused by: <% exception.printStackTrace(new PrintWriter(out)); %>
</p>
抛出异常的JSP文件与处理异常的JSP文件之间为请求转发关系,因此它们可以共享请求范围内的共享数据。
示例:
创建一个可能会抛出异常的JSP网页generate_error_page.jsp,其中的代码可能会抛出一个异常;容器会自动把客户请求转发到异常处理也error_page.jsp:
generator_error_page.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page errorPage="error_page.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Generate Error Page JSP</title>
</head>
<body>
<%-- Declare a member method, method: valueOf will throw an exception --%>
<%!
private int toInt(String num){
return Integer.valueOf(num).intValue();
}
%>
<%
int num = toInt(request.getParameter("num"));
%>
<p>
The result is <%= num %>
</p>
</body>
</html>
error_page.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page isErrorPage="true" %>
<%@ page import="java.io.PrintWriter" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<p>
The parameter <%= request.getParameter("num") %> is invalid.
</p>
<p>
The error is caused by: <br/>
<% exception.printStackTrace(new PrintWriter(out)); %>
</p>
</body>
</html>
在浏览器中请求如下URL:
http://localhost:8080/base-webapp/jsp/generate_error_page.jsp?num=123
未抛出异常,页面显示如下:
更改URL参数的值为一个非整数值,
http://localhost:8080/base-webapp/jsp/generate_error_page.jsp?num=123test
参数值违法,将输出一个异常页面:
在当前JSP页中处理异常
另外,我们也可以在当前JSP页面中捕获该异常,而不交由error page处理该异常:
修改generate_error_page.jsp为:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page errorPage="error_page.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Generate Error Page JSP</title>
</head>
<body>
<%-- Declare a member method, method: valueOf will throw an exception --%>
<%!
private int toInt(String num){
return Integer.valueOf(num).intValue();
}
%>
<%
int num = 0;
try{
num = toInt(request.getParameter("num"));
}catch(Exception e){
e.printStackTrace();
}
%>
<p>
The result is <%= num %>
</p>
</body>
</html>
再次以错误参数访问该JSP,则页面正常输出,产生的异常将会写到容器的log中: