Struts2异常处理示例教程

时间:2020-02-23 14:36:05  来源:igfitidea点击:

异常在任何应用程序中都很常见。
我们尝试捕获并处理它,但有时我们的应用程序无法处理它,并将其扔到容器中。
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,但是由于没有异常与之最接近,因此没有使用它。