Struts2异常处理示例教程
异常在任何应用程序中都很常见。
我们尝试捕获并处理它,但有时我们的应用程序无法处理它,并将其扔到容器中。
Struts2提供了一种健壮的机制,通过该机制,我们可以在应用程序抛出任何异常时向客户端提供自定义响应。
我们知道Struts2拦截器就像servlet过滤器一样,提供请求的预处理和应用程序响应的后处理。
Struts2通过com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor
拦截器提供异常处理支持。
该拦截器是basicStack和defaultStack拦截器堆栈的一部分,因此我们无需为应用程序使用配置它们。
我们可以通过global-exception-mappings和global-results在包级别提供异常处理,并且可以在操作映射中使用异常映射进行操作级别的异常处理。
我们需要提供结果页面以用于不同的异常情况。
让我们尝试通过一个简单的应用程序来了解它的用法。
我们将创建一个动态Web项目,然后将其配置为Maven项目。
我们的项目结构如下图所示。
Struts2的Web应用程序配置
在pom.xml文件中添加struts2依赖项,如下所示。
<dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.15.1</version> </dependency> </dependencies>
部署描述符文件中的Struts2过滤器配置。
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>Struts2Exception</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
动作类
我们将创建一些动作类,它们的唯一目的是引发一些异常。
package com.theitroad.struts2.exception; import com.opensymphony.xwork2.ActionSupport; public class MyAction extends ActionSupport { private static final long serialVersionUID = 1L; @Override public String execute(){ throw new NullPointerException("Mandatory data missing"); } }
package com.theitroad.struts2.exception; import java.io.IOException; import com.opensymphony.xwork2.ActionSupport; public class MySpecialAction extends ActionSupport { private static final long serialVersionUID = 1L; @Override public String execute() throws IOException{ throw new IOException("IOException occured"); } }
Struts2配置
我们正在struts.xml配置文件中配置程序包级别的异常处理和操作级别的异常处理。
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "https://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <constant name="struts.convention.result.path" value="/"></constant> <package name="user" namespace="/" extends="struts-default"> <global-results> <result name="exception">/exception.jsp</result> <result name="runtime_exception">/runtime_exception.jsp</result> <result name="error">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="exception"></exception-mapping> <exception-mapping exception="java.lang.Error" result="error"></exception-mapping> <exception-mapping exception="java.lang.RuntimeException" result="runtime_exception"></exception-mapping> </global-exception-mappings> <action name="myaction" class="com.theitroad.struts2.exception.MyAction"> </action> <action name="myspecialaction" class="com.theitroad.struts2.exception.MySpecialAction"> <exception-mapping exception="java.io.IOException" result="login"></exception-mapping> <result name="login">/error.jsp</result> </action> </package> </struts>
注意,我们需要定义全局结果页面,以将全局级别的异常映射到结果页面。
对于操作级别的异常处理,我们需要在操作映射中定义结果页面。
由于没有为" MyAction"映射的异常结果页面,并且抛出了" NullPointerException",因此具有异常映射的最接近的基类是" RuntimeException",因此它应该返回runtime_exception.jsp页面。
对于向MySpecialAction抛出IOException抛出的异常,将定义结果页面,并返回error.jsp页面。
让我们编写这些JSP页面并确认此行为。
JSP页面
runtime_exception.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd"> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Runtime Exception Page</title> </head> <body> Some Runtime Exception Occured!!<br> Runtime Exception Name: <s:property value="exception"<br> Runtime Exception Stack Trace: <br> <s:property value="exceptionStack" </body> </html>
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd"> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Error Page</title> </head> <body> Some Error Occured!!<br> Error Name: <s:property value="exception"<br> Error Stack Trace: <br> <s:property value="exceptionStack" </body> </html>
请注意,我们已经为所有java.lang.Exception
的结果页定义了exception.jsp,但是由于没有异常与之最接近,因此没有使用它。