Struts2 例外處理


Struts提供了一個更簡單的方式來處理未捕獲的異常,並將使用者重定向到一個專門的錯誤頁面。您可以輕鬆地Struts組態到不同的異常有不同的錯誤頁面。

Struts的例外處理所使用的“exception”攔截容易。“exception”攔截器作為預設的棧的一部分,所以不必做任何額外的組態。它可為準備使用的盒。讓我們看到了一個簡單的Hello World範例進行一些修改在HelloWorldAction.java檔案。在這裡,我們特意推出了一個空指標異常在我們HelloWorldAction動作程式碼。

package com.yiibai.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.yiibai.struts2.HelloWorldAction" 
         method="execute">
         <result name="success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

現在右擊專案名稱,並單擊Export > WAR File建立一個WAR檔案。然後部署此WAR在Tomcat的webapps目錄下。最後,啟動Tomcat 伺服器和嘗試存取URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:

Hello World Input

輸入一個值“Struts2”,並提交頁面。應該看到以下頁面:

Exception Output

在上面的例子所示,預設的異常攔截器做了非常出色的處理異常。現在,讓我們建立一個專用的錯誤頁面,我們的例外。建立一個檔案名為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>

Let us now configure Struts to use this this error page in case of an exception. Let us modify thestruts.xml as follows:

<?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.yiibai.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使用專用error.jsp的NullPointerException異常。如果現在重新執行該程式,現在看到下面的輸出:

Hello World Output

此外,Struts2 框架自帶的“紀錄檔”攔截記錄異常。使記錄器記錄的未捕獲異常,我們可以很容易地看堆疊跟蹤和工作出了什麼錯誤。

全域性異常對映:

我們已經看到了我們可以處理特定的異常行動。我們可以設定一個例外,全域性將適用於所有的行動。例如,要捕獲 NullPointerException異常,我們可以新增<global-exception-mappings...>標籤裡面<package...>標籤和其<result...>標籤應加在<行動.. >標記在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.yiibai.struts2.HelloWorldAction" 
         method="execute">
         <result name="success">/HelloWorld.jsp</result>
         <result name="error">/Error.jsp</result>
      </action>

   </package>
</struts>