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代码时,它将扩展Tomcat中的" org.apache.jasper.runtime.HttpJspBase"。
错误页面部署描述符配置
大多数情况下,我们有一个通用错误页面,我们希望将其用于所有JSP,因此,我们可以在web.xml中使用error-page元素定义错误页面,而不是在所有JSP中单独配置它。
我们可以配置JSP错误页面来处理其他错误代码,例如404。
让我们看看所有这些如何在网络应用程序中融合在一起。
我们将创建一个简单的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"> User ID:<input type="text" name="id"><br> Password:<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或者为空,则将其抛出带有适当消息和errorPage的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>