Struts提供了一種更簡單的方法來處理未捕獲的異常,并将使用者重定向到專門的錯誤頁面。你可以很輕松地配置Struts為不同的異常顯示不同的錯誤頁面。
Struts通過使用“exception”攔截器來使異常處理變得簡單。“exception”攔截器被作為預設堆棧的一部分包含其中,是以你不必對它做任何額外的配置。它提供開箱即用的功能可供使用。讓我們看一個簡單的Hello World示例,在HelloWorldAction.java檔案中進行一些修改。在這裡我們有意的給HelloWorldAction操作代碼中引入一個NullPointer異常。
package cn.w3cschool.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.w3cschool.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。将顯示如下頁面:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmL0MHd1JHdzRGby92dvxGblh2LcJzXzRXdyR3cvw1ckF2bsBXd09CXzRnbl1GajFGd0F2Lc52Yuw2bvh2YzN2M35yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
輸入值“Struts2”并送出頁面。你應該看到以下頁面:
如上面的例子所示,預設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.w3cschool.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架構還帶有一個“logging”攔截器來記錄異常。通過啟用記錄器記錄未捕獲的異常,我們可以輕松地檢視堆棧跟蹤記錄,并找出哪裡出錯了。
全局異常映射
我們已經看到了如何處理特定于action的異常。現在,我們可以設定一個全局異常,這将應用于所有的action。例如,為了捕獲相同的NullPointerException異常,我們可以在<package...>标簽中添加<global-exception-mappings...>标簽,并在struts.xml檔案的<action...>标簽中添加<result...>标簽,如下:
<?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.w3cschool.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
<result name="error">/Error.jsp</result>
</action>
</package>
</struts>