Struts 2 - 异常处理

Struts 提供了一种更简单的方法来处理未捕获的异常并将用户重定向到专用的错误页面.您可以轻松地将Struts配置为针对不同的异常具有不同的错误页面.

Struts通过使用"异常"拦截器使异常处理变得容易. "异常"拦截器作为默认堆栈的一部分包含在内,因此您无需执行任何额外的配置.它是开箱即用的,随时可供您使用.

让我们看一个简单的Hello World示例,并在HelloWorldAction.java文件中进行一些修改.在这里,我们在 HelloWorldAction 动作代码中故意引入了NullPointer异常.

package com.it1352.struts2; 
import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{
   private String name;

   public String execute(){
      String x = null;
      x = x.substring(0);
      return SUCCESS;
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

让我们保持 HelloWorld.jsp 的内容如下 :

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

以下是 index.jsp :

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

你的 struts.xml 应该看起来像 :

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
     
      <action name = "hello" 
         class = "com.IT屋.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

现在右键单击项目名称,然后单击导出> WAR文件以创建War文件.然后在Tomcat的webapps目录中部署此WAR.最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp .这将生成以下屏幕 :

Hello World Input

输入值"Struts2"并提交页面.您应该看到以下页面 :

异常输出

如图所示在上面的例子中,默认的异常拦截器可以很好地处理异常.

现在让我们为异常创建一个专用的错误页面.创建一个名为 Error.jsp 的文件,其中包含以下内容 :

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
	pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title></title>
   </head>
   
   <body>
      This is my custom error page
   </body>
</html>

现在让我们配置Struts,以便在发生异常时使用此错误页面.让我们修改 struts.xml ,如下 :

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
   
      <action name = "hello" 
         class = "com.IT屋.struts2.HelloWorldAction" 
         method = "execute">
         <exception-mapping exception = "java.lang.NullPointerException"
         result = "error" />
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/Error.jsp</result>
      </action>

   </package>
</struts>

如上例所示,现在我们已经将Struts配置为使用专用的Error.jsp进行NullPointerException.如果你现在重新运行程序,你现在应该看到以下输出 :

Hello World Output

除此之外,Struts2框架还带有一个"日志记录"拦截器来记录异常.通过启用记录器来记录未捕获的异常,我们可以轻松查看堆栈跟踪并找出出错的地方

全局异常映射

我们已经看到我们如何处理特定行动的异常.我们可以在全局范围内设置一个适用于所有操作的例外.例如,要捕获相同的NullPointerException异常,我们可以在< package ...>中添加< global-exception-mappings ...> 标记.标签及其< result ...>标签应该添加到< action ...>内struts.xml文件中的标记如下 :

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <global-exception-mappings>
         <exception-mapping exception = "java.lang.NullPointerException"
         result = "error" />
      </global-exception-mappings>

      <action name = "hello" 
         class = "com.IT屋.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/Error.jsp</result>
      </action>

   </package>
</struts>