JSP異常處理 – JSP錯誤頁面

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

JSP中的异常处理

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

JSP错误页面

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

JSP 錯誤頁面配置

我們需要設置頁面指示符errorPage屬性,以定義由 JSP 服務方法拋出的任何異常所處理的 JSP。當 JSP 錯誤頁面轉換為 servlet 代碼時,在 Tomcat 中它會擴展org.apache.jasper.runtime.HttpJspBase

錯誤頁面部署描述符配置

大多數情況下,我們有一個通用的錯誤頁面,我們想要將其用於所有的 JSP,因此我們可以在 web.xml 中使用error-page元素定義錯誤頁面,而不是在所有 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>

請注意,如果輸入參數為null或空,則會拋出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頁面指示屬性值為true。當應用程序資源拋出異常時,錯誤代碼為500,代碼被編寫來處理應用程序級別的異常以及404 – 找不到頁面等錯誤。還要注意,在任何異常情況下,使用包含指令來呈現用戶的登錄頁面。以下是我們為應用程序定義錯誤頁面的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錯誤頁面 用於404錯誤代碼的JSP錯誤頁面 對於JSP頁面的異常處理就是這樣,實現起來非常容易,我們應該使用它來確保處理所有的異常和錯誤代碼,並向客戶發送有用的響應,而不是容器的默認錯誤頁面。

Source:
https://www.digitalocean.com/community/tutorials/jsp-exception-handling-jsp-error-page