Struts提供了一個更簡單的方式來處理未捕獲的異常將用戶重定向到一個專門的錯誤頁麵。您可以輕鬆地配置Struts不同的execeptions有不同的錯誤頁麵。
Struts所使用的“異常”攔截器的異常處理容易。 “例外”攔截器作為默認的堆棧的一部分,所以不需要做任何額外的配置。它是可利用的盒準備好使用。
讓我們來看看一個簡單的Hello World的例子在HelloWorldAction.java文件進行一些修改。在這裡,我們特意推出了一個空指針異常我們的 HelloWorldAction動作代碼。
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; } }
讓我們保持的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.tutorialspoint.struts2.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
現在,右鍵點擊項目名稱,並單擊“導出”> WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啟動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫麵:
Enter a value "Struts2" and submit the page. You should see the following page:
在上麵的例子中,默認的異常攔截器做了偉大的工作,處理異常。現在,讓我們創建一個專門的錯誤頁麵,我們的異常。創建一個名為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.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>
在上麵的例子中所示,現在我們已經配置的NullPointerException異常的Struts使用專用的error.jsp的。如果你現在重新運行該程序,你會看到下麵的輸出:
此外,Struts2框架的“記錄”攔截記錄異常。使記錄器記錄的未捕獲的異常,我們可以很容易地在堆棧跟蹤,工作出了什麼差錯。
我們已經看到了行動,我們可以處理特定的異常。我們可以設置一個異常,全球將適用於所有的動作。例如,為了捕捉同樣的NullPointerException異常,我們可以添加<global-exception-mappings...>標簽,的內部<package...>標簽,其<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">
<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>