Struts 提供了一種簡(jiǎn)單的方式來(lái)處理未捕獲的異常,并將用戶重定向到一個(gè)專門(mén)的錯(cuò)誤頁(yè)面。你可以簡(jiǎn)單的配置 Struts,使得不同的異常有不同的錯(cuò)誤頁(yè)面。
Struts 通過(guò)使用“異?!睌r截器來(lái)使異常處理變得簡(jiǎn)單?!爱惓!睌r截器是默認(rèn)的棧的一部分,所以配置它你不需要做額外的工作。它為你的使用已經(jīng)做好了準(zhǔn)備,開(kāi)箱即用。讓我們看一個(gè)簡(jiǎn)單的 Hello World 實(shí)例,在 HelloWorldAction.java 文件中帶有一些修改。在這里我們?cè)?HelloWorldAction 操作代碼中有意的引入一個(gè) NullPointer 異常。
package com.tutorialspoint.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;
}
}
讓我們將下入內(nèi)容保存到 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 中的內(nèi)容:
<%@ 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 文件看起來(lái)應(yīng)該如下所示:
<?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.tutorialspoint.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
現(xiàn)在鼠標(biāo)右鍵單擊項(xiàng)目名并點(diǎn)擊 Export > WAR File 來(lái)創(chuàng)建一個(gè) War 文件。然后把這個(gè) WAR 部署到 Tomcat 的 web 應(yīng)用程序目錄中。最后,啟動(dòng) Tomcat 服務(wù)器并嘗試訪問(wèn) URL http://localhost:8080/HelloWorldStruts2/index.jsp
. 這將呈現(xiàn)如下所示的畫(huà)面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts4.jpg" alt="" />
輸入值 "Struts2" 并提交頁(yè)面。你應(yīng)該能看到如下所示的頁(yè)面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts16.jpg" alt="" />
正如上述例子顯示的一樣,默認(rèn)的異常攔截器做了許多處理異常的工作?,F(xiàn)在讓我們?yōu)槲覀兊漠惓?chuàng)建一個(gè)專門(mén)的錯(cuò)誤頁(yè)面。創(chuàng)建一個(gè)名為 Error.jsp 的文件,其內(nèi)容如下所示:
<%@ 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>
現(xiàn)在讓我們配置 Struts 來(lái)在異常的情況下使用這個(gè)錯(cuò)誤頁(yè)面。讓我們修改 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.tutorialspoint.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>
正如上述例子顯示的一樣,現(xiàn)在我們已經(jīng)配置了 Struts 來(lái)為 NullPointerException 使用專門(mén)的 Error.jsp. 如果現(xiàn)在你重新運(yùn)行這個(gè)程序,你應(yīng)該能看到如下所示的輸出:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts17.jpg" alt="" />
此外,Struts2 框架會(huì)生成一個(gè) "logging" 攔截器來(lái)記錄異常。通過(guò)使記錄器記錄未捕獲的異常,我們可以很容易的查看棧跟蹤并找到哪里出現(xiàn)了錯(cuò)誤。
我們已經(jīng)了解了如何處理操作指定的異常。我們可以設(shè)置一個(gè)全局異常,能夠應(yīng)用帶所有的操作中。例如,為了捕獲相同的 NullPointerException 異常,我們可以在
<?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.tutorialspoint.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
<result name="error">/Error.jsp</result>
</action>
</package>
</struts>