Struts2快速入門

taglib指令告訴Servlet容器中,這個頁面將使用Struts2標籤,這些標籤之前,將通過s:property標籤中顯示的動作類的屬性名稱>HelloWorldAction類的getName()方法返回的值。

創建主頁面:

我們還需要在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

Please enter your name

hello操作定義在上面的視圖文件將被映射到的HelloWorldAction類和它的執行方法使用struts.xml文件。當用戶點擊「提交」按鈕,它會導致Struts2框架運行執行方法定義在其中,HelloWorldAction類和方法的返回值的基礎上,將相應的視圖選擇和呈現的一種反應。

配置文件

我們需要一個映射,以配合URL,HelloWorldAction類(模型),HelloWorld.jsp(圖)。映射告訴Struts 2框架的類將響應用戶的操作(URL),這一類的方法將被執行,什麼視圖來顯示字符串結果的基礎上,該方法返回。

因此,讓我們創建一個名爲struts.xml中。由於Struts2要求struts.xml中存在的類文件夾中。因此,創建的WebContent/WEB-INF/classes文件夾下struts.xml文件。Eclipse不會創建「類」文件夾下,所以你需要自己做。要做到這一點,在項目瀏覽器和WEB-INF文件夾上點擊右鍵,選擇「新建」>「文件夾」。你的struts.xml中應該是這樣的:

class="com.yiibai.struts2.HelloWorldAction"

method="execute">

/HelloWorld.jsp

上面的配置文件的幾句話。在這裏,我們設置常數struts.devModeto爲true,因爲我們需要看到一些有用的日誌消息。我們再定義一個名爲HelloWorld包。創建一個包是有用的,當你想要創建新的動作。在我們的例子中,我們的行動命名爲「hello」相應的URL/hello.action和備份HelloWorldAction.class。執行方法HelloWorldAction.class方法被調用時運行URL/hello.action。如果結果execute方法返回「success」,那麼我們就用戶HelloWorld.jsp。

下一步是創建一個web.xml文件,該文件的任何請求的入口點到Struts2。Struts2的應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將定義在web.xml中一個條目oforg.apache.struts2.dispatcher.FilterDispatcher類。WebContent下WEB-INF文件夾下需要創建web.xml文件。 Eclipse已經在創建項目時創建了一個web.xml文件。但是我們還需要修改如下:

Struts 2 index.jsp struts2 org.apache.struts2.dispatcher.FilterDispatcher

struts2

/\*

我們已經指定index.jsp是我們歡迎(welcome)文件。我們已經配置Struts2過濾器上運行的所有URL(即,任何URL匹配模式/*)

啓用詳細的日誌:

可以啓用日誌記錄功能齊全,工作時用Struts 2的WEB-INF/classes文件夾下創建logging.properties文件。請在屬性文件中的以下兩行:

org.apache.catalina.core.ContainerBase.[Catalina].level = INFOorg.apache.catalina.core.ContainerBase.[Catalina].handlers = \ java.util.logging.ConsoleHandler

默認logging.properties指定ConsoleHandler的路由記錄到stdout或FileHandler。一個處理程序的日誌級別閾值可以設置使用ERROR,WARNING,INFO,CONFIG,FINE,FINER,FINEST或全部。就是這樣。我們已經準備好來運行我們的Hello World應用程序使用Struts 2框架。

執行應用程序

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

輸入值爲"Struts2",並提交頁面。您應該看到下一頁

請注意,您可以定義索引動作在struts.xml文件,在這種情況下,你可以調用索引頁http://localhost:8080/HelloWorldStruts2/index.action。檢查下面你可以定義索引的行動:

/index.jsp

class="com.yiibai.struts2.HelloWorldAction"

method="execute">

/HelloWorld.jsp

Struts 2 配置文件

本章將帶你通過一個Struts2應用程序所需的基本配置。在這裏,我們將看到在一些重要的配置文件,將配置文件:web.xml,struts.xml中,struts-config.xml和struts.properties老實說你能活下來使用web.xml和struts.xml中的配置文件,並在前面的章節中,你已經看到我們的例子中使用這兩個文件的工作,但讓我解釋一下其他文件,以及你的知識。

web.xml文件:

在web.xml配置文件是一個的J2EE配置文件,決定如何處理HTTP請求servlet容器的元素。它不是嚴格意義上的Struts2的配置文件,但它是一個文件,需要配置Struts2的工作。

正如前面所討論的,此文件提供任何Web應用程序的入口點。Struts2的應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將FilterDispatcher排類在web.xml中定義一個條目。需要創建文件夾的WebContent/ WEB-INF下的web.xml文件。

這是第一個配置文件,您將需要配置,如果你開始沒有產生它(例如Eclipse或者Maven2的)模板或工具的幫助下。以下是web.xml文件中的內容,我們在我們的最後一個例子。

Struts 2 index.jsp

struts2

org.apache.struts2.dispatcher.FilterDispatcher

struts2

/\*

需要注意的是,我們的Struts 2的過濾器映射到/*/*。行動,而不是這意味着所有的URL將被解析的支柱過濾器。我們將介紹時,我們會通過的「註解」一章。

struts.xml文件:

struts.xml文件中包含的配置信息,你將修改所採取的措施的開發。這個文件可以被用來覆蓋默認設置的應用程序,例如struts.devMode=false和其他設置中定義的屬性文件。這個文件可以創建文件夾下的WEB-INF/classes。

讓我們一起來看看我們在struts.xml文件中創建Hello World的例子在前面的章節中解釋。

class="com.yiibai.struts2.HelloWorldAction"

method="execute">

/HelloWorld.jsp

<-- more actions can be listed here -->

<-- more packages can be listed here -->

首先要注意的是DOCTYPE。所有的Struts配置文件中需要有正確的DOCTYPE,在我們的小例子所示。是根標記的元素,我們聲明使用不同的包標籤。其中,允許分離和模塊化的配置。這是非常有用的,當你有一個大的項目,項目被劃分成不同的模塊。

再說了,如果項目有三個域名 - business_applicaiton,customer_application和staff_application,可以創建三個包,在適當的包裝和存儲相關的行動。包裝標籤具有以下屬性:

屬性

描述

name (required)

The unique identifier for the package

extends

Which package does this package extend from? By default, we use struts-default as the base package.

abstract

If marked true, the package is not available for end user consumption.

namesapce

Unique namespace for the actions

常量標籤name和value屬性將被用來覆蓋default.properties中定義的屬性,就像我們剛剛成立struts.devModeproperty。設置struts.devMode屬性,讓我們看到了更多的調試信息,日誌文件中。

我們定義動作標記對應的每一個URL,我們想訪問我們定義了一個類的execute()方法,將訪問時,我們將訪問相應的URL。結果確定什麼被返回到瀏覽器的一個動作後執行。從操作返回的字符串應該是一個結果的名稱。結果如上配置的每次動作,或作爲一個「全局」的結果,在包中的每一個動作可。結果有可選的名稱和類型的屬性。默認名稱值是「成功」。

隨着時間的推移,struts.xml文件可以做大,打破它包的模塊化是一種方式,但Struts提供了另一種模塊化的struts.xml文件。你可以將檔案分割成多個XML文件,並將其導入以下方式。

我們還沒有涉及到的其他配置文件是struts-default.xml中。這個文件包含了Struts標準配置設置,在你的項目的99.99%就不會碰這些設置。出於這個原因,我們不打算在這個文件太多的細節。如果有興趣,不妨看看在default.properties文件中struts2的核心-2.2.3.jar文件。

struts-config.xml 文件:

struts-config.xml配置文件是一個在Web客戶端組件的視圖和模型之間的聯繫,但你的項目的99.99就不會碰這些設置%。基本的配置文件包含以下主要內容:

SN

Interceptor & 描述

1

struts-configThis is the root node of the configuration file.

2

form-beansThis is where you map your ActionForm subclass to a name. You use this name as an alias for your ActionForm throughout the rest of the struts-config.xml file, and even on your JSP pages.

3

global forwardsThis section maps a page on your webapp to a name. You can use this name to refer to the actual page. This avoids hardcoding URLs on your web pages.

4

action-mappingsThis is where you declare form handlers and they are also known as action mappings.

5

controllerThis section configures Struts internals and rarely used in practical situations.

6

plug-inThis section tells Struts where to find your properties files, which contain prompts and error messages

下面是示例struts-config.xml文件:

struts-config.xml文件的更多詳細信息,請檢查你的Struts文檔。

struts.properties文件

此配置文件提供了一種機制來更改默認行爲的框架。其實所有的struts.propertiesconfiguration文件中包含的屬性也可以被配置在web.xml中使用的init-param,以及在struts.xml中的配置文件中使用恆定的標籤。你可以創建此文件下folderWEB-INF/classes。

在這個文件中配置的值將覆蓋默認值配置在default.properties這是包含在Struts2-core-xyzjar分佈。有幾個可能會考慮改變使用struts.properties文件的屬性:

### When set to true, Struts will act much more friendly for developersstruts.devMode = true

Enables reloading of internationalization files

struts.i18n.reload = true

Enables reloading of XML configuration files

struts.configuration.xml.reload = true

Sets the port that the server is run on

struts.url.http.port = 8080

任何與井號(#)開頭的行會被假定爲註釋和由Struts2將被忽略。

Struts 2 動作Actions:

動作是Struts2框架的核心,因爲它們是任何MVC(模型 - 視圖 - 控制器)框架。每一個URL映射到一個具體的行動,它提供了處理用戶的請求提供服務所需的邏輯。但動作也用來在另外兩個重要的能力。首先,動作從請求中的數據的傳輸,通過到視圖中起着重要的作用,無論是其一個JSP的或其它類型的結果。二,行動要協助的框架中確定的結果應該渲染視圖將返回響應的要求。

創建動作-Action:

在Struts2的行動,唯一的要求是,必須有一個無參數的方法,該方法返回一個字符串或結果的對象,必須是一個POJO。如果不帶參數的方法不指定,則默認行爲是使用execute()方法。

您也可以選擇擴展ActionSupport類實現接口,包括操作界面。操作界面如下:

public interface Action { public static final String SUCCESS = "success"; public static final String NONE = "none"; public static final String ERROR = "error"; public static final String INPUT = "input"; public static final String LOGIN = "login"; public String execute() throws Exception;}

讓我們一起來看看在動作方法中的Hello World示例:

package com.yiibai.struts2;

public class HelloWorldAction{ private String name;

public String execute() throws Exception { return "success"; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }}

爲了說明這一點的操作方法控制視圖,讓我們作出以下更改execute()方法和擴展的類ActionSupport如下:

package com.yiibai.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{ private String name;

public String execute() throws Exception { if ("SECRET".equals(name)) { return SUCCESS; }else{ return ERROR; } }

public String getName() { return name; }

public void setName(String name) { this.name = name; }}

在這個例子中,我們在execute方法中有一些邏輯,看的name屬性。如果屬性等於「不能說的祕密」的字符串,返回成功的結果,否則返回錯誤的結果。因爲我們已經擴展了ActionSupport,所以我們可以使用字符串常量的成功和錯誤。現在,讓我們修改我們的struts.xml文件如下:

/HelloWorld.jsp

/AccessDenied.jsp

創建一個視圖

讓我們創建下面的JSP文件的helloWorld.jsp,在WebContent文件夾在你的eclipse項目。要做到這一點,右鍵單擊WebContent文件夾中的項目資源管理器,然後選擇「新建」>「JSP文件。該文件將被要求的情況下,返回的結果是success,這是一個字符串常量「成功」的定義在Action接口:

<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %>

Hello World

Hello World,

以下是文件,該文件將被調用的框架的情況下作用的結果是等於字符串常量「ERROR」的錯誤,這是。以下內容的AccessDenied.jsp的

<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %>

Access Denied

You are not authorized to view this page.

我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架,以調用execute方法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

Please enter your name

就是這樣,有沒有需要改變的web.xml文件,讓我們使用同一個web.xml舉例章節,我們已經創建了。現在,我們已經準備好來運行我們的Hello World應用程序使用Struts 2框架。

執行應用程序

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

讓我們一起進入一個「SECRET」的話,你應該看到下面的頁面:

現在輸入任何文字以外的「SECRET」,你應該看到下面的頁面:

創建多個動作:

我們通常會定義一個以上的行動,以處理不同的請求,向用戶提供不同的URL,因此,你可以定義不同的類定義如下:

package com.yiibai.struts2;import com.opensymphony.xwork2.ActionSupport;

class MyAction extends ActionSupport{ public static String GOOD = SUCCESS; public static String BAD = ERROR; }

public class HelloWorld extends ActionSupport{ ... public String execute() { if ("SECRET".equals(name)) return MyAction.GOOD; return MyAction.BAD; } ... }

public class SomeOtherClass extends ActionSupport{ ... public String execute() { return MyAction.GOOD; } ... }

您將在struts.xml文件中配置這些操作如下:

struts> /HelloWorld.jsp /AccessDenied.jsp /Something.jsp /AccessDenied.jsp

在上述假設的例子中,你可以看到操作的結果被複制SUCCESS 和ERROR 。爲了解決這個問題,我們建議您創建一個類,它包含的結果的結果。

Struts 2 攔截器:

攔截器是作爲Servlet過濾器或JDK的Proxy類的概念上是相同的。攔截器允許橫切功能單獨實現動作以及框架。想要使用攔截器,可以實現如下:

Providing preprocessing logic before the action is called.

Providing postprocessing logic after the action is called.

Catching exceptions so that alternate processing can be performed.

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

Struts2框架攔截器:

Struts 2框架提供了良好的預配置,並準備使用的盒攔截。下面列出了幾個重要的攔截器:

SN

Interceptor & 描述

1

aliasAllows parameters to have different name aliases across requests.

2

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

3

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

4

createSessionAutomatically creates an HTTP session if one does not already exist.

5

debuggingProvides several different debugging screens to the developer.

6

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

7

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

8

fileUploadFacilitates easy file uploading.

9

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

10

loggerProvides simple logging by outputting the name of the action being executed.

11

paramsSets the request parameters on the action.

12

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

13

profileAllows simple profiling information to be logged for actions.

14

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

15

ServletConfigProvides the action with access to various servlet-based information.

16

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

17

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

18

validationProvides validation support for actions

完整的細節上面提到的攔截,請loook到Struts2文檔。但我會告訴你如何使用攔截器,一般在你的Struts應用程序。

如何使用攔截器?

讓我們來看看如何使用一個已經存在的攔截我們的「Hello World」程序。我們將使用定時器攔截器,其目的是測量過了多長時間,執行相應的操作方法。同時我PARAMS攔截器,其目的是發送的請求參數的行動。您可以嘗試不使用這個攔截器和你的榜樣,你會發現,name屬性沒有被設置的參數是不能夠達到給動作。我們將繼續HelloWorldAction.java,web.xml中,HelloWorld.jsp和index.jsp文件,因爲他們已經創建的實例章,但讓我們如下修改struts.xml文件中添加一個攔截器

/HelloWorld.jsp

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

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

INFO: Server startup in 3539 ms27/08/2011 8:40:53 PMcom.opensymphony.xwork2.util.logging.commons.CommonsLogger infoINFO: 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()方法。

創建攔截器類:

讓我們創建MyInterceptor.java在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諮詢狀態並執行攔截。當所有配置的攔截器被調用,invoke()方法將導致要執行的動作本身。通過請求流以下數據圖顯示了相同的概念:

創建一個動作-Action類:

讓我們創建一個Java文件HelloWorldAction.java的Java資源> 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; }}

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

創建視圖

Let us create the below jsp file HelloWorld.jsp in the WebContent folder in your eclipse project.

<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %>

Hello World

Hello World,

創建視圖:

我們還需要在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

Please enter your name

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

配置文件

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

class="com.yiibai.struts2.MyInterceptor" />

class="com.yiibai.struts2.HelloWorldAction"

method="execute">

/HelloWorld.jsp

應該注意的是,你可以註冊多個攔截器標籤內,同一時間可以調用多個攔截器內的標籤。可以調用相同的攔截器與不同的動作。需要創建WebContent/WEB-INF文件夾下web.xml文件下如下:

Struts 2 index.jsp struts2 org.apache.struts2.dispatcher.FilterDispatcher

struts2

/\*

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

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

Pre-ProcessingInside action....Post-Processing

堆疊多個攔截器:

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

上述權被稱爲basicStack,並且可以用於在您的配置中,如下所示。此配置節點被放置下節點。每個標籤引用了一個攔截器或攔截器棧已配置在當前的攔截器棧。因此,這是非常重要的,以確保名稱是唯一在所有攔截器和攔截器棧配置時,配置初始攔截器和攔截器棧。我們已經看到了如何應用攔截器的作用,應用攔截器棧是沒有什麼不同。事實上,我們都使用完全相同的標籤:

view.jsp

所有的6個攔截器,上述登記註冊完成股權「basicStack」hello操作。他們在配置應該指出的是攔截器執行的順序。例如,在上述情況下,異常將被執行第一,servlet配置第二等。

Struts 2 Results and Result Types

正如前面提到的,標籤Struts2的MVC框架的視圖中所扮演的角色。動作是負責執行業務邏輯。執行業務邏輯後,下一步是使用標籤顯示視圖。經常有一些導航規則附加的結果。例如,如果在動作方法是對用戶進行驗證,有三種可能的結果。 (a)成功登錄失敗的登錄. (b)用戶名或密碼不正確.(c)帳戶鎖定。的操作方法在這種情況下,將配置有三種可能的結果字符串和三種不同的視圖呈現結果。在前面的例子我們已經看到。但是,Struts2不配合使用JSP作爲視圖技術。畢竟了MVC模式的整個目的是保持層分離和高度可配置。例如,對於一個Web2.0客戶端,您可能要返回XML或JSON作爲輸出。在這種情況下,你可以創建一個新的結果類型爲XML或JSON,實現這一目標。Struts的一些預定義的結果類型,無論我們已經看到了,這是默認的結果類型,這是用來調度派遣到JSP頁面。 Struts允許使用的其他標記語言的技術,目前的結果和流行的選擇,包括Velocity, Freemaker, XSLT 和Tiles。

分發調度結果類型:

調度的結果類型是默認的類型,是用來指定,如果沒有其他的結果類型。它被用來轉發到一個servlet,JSP,HTML頁面等等,在服務器上它使用RequestDispatcher.forward()方法。在我們前面的例子中,我們看到了「shorthand」版本,在這裏我們提供了一個JSP的路徑作爲身體的結果標記。

/HelloWorld.jsp

We can also specify the JSP file using a tag within the element as follows:

/HelloWorld.jsp

我們還可以提供一個分析參數,默認值是true。解析參數的位置參數確定是否將被解析爲OGNL表達式。

FreeMaker結果類型:

在這個例子中,我們將看到我們如何使用FreeMaker作爲視圖技術。 freemaker是一種流行的模板引擎,用於生成輸出,使用預定義的模板。讓我們創建一個Freemaker模板文件hello.fm以下內容:

Hello World ${name}

在此以上的文件是一個模板,其中名稱是使用已定義的動作外,將通過放慢參數。在你的CLASSPATH中將保存該文件。接下來讓我們修改struts.xml中指定的結果如下:

class="com.yiibai.struts2.HelloWorldAction"

method="execute">

/hello.fm

讓我們保持我們的HelloWorldAction.java,HelloWorldAction.jsp和index.jsp文件,爲我們創造了他們的例子章。現在,右鍵單擊該項目上的名稱和clickExport> WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:

值「Struts2」,並提交頁面。您應該看到下一頁

正如你可以看到,這是完全一樣的不同之處在於,我們是不依賴於使用JSP作爲視圖技術的JSP視圖。在這個例子中,我們已經使用Freemaker。

重定向結果類型:

重定向結果的類型調用標準 response.sendRedirect() 方法,使瀏覽器來創建一個新的請求給定的位置。我們可以提供的位置無論是在體內的元素或作爲一個元素。重定向也支持解析的參數。下面是一個例子使用XML配置:

/NewWorld.jsp

因此,只要修改struts.xml文件中定義重定向上述類型,並創建一個新的的文件NewWorld.jpg在那裏你會被重定向hello操作時,將返回成功。

Struts2值棧/ OGNL

值棧:

值棧是一組的幾個對象保持中的下列對象提供的順序:

SN

Objects & 描述

1

Temporary ObjectsThere are various temporary objects which are created during execution of a page. For example the current iteration value for a collection being looped over in a JSP tag.

2

The Model ObjectIf you are using model objects in your struts application, the current model object is placed before the action on the value stack

3

The Action ObjectThis will be the current action object which is being executed.

4

Named ObjectsThese objects include #application, #session, #request, #attr and #parameters and refer to the corresponding servlet scopes

值棧可以通過標籤提供JSP,Velocity或者Freemarker的。在單獨的章節中,我們將研究有不同的標籤,被用來獲取和設置Struts 2.0的值棧。您可以在你的行動值棧對象如下:

ActionContext.getContext().getValueStack()

一旦你擁有了值對象,您可以使用以下方法來操作該對象:

SN

ValueStack Methods & 描述

1

Object findValue(String expr)Find a value by evaluating the given expression against the stack in the default search order.

2

CompoundRoot getRoot()Get the CompoundRoot which holds the objects pushed onto the stack.

3

Object peek()Get the object on the top of the stack without changing the stack.

4

Object pop()Get the object on the top of the stack and remove it from the stack.

5

void push(Object o)Put this object onto the top of the stack.

6

void set(String key, Object o)Sets an object on the stack with the given key so it is retrievable by findValue(key,...)

7

void setDefaultType(Class defaultType)Sets the default type to convert to if no type is provided when getting a value.

8

void setValue(String expr, Object value)Attempts to set a property on a bean in the stack with the given expression using the default search order.

9

int size()Get the number of objects in the stack.

OGNL:

對象圖導航語言(OGNL)是一個功能強大的表達式語言,用於引用和操作數據的值棧。OGNL還可以在數據傳輸和類型轉換。OGNL是非常相似的JSP表達式語言。 OGNL是基於的思想具有根或缺省對象的範圍內的。默認的根對象的屬性可以參考使用的標記符號,這是英鎊符號。

正如前面提到的,OGNL根據上下文和Struts建立一個ActionContext中使用OGNL地圖。ActionContext中的地圖由下列組成:

application - 應用程序範圍內的變量

session - 會話範圍的變量

root / value stack -所有操作變量都存儲在這裏

request - 請求範圍的變量

parameters - 請求參數

atributes - 存儲的屬性頁面,請求,會話和應用範圍

重要的是要明白,值棧中的操作對象是始終可用。所以,因此,如果你的行動對象的屬性x和y有隨時可供您使用。在ActionContext中的對象被稱爲使用英鎊符號,但是,值棧中的對象可以直接引用,例如,如果員工是一個動作類的屬性的話,就可以得到參考如下:

而不是

如果你有所謂的「login」會話中的屬性,你可以找回如下:

OGNL還支持處理的集合 - 即地圖,List和Set。例如,以顯示顏色的下拉列表中,你可以這樣做:

OGNL表達式是巧妙地解釋了 "red","yellow","green"顏色和此基礎上建立一個列表。OGNL表達式將被廣泛使用在接下來的章節中,我們將研究不同的標籤。因此,而不是孤立地看着他們,讓我們來看看的表格標籤/控制標籤/數據標籤和Ajax標籤部分在使用中的一些例子。

值棧/OGNL例:

創建動作:

讓我們考慮下面的操作類,我們訪問值棧,然後設置幾個鍵,我們將在我們的觀點,即訪問使用OGNL。JSP頁面。

package com.yiibai.struts2;

import java.util.*;

import com.opensymphony.xwork2.util.ValueStack;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{ private String name;

public String execute() throws Exception { ValueStack stack = ActionContext.getContext().getValueStack(); Map context = new HashMap();

context.put("key1", new String("This is key1"));

context.put("key2", new String("This is key2"));

stack.push(context);

System.out.println("Size of the valueStack: " + stack.size());

return "success";

}

public String getName() { return name; }

public void setName(String name) { this.name = name; }}

其實,Struts 2增加值棧的頂部時動作執行。因此,通常的方法把東西值棧是增加值getter/setter方法Action類和然後使用的標籤,訪問值。但我展示你究竟是如何的ActionContext中和值棧在struts的工作。

創建視圖

讓我們創建下面的JSP文件helloWorld.jsp,在WebContent文件夾在eclipse項目。這種觀點的情況下采取行動的成功返回,將顯示:

<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %>

Hello World

Entered value :

Value of key 1 :

Value of key 2 :

我們還需要創建index.jsp在WebContent文件夾下,其內容如下:

<%@ 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

Please enter your name

配置文件

以下是struts.xml文件的內容:

class="com.yiibai.struts2.HelloWorldAction"

method="execute">

/HelloWorld.jsp

以下是web.xml文件中的內容:

Struts 2 index.jsp struts2 org.apache.struts2.dispatcher.FilterDispatcher

struts2

/\*

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

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

Size of the valueStack: 3

這將顯示下面的屏幕,它會顯示任何價值,你將進入和值key1和key2,我們賦上了值棧。

結論:

希望你有較好的瞭解Struts 2概念。如果願意瞭解更多的細節和進一步的例子,如上傳文件,發送電子郵件,表單驗證等,然後可以去通過完整教程。