异常处理(Exception Handling)
Struts提供了一种更简单的方法来处理未捕获的异常并将用户重定向到专用的错误页面。 您可以轻松地将Struts配置为针对不同的异常具有不同的错误页面。
Struts通过使用“异常”拦截器使异常处理变得容易。 “异常”拦截器作为默认堆栈的一部分包含在内,因此您无需执行任何额外的配置。 它开箱即用,随时可供您使用。
让我们看一个简单的Hello World示例,在HelloWorldAction.java文件中进行一些修改。 在这里,我们故意在HelloWorldAction动作代码中引入了NullPointer异常。
package cn.xnip.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 = "cn.xnip.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
现在右键单击项目名称,然后单击“ Export 》 WAR File以创建War文件。 然后在Tomcat的webapps目录中部署此WAR。 最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp 。 这将产生以下屏幕 -
![Hello World输入](https://imgs.xnip.cn/cj/docimg/3/4268d8ac-84c4-4d16-a97e-92f991c7ee78.jpg)
输入值“Struts2”并提交页面。 你应该看到以下页面 -
![异常输出](https://imgs.xnip.cn/cj/docimg/3/05716cbe-78a4-4abb-8a2f-94a7da050e63.jpg)
如上例所示,默认的异常拦截器可以很好地处理异常。
现在让我们为Exception创建一个专用的错误页面。 使用以下内容创建名为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 = "cn.xnip.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输出](https://imgs.xnip.cn/cj/docimg/3/0774944b-5365-4031-807d-81b3a4f3e141.jpg)
除此之外,Struts2框架还带有一个“日志记录”拦截器来记录异常。 通过启用记录器来记录未捕获的异常,我们可以轻松查看堆栈跟踪并找出出错的地方
全局异常映射
我们已经看到了如何处理特定于行动的异常。 我们可以在全局范围内设置一个适用于所有操作的例外。 例如,要捕获相同的NullPointerException异常,我们可以在“package ...”标记内添加《global-exception-mappings...》 ...”标记,并在“action ...”中添加“result ...”标记。 。“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 = "cn.xnip.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/Error.jsp</result>
</action>
</package>
</struts>