Struts 2 异常处理
Struts 提供了一种更简单的方法来处理未捕获的异常并将用户重定向到专用的错误页面。 我们可以轻松地将 Struts 配置为具有针对不同异常的不同错误页面。
Struts 通过使用“异常”拦截器使异常处理变得容易。 “异常”拦截器作为默认堆栈的一部分包含在内,因此我们无需执行任何额外操作来配置它。 它开箱即用,可供我们使用。
让我们看一个简单的 Hello World 示例,在 HelloWorldAction.java 文件中进行了一些修改。 这里,我们特意在 HelloWorldAction 代码中引入了 NullPointer
异常。
package com.jiyik.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
@Override
public String execute() throws Exception {
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 contentType="text/html;charset=UTF-8" language="java" %>
<%@ 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">请输入您的姓名</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" namespace="/">
<action name = "hello"
class = "com.jiyik.struts2.action.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
然后启动我们的项目,访问的界面如下所示
输入值“Struts2”并提交页面。 我们应该看到以下页面
如上例所示,默认的异常拦截器在处理异常方面做得很好。
现在让我们为我们的异常创建一个专用的错误页面。 创建一个名为 Error.jsp 的文件,其内容如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>错误页面</title>
</head>
<body>
这是一个自定义错误页面
</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" namespace="/">
<action name = "hello"
class = "com.jiyik.struts2.action.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。 如果我们现在重新运行程序,现在将看到以下输出界面
除此之外,Struts2 框架带有一个“日志”拦截器来记录异常。 通过启用记录器来记录未捕获的异常,我们可以轻松查看堆栈跟踪并找出问题所在
全局异常映射
我们已经看到了如何处理特定于操作的异常。 我们可以全局设置一个 Exception ,该 Exception 将适用于所有操作。 例如,要捕获相同的 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" namespace="/">
<global-exception-mappings>
<exception-mapping exception = "java.lang.NullPointerException"
result = "error" />
</global-exception-mappings>
<action name = "hello"
class = "com.jiyik.struts2.action.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/error.jsp</result>
</action>
</package>
</struts>