Struts2教學
Struts2快速入門
Struts2 MVC架構
Struts2 是什麼?
Struts2 環境配置
Struts2 體系結構
Struts2 Hello World 實例
Struts2 配置文件
Struts2 Action/動作
Struts2 攔截器
Struts2 結果和結果類型
Struts2 值棧/OGNL
Struts2 文件上傳
Struts2 MySQL數據庫訪問
Struts2 發送郵件Email
Struts2 驗證框架
Struts2 基於XML校驗
Struts2 本地化/國際化(i18n)
Struts2 類型轉換
Struts2 主題和模板
Struts2 異常處理
Struts2 註釋
Struts2 註釋類型
Struts2 控件標籤
Struts2 iterator標籤
Struts2 if/else標籤
Struts2 merge標籤
Struts2 append標籤
Struts2 generator標籤
Struts2 數據標籤
Struts2 action標籤
Struts2 include標籤
Struts2 bean 標籤
Struts2 date 標籤
Struts2 param 標籤
Struts2 property 標籤
Struts2 set 標籤
Struts2 text 標籤
Struts2 url標籤
Struts2 表單標籤
Struts2 Ajax 標籤
Struts2和Spring集成
Struts2和Tiles集成
Struts2和Hibernate集成
Struts 2 hello world (XML版本)
Struts2註解示例
Struts2 @ResultPath註釋示例
Struts2 include(包含)多個配置文件
Struts2命名空間配置和解釋
Struts2開發者模式
如何刪除Struts2動作的後綴擴展名
使用Struts2動作
Struts2的ActionError&ActionMessage示例
Struts2模型驅動實例
Struts2映射攔截動作
Struts2重寫攔截器參數
Struts2攔截器棧的例子
Struts2 execAndWait攔截器例子
Struts2 <s:textfield>文本示例
Struts2 <s:password>密碼示例
Struts2 <s:hidden>隱藏值例子
Struts2 <s:textarea>文本域實例
Struts2 <s:radio>單選按鈕例子
Struts2單選預選按鈕值
Struts2 <s:checkbox>複選框例子
Struts2設置多個複選框缺省值
Struts2 <s:checkboxlist>多個複選框例子
Struts2 <s:select>下拉框例子
Struts2自動選擇下拉框的值
Struts2 <s:combobox>組合框的例子
Struts2 <s:head>示例
Struts2文件上傳例子
Struts2上傳多個文件例子
Struts2 <s:doubleselect>示例
Struts2 <s:updownselect>示例
Struts2 <s:optiontransferselect>示例
Struts2 <sx:datetimepicker>示例
Struts2 <sx:autocompleter>自動提示例子
Struts2 autocompleter+JSON例子
Struts2 <s:iterator>迭代器標籤示例
Struts2 if,elseif,else標籤示例
struts2 <s:append>標籤示例
Struts2 <s:generator>標籤示例
Struts2 <s:merge>標籤示例
Struts2 <s:sort>標籤示例
Struts2 <s:subset>標籤示例
Struts2 <s:a>標籤示例
Struts2 <s:action>標籤示例
Struts2 <s:bean>標籤示例
Struts2 <s:date>標籤示例
Struts2 <s:debug>標籤示例
Struts2 <s:include>標籤示例
Struts2 <s:i18n>標籤示例
Struts2 <s:param>標籤示例
Struts2 <s:property>標籤實例
Struts2 <s:push>標籤示例
Struts2 <s:set>標籤示例
Struts2 <s:texttag>標籤示例
Struts2 <s:url>標籤示例
Struts2資源包使用示例
Struts2本地化和國際化
Struts2 key鍵屬性示例
Struts2中文本地化問題
如何配置Struts2全局資源包
Struts2+Spring集成實例
Struts2+Quartz2調度集成實例
Struts2+Hibernate使用Full Hibernate Plugin集成
Struts2+Hibernate集成實例
Struts2+Spring+Hibernate集成實例
Struts2+Log4j集成
Struts2的FilterDispatcher和StrutsPrepareAndExecuteFilter有什麼不同?
Struts2獲取HttpServletRequest實例
Struts2獲取HttpServletResponse實例
如何獲取ServletContext對象
Struts2配置Action類的靜態參數
Struts2下載文件實例
Struts2和JSON實例

Struts2 攔截器

攔截器的概念是Servlet過濾器或JDK代理類一樣的。攔截器允許橫切功能分開實現的動作,以及框架。使用攔截器,可以實現如下:

  • 提供預處理行動之前被稱爲邏輯。

  • 提供後處理邏輯動作後被調用

  • 捕獲異常,這樣可以進行替代處理。

Struts2框架提供的許多功能都使用攔截實現的例子包括異常處理,文件上傳,生命週期回調和驗證等事實上作爲Struts2的基礎,其功能攔截,這可能有7或8攔截器分配給每個動作。

Struts2框架的攔截器:

Struts 2框架提供了良好的箱攔截列表來預先設定的,並準備使用。下面列出了幾個重要的攔截:

SN

攔截器 & 描述

1

alias
Allows parameters to have different name aliases across requests.

2

checkbox
Assists in managing check boxes by adding a parameter value of false for check boxes that are not checked.

3

conversionError
Places error information from converting strings to parameter types into the action's field errors.

4

createSession
Automatically creates an HTTP session if one does not already exist.

5

debugging
Provides several different debugging screens to the developer.

6

execAndWait
Sends the user to an intermediary waiting page while the action executes in the background.

7

exception
Maps exceptions that are thrown from an action to a result, allowing automatic exception handling via redirection.

8

fileUpload
Facilitates easy file uploading.

9

i18n
Keeps track of the selected locale during a user's session.

10

logger
Provides simple logging by outputting the name of the action being executed.

11

params
Sets the request parameters on the action.

12

prepare
This is typically used to do pre-processing work, such as setup database connections.

13

profile
Allows simple profiling information to be logged for actions.

14

scope
Stores and retrieves the action's state in the session or application scope.

15

ServletConfig
Provides the action with access to various servlet-based information.

16

timer
Provides simple profiling information in the form of how long the action takes to execute.

17

token
Checks the action for a valid token to prevent duplicate formsubmission.

18

validation
Provides validation support for actions

請看Struts 2文檔的完整細節上面提到的攔截。會告訴如何使用Struts應用程序在一個攔截器。

如何使用攔截器?

讓我們來看看如何使用已有的攔截,我們的「Hello World」程序。我們將使用計時器來測量過了多長時間執行操作方法,其目的是攔截。同時使用params攔截器,其目的是發送請求參數的動作。您可以嘗試不使用這個攔截您的示例中會發現,沒有被設置name屬性,因爲參數是無法達到動作。

我們將繼續HelloWorldAction.java,web.xml 的helloWorld.jsp 和 index.jsp 文件,因爲他們已經建立了範例章節,但讓我們如下修改struts.xml文件,添加一個攔截器

<constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="hello" class="com.yiibai.struts2.HelloWorldAction" method="execute"> <interceptor-ref name="params"/> <interceptor-ref name="timer" /> <result name="success">/HelloWorld.jsp

右鍵點擊項目名稱,並單擊 Export > WAR File 創建一個WAR文件。然後部署在Tomcat 的webapps目錄下這個WAR。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:

Hello

現在,在給定的文本框中輸入單詞,並單擊「Say Hello按鈕執行已定義的動作。現在,如果將檢查生成的日誌,會發現下面的文字:

INFO: Server startup in 3539 ms 27/08/2011 8:40:53 PM
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.

這裏底行,正在生成因爲這告訴動作發生要執行的總共爲 109ms定時器的攔截器。

創建自定義的攔截器

在應用程序中使用自定義的攔截器是一種優雅的方式提供橫切的應用功能。創建一個自定義攔截器是很容易的,需要擴展的接口,下面的Interceptor接口:

public interface Interceptor extends Serializable{ void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; }

正如其名稱所表明的,init()方法提供了一種方法來初始化攔截器,並destroy() 方法提供了一種工具攔截清理。不同的行動,攔截被重用跨請求和需要是線程安全的,尤其是intercept() 方法。 

ActionInvocation對象可以訪問運行時環境。它允許訪問的動作本身和方法調用的動作,並確定動作是否已被調用。

如果不需要初始化或清除代碼,可以擴展AbstractInterceptor類。這提供了一個默認的無操作實現的init()和 destroy()方法。

創建攔截器類:

讓我們創建Java資源 MyInterceptor.java> src 文件夾:

package com.yiibai.struts2; import java.util.*; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation)throws Exception{ /* let us do some pre-processing */ String output = "Pre-Processing"; System.out.println(output); /* let us call action or next interceptor */ String result = invocation.invoke(); /* let us do some post-processing */ output = "Post-Processing"; System.out.println(output); return result; } }

就像看到的,實際行動將使用攔截器執行invocation.invoke()調用。所以,可以做一些前處理和一些處理後,根據需要。

該框架本身啓動的過程中,在第一次調用ActionInvocation對象的invoke()。每次 invoke()被調用,ActionInvocation的諮詢的狀態和執行爲準攔截接下來。通過請求流以下數據圖顯示了相同的概念:

ActionInvocation

創建動作類:

讓我們創建一個Java文件HelloWorldAction.java的Java下Java Resources > src下面給出的內容包名爲 com.yiibai.struts2。

package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport{ private String name; public String execute() throws Exception { System.out.println("Inside action...."); return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

在前面的例子中,我們已經看到,這是一個相同的類。我們有標準的「名稱」屬性的getter和setter方法​​,並返回字符串「success」的執行方法。

創建視圖

讓我們創建以下JSP文件helloWorld.jsp,在eclipse項目在WebContent文件夾。

<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> Hello World Hello World, <s:property value="name"/>

創建頁面:

我們還需要在WebContent文件夾中創建 index.jsp。該文件將作爲初始動作URL,用戶可以在其中點擊告訴Struts 2框架調用 HelloWorldAction類定義的方法呈現 helloWorld.jsp視圖。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> Hello World

Hello World From Struts2

<form action="hello"> <label for="name">Please enter your name
<input type="text" name="name"/> <input type="submit" value="Say Hello"/>

Hello 動作定義在上面的視圖文件將被映射到HelloWorldAction類和其執行方法使用struts.xml文件。

配置文件

現在,我們需要註冊我們的攔截器,然後調用它默認的攔截器在前面的例子中調用。要註冊一個新定義的攔截,直接放在的...標籤下的標籤插件struts.xml文件。您可以跳過這一步爲默認的攔截器,就像我們在我們前面的例子。但在這裏,讓我們註冊和使用它,如下所示:

<constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <interceptor name="myinterceptor" class="com.yiibai.struts2.MyInterceptor" /> <action name="hello" class="com.yiibai.struts2.HelloWorldAction" method="execute"> <interceptor-ref name="params"/> <interceptor-ref name="myinterceptor" /> <result name="success">/HelloWorld.jsp

應該指出的是,可以註冊多個攔截器標籤內,同一時間,可以調用多個攔截裏面的標籤。可以調用相同的攔截器與不同的動作。 

web.xml文件需要在 WEB-INF文件夾下創建 WebContent 如下:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app\_2\_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app\_3\_0.xsd" id="WebApp_ID" version="3.0"> Struts 2 index.jsp struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /*

右鍵點擊項目名稱,並單擊  Export > WAR File 文件創建一個WAR文件。然後部署在Tomcat 的webapps目錄下這個WAR。最後,啓動Tomcat 服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:

Hello

現在,在給定的文本框中輸入任何單詞,並單擊「Say Hello「 按鈕執行已定義的動作。現在,如果檢查生成的日誌,會發現下面的文本下方:

Pre-Processing Inside action.... Post-Processing

堆疊多個攔截器:

可以想像,配置多個攔截器每個動作很快就會變得非常難以控制。出於這個原因,攔截器與攔截器棧管理。下面是一個例子,直接從在struts-default.xml文件:

<interceptor-stack name="basicStack"> <interceptor-ref name="exception"/> <interceptor-ref name="servlet-config"/> <interceptor-ref name="prepare"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/>

上面的棧被調用basicStack,可用於在配置中,如下所示。此配置節點放置在<package.../>節點下。每個<interceptor-ref.../>標記引用一個攔截器或攔截器棧已配置在當前的攔截器棧。因此,這是非常重要的,以確保該名稱是唯一的所有攔截器和攔截器棧配置配置初始的攔截器和攔截器棧時。 

我們已經看到了如何應用攔截的動作,將攔截器棧是沒有什麼不同。事實上,我們完全使用相同的標籤:

<action name="hello" class="com.yiibai.struts2.MyAction"> <interceptor-ref name="basicStack"/> view.jsp </action

上述註冊的「basicStack」所有6個攔截器完成註冊的棧 Hello 動作。應該指出的是,攔截器執行的順序在配置中。例如,在上述情況下,異常將被執行,servlet 配置等。