Struts提供了一種更簡單的方法來處理未捕獲的異常,并將用戶重定向到專門的錯誤頁面。你可以很輕松地配置Struts為不同的異常顯示不同的錯誤頁面。
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的內(nèi)容如下:
<%@ 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應(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="cn.w3cschool.struts2.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
現(xiàn)在右鍵單擊項(xiàng)目名稱,然后單擊“Export”>“WAR File”創(chuàng)建WAR文件。然后在Tomcat的webapps目錄中部署這個WAR文件。最后,啟動Tomcat服務(wù)器并嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。將顯示如下頁面:
輸入值“Struts2”并提交頁面。你應(yīng)該看到以下頁面:
如上面的例子所示,默認(rèn)exception攔截器處理異常的工作非常好。現(xiàn)在讓我們?yōu)楫惓?chuàng)建一個專門的錯誤頁面,一個名為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在異常情況下使用此錯誤頁面,修改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>
如上面的例子所示,現(xiàn)在我們已經(jīng)配置Struts為NullPointerException使用專門的Error.jsp。如果現(xiàn)在重新運(yùn)行程序,將看到以下輸出頁面:
除此之外,Struts2框架還帶有一個“l(fā)ogging”攔截器來記錄異常。通過啟用記錄器記錄未捕獲的異常,我們可以輕松地查看堆棧跟蹤記錄,并找出哪里出錯了。
我們已經(jīng)看到了如何處理特定于action的異?!,F(xiàn)在,我們可以設(shè)置一個全局異常,這將應(yīng)用于所有的action。例如,為了捕獲相同的NullPointerException異常,我們可以在<package...>標(biāo)簽中添加<global-exception-mappings...>標(biāo)簽,并在struts.xml文件的<action...>標(biāo)簽中添加<result...>標(biāo)簽,如下:
<?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>
更多建議: