天天看點

(十八)Struts2 異常處理

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。将顯示如下頁面:

(十八)Struts2 異常處理

輸入值“Struts2”并送出頁面。你應該看到以下頁面:

(十八)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 異常處理

除此之外,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>