鍍金池/ 教程/ Java/ 異常處理
注釋
主題/模板
驗(yàn)證
有用的資源
Struts 2 注解類型
實(shí)例
攔截器
異常處理
表單標(biāo)簽
結(jié)果類型
值棧/OGNL
Spring 集成
數(shù)據(jù)標(biāo)簽
環(huán)境配置
配置
類型轉(zhuǎn)換
動(dòng)作
Hibernate 集成
本地化
發(fā)送郵件
Ajax 標(biāo)簽
數(shù)據(jù)庫(kù)訪問(wèn)
體系結(jié)構(gòu)
文件上傳
Tiles 集成
概述
基本的 MVC 架構(gòu)
控制標(biāo)簽

異常處理

Struts 提供了一種簡(jiǎn)單的方式來(lái)處理未捕獲的異常,并將用戶重定向到一個(gè)專門(mén)的錯(cuò)誤頁(yè)面。你可以簡(jiǎn)單的配置 Struts,使得不同的異常有不同的錯(cuò)誤頁(yè)面。

Struts 通過(guò)使用“異?!睌r截器來(lái)使異常處理變得簡(jiǎn)單?!爱惓!睌r截器是默認(rèn)的棧的一部分,所以配置它你不需要做額外的工作。它為你的使用已經(jīng)做好了準(zhǔn)備,開(kāi)箱即用。讓我們看一個(gè)簡(jiǎn)單的 Hello World 實(shí)例,在 HelloWorldAction.java 文件中帶有一些修改。在這里我們?cè)?HelloWorldAction 操作代碼中有意的引入一個(gè) NullPointer 異常。

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;
   }
}

讓我們將下入內(nèi)容保存到 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 中的內(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 文件看起來(lái)應(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="com.tutorialspoint.struts2.HelloWorldAction" 
         method="execute">
         <result name="success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>

現(xiàn)在鼠標(biāo)右鍵單擊項(xiàng)目名并點(diǎn)擊 Export > WAR File 來(lái)創(chuàng)建一個(gè) War 文件。然后把這個(gè) WAR 部署到 Tomcat 的 web 應(yīng)用程序目錄中。最后,啟動(dòng) Tomcat 服務(wù)器并嘗試訪問(wèn) URL http://localhost:8080/HelloWorldStruts2/index.jsp. 這將呈現(xiàn)如下所示的畫(huà)面:

http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts4.jpg" alt="" />

輸入值 "Struts2" 并提交頁(yè)面。你應(yīng)該能看到如下所示的頁(yè)面:

http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts16.jpg" alt="" />

正如上述例子顯示的一樣,默認(rèn)的異常攔截器做了許多處理異常的工作?,F(xiàn)在讓我們?yōu)槲覀兊漠惓?chuàng)建一個(gè)專門(mén)的錯(cuò)誤頁(yè)面。創(chuàng)建一個(gè)名為 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 來(lái)在異常的情況下使用這個(gè)錯(cuò)誤頁(yè)面。讓我們修改 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>

正如上述例子顯示的一樣,現(xiàn)在我們已經(jīng)配置了 Struts 來(lái)為 NullPointerException 使用專門(mén)的 Error.jsp. 如果現(xiàn)在你重新運(yùn)行這個(gè)程序,你應(yīng)該能看到如下所示的輸出:

http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts17.jpg" alt="" />

此外,Struts2 框架會(huì)生成一個(gè) "logging" 攔截器來(lái)記錄異常。通過(guò)使記錄器記錄未捕獲的異常,我們可以很容易的查看棧跟蹤并找到哪里出現(xiàn)了錯(cuò)誤。

全局異常映射

我們已經(jīng)了解了如何處理操作指定的異常。我們可以設(shè)置一個(gè)全局異常,能夠應(yīng)用帶所有的操作中。例如,為了捕獲相同的 NullPointerException 異常,我們可以在 標(biāo)簽內(nèi)部添加 標(biāo)簽且它的 標(biāo)簽應(yīng)該被添加到 struts.xml 文件的 標(biāo)簽內(nèi),如下所示:

<?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>
上一篇:有用的資源下一篇:注釋