Struts - 异常处理



  • 简述

    Struts提供了一种更简单的方法来处理未捕获的异常并将用户重定向到专用的错误页面。您可以轻松地将 Struts 配置为针对不同的异常具有不同的错误页面。
    Struts 通过使用“异常”拦截器使异常处理变得容易。“异常”拦截器作为默认堆栈的一部分包含在内,因此您无需执行任何额外操作即可对其进行配置。它是开箱即用的,可供您使用。
    让我们看一个简单的 Hello World 示例,在 HelloWorldAction.java 文件中做了一些修改。在这里,我们特意在我们的HelloWorldAction 动作代码。
    
    package com.jc2182.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.jc2182.struts2.HelloWorldAction" 
             method = "execute">
             <result name = "success">/HelloWorld.jsp</result>
          </action>
       </package>
    </struts>
    
    现在右键单击项目名称并单击 Export > WAR File创建一个战争文件。然后将此 WAR 部署到 Tomcat 的 webapps 目录中。最后,启动Tomcat服务器并尝试访问URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. 这将产生以下屏幕 -
    你好世界输入
    输入值“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.jc2182.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 配置为对 NullPointerException 使用专用的 Error.jsp。如果您现在重新运行程序,您将看到以下输出 -
    你好世界输出
    除此之外,Struts2 框架附带了一个“日志记录”拦截器来记录异常。通过启用记录器来记录未捕获的异常,我们可以轻松查看堆栈跟踪并找出问题所在
  • 全局异常映射

    我们已经看到了如何处理特定于动作的异常。我们可以在全局范围内设置一个适用于所有操作的异常。例如,要捕获相同的 NullPointerException 异常,我们可以添加<global-exception-mappings...> <package...> 标记内的标记及其 <result...> 标记应添加到 struts.xml 文件中的 <action...> 标记内,如下所示 -
    
    <?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.jc2182.struts2.HelloWorldAction" 
             method = "execute">
             <result name = "success">/HelloWorld.jsp</result>
             <result name = "error">/Error.jsp</result>
          </action>
       </package>
    </struts>