JSP 异常处理 - JSP 错误页面
JSP 中的异常处理由 JSP 异常页面完成。
JSP 中的异常处理
前段时间,我写了一篇关于Servlet 异常处理以及我们为什么需要它的文章。同样的解释也适用于 JSP 页面,这就是为什么 Java EE 使用 JSP 错误页面为 JSP 中的异常处理提供了一种清晰的方法。要处理 JSP 页面抛出的异常,我们需要的只是一个错误页面,并使用jsp page 指令在 JSP 中定义错误页面。
JSP 错误页面
要创建 JSP 错误页面,我们需要将页面指令属性isErrorPage值设置为 true,然后我们可以在 JSP 中访问异常jsp 隐式对象并使用它将定制的错误消息发送到客户端。
JSP 错误页面配置
我们需要设置页面指令errorPage属性来定义将处理 JSP 服务方法抛出的任何异常的 JSP。当 JSP 错误页面被转换为 servlet 代码时,它会org.apache.jasper.runtime.HttpJspBase
在 Tomcat 中扩展。
错误页面部署描述符配置
大多数情况下,我们有一个通用的错误页面,我们希望将其用于所有 JSP,因此,我们可以使用 error -page元素在 web.xml 中定义错误页面,而不是在所有 JSP 中单独配置它。我们还可以配置 JSP 错误页面来处理其他错误代码,例如 404。让我们看看所有这些如何在 Web 应用程序中组合在一起。我们将创建一个简单的 Web 应用程序 JSPExceptionHandling,其项目结构如下图所示。应用程序的入口点是index.jsp
其代码如下所示。
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Page</title>
</head>
<body>
<form action="login.jsp" method="post">
<strong>User ID</strong>:<input type="text" name="id"><br>
<strong>Password</strong>:<input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
当我们提交表单时,请求将被发送到login.jsp
,代码如下所示。
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII" errorPage="error.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>User Home Page</title>
</head>
<body>
<%
String user = request.getParameter("id");
String pwd = request.getParameter("password");
if(user == null || "".equals(user) || pwd == null || "".equals(pwd)){
throw new ServletException("Mandatory Parameter missing");
}
%>
<%-- do some DB processing, not doing anything for simplicity --%>
Hi <%=user %>
</body>
</html>
请注意,如果输入参数为空或为空,则会抛出ServletException
适当的消息,其代码errorPage
定义如下。error.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Error Page</title>
</head>
<body>
<% if(response.getStatus() == 500){ %>
<font color="red">Error: <%=exception.getMessage() %></font><br>
<%-- include login page --%>
<%@ include file="index.jsp"%>
<%}else {%>
Hi There, error code is <%=response.getStatus() %><br>
Please go to <a href="/index.jsp">home page</a>
<%} %>
</body>
</html>
请注意,isErrorPage
page 指令的属性值为true
。当应用程序资源抛出异常时,错误代码为 500,代码用于处理应用程序级异常和 404(页面未找到)等错误。还请注意,如果出现任何异常,include 指令的使用会向用户显示登录页面。以下是 web.xml,我们在此定义应用程序的错误页面。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>JSPExceptionHandling</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
</web-app>
现在,当我们运行上述应用程序时,我们会得到以下页面作为响应。登录页面 JSP 异常错误页面JSP 404 错误代码错误页面这就是 JSP 页面中所有异常处理,它非常容易实现,我们应该使用它来确保我们处理所有异常和错误代码,并向客户端发送有用的响应,而不是容器默认错误页面。