JSP异常处理 – JSP错误页面

在JSP中,异常处理是通过JSP异常页面来完成的。

JSP中的异常处理

前些时候,我写了一篇关于Servlet异常处理以及为什么我们需要它的文章。相同的解释也适用于JSP页面,这就是为什么Java EE在JSP中使用JSP错误页面提供了明确的异常处理方法。要处理JSP页面抛出的异常,我们只需要一个错误页面并在JSP中使用JSP页面指令来定义错误页面。

JSP错误页面

为了创建一个JSP错误页面,我们需要将页指令属性isErrorPage的值设置为true,然后我们可以在JSP中访问异常jsp隐式对象,并使用它向客户端发送自定义的错误消息。

JSP错误页面配置

我们需要设置页面指令errorPage属性,以定义JSP服务方法抛出的任何异常将由哪个JSP处理。当将JSP错误页面转换为Tomcat中的Servlet代码时,它将扩展org.apache.jasper.runtime.HttpJspBase。

错误页面部署描述符配置

大多数情况下,我们有一个通用的错误页面,我们希望所有JSP都能使用它,因此我们可以在web.xml中使用error-page元素定义错误页面,而不是在每个JSP中单独配置它。我们还可以配置JSP错误页面来处理其他错误代码,比如404。让我们看看在Web应用程序中如何将它们结合起来。我们将创建一个名为JSPExceptionHandling的简单Web应用程序,其项目结构如下图所示。应用程序的入口点是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>

注意,如果输入参数为空或者为null,将抛出一个带有正确信息的ServletException,错误页被定义为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 页面指令属性值为 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页面异常处理的全部内容,它非常容易实现,我们应该使用它来确保我们处理所有的异常和错误码,并向客户端发送有用的响应,而不是使用容器默认错误页面。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds