Struts2 異常處理

2022-07-08 11:37 更新

Struts提供了一種更簡單的方法來處理未捕獲的異常,并將用戶重定向到專門的錯誤頁面。你可以很輕松地配置Struts為不同的異常顯示不同的錯誤頁面。
Struts通過使用“exception”攔截器來使異常處理變得簡單?!癳xception”攔截器被作為默認(rèn)堆棧的一部分包含其中,所以你不必對它做任何額外的配置。它提供開箱即用的功能可供使用。讓我們看一個簡單的Hello World示例,在HelloWorldAction.java文件中進(jìn)行一些修改。在這里我們有意的給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的內(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。將顯示如下頁面:

Hello World輸入

輸入值“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)行程序,將看到以下輸出頁面:

Hello World輸出

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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號