Struts2快速入門
Struts2是基於MVC設計模式的流行和成熟的Web應用程序框架。Struts2並不只是Struts 1下一個版本,但它是一個完全重寫的Struts架構。
WebWork框架開始了與Struts框架爲基礎,其目標是建立在Struts的Web開發更容易爲開發人員提供了加強和改進的框架。
一段時間後,WebWork框架和Struts社區聯手打造著名的Struts2框架。
Struts 2 框架特性:
這裏有一些偉大的特性,可能會迫使你考慮使用Struts2:
POJO形式和POJO動作 - 已經擺脫了Struts2的動作表單的Struts框架的一個組成部分。Struts2可以使用任何的POJO接收的形式輸入。同樣的,你現在可以看到任何POJO的Action類。
Tag支持 - Struts2的形式提高了標籤的新標籤讓開發人員寫更少的代碼。
AJAX支持- Struts2中已經認識到了Web2.0技術,並整合到產品中AJAX支持創建AJAX的標籤,該功能非常相似的標準Struts2的標籤。
容易整合 - 與其他框架如Spring,Tiles和SiteMesh的整合是現在更容易與各種集成Struts2。
模板支持 - 支持生成使用模板。
插件支持 - 核心Struts2行爲,可以加強和擴大使用插件。大量的插件可供Struts2。
概要分析- Struts2的提供集成的配置,調試和分析應用程序。此外,Struts還提供了內置調試工具的幫助下,集成調試。
標籤修改容易 - 在Struts2標籤標記,可以調整使用FreeMarker模板。這並不需要JSP或Java知識。基本的HTML,XML和CSS知識是不夠的修改的標籤。
提升更少的配置 - Struts2的促進更少的配置與用於各種設置的幫助下,使用默認值。你沒有的東西,除非它偏離由Struts2的默認設置的配置。
Struts 2 環境配置:
我們的首要任務是要得到一個最小的Struts2中運行的應用程序。本章將指導您如何使用Struts2編寫一個應用程序。我假設你已經在你的機器上安裝JDK(5+),Tomcat和Eclipse。如果你沒有安裝這些組件,請執行以下步驟:
Step 1 - 設置JAVA開發工具包 (JDK):
從Oracle的Java站點:Java SE下載,您可以下載最新版本的SDK。您會發現說明安裝JDK下載的文件,按照給定的說明來安裝和配置的設置。最後,設置PATH和JAVA_HOME環境變量指向的目錄,其中包含java和javac,通常分別爲:java_install_dir/bin和java_install_dir。
如果運行的是Windows SDK安裝在c:\jdk1.5.0_20,你就必須把你的C:\autoexec.bat文件中的以下行。
set PATH=C:\jdk1.5.0_20\bin;%PATH%
set JAVA_HOME=C:\jdk1.5.0_20
另外,在Windows NT/2000/XP中,您也可以右鍵單擊「我的電腦」,選擇「屬性」,再先進,環境變量。然後,您會更新PATH的值,然後按「確定」按鈕。
在Unix(Solaris和Linux等),如果SDK安裝在/usr/local/jdk1.5.0_20,你使用的是C shell,把下面的到.cshrc文件寫入。
setenv PATH /usr/local/jdk1.5.0_20/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.5.0_20
另外,如果你使用像Borland的JBuilder,Eclipse的IntelliJ IDEA或Sun ONE Studio集成開發環境(IDE),編譯並運行一個簡單的程序,以確認該IDE知道在哪裏安裝Java,否則不正確的設置爲給定的文檔IDE。
Step 2 - 安裝Apache Tomcat:
您可以下載最新版本Tomcat http://tomcat.apache.org/。一旦下載安裝,解壓縮的二進制分發到一個方便的位置。例如,Window下在C:\Apache或/usr/local/apache-tomcat-6.0.33 tomcat-6.0.33 Linux/Unix和創建CATALINA_HOME環境變量指向這些位置上。Tomcat可以開始執行下面的命令在Windows機器上,可以簡單地雙擊的startup.bat
%CATALINA_HOME%\bin\startup.bat
or
C:\apache-tomcat-6.0.33\bin\startup.bat
Tomcat可以開始UNIX(Solaris和Linux等)的機器上執行下面的命令:
$CATALINA_HOME/bin/startup.sh
or
/usr/local/apache-tomcat-6.0.33/bin/startup.sh
成功啓動後,默認包含在Tomcat中的Web應用程序將可以通過訪問輸入http://localhost:8080/。如果一切順利,那麼它應該顯示以下結果:
有關配置和運行Tomcat的進一步信息包含在文檔中,可以找到這裏,以及在Tomcat Web站點:http://tomcat.apache.org
停止Tomcat既可以通過Windows機器上執行下面的命令:
%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-5.5.29\bin\shutdown
Tomcat可以停止執行下面命令在Unix(Solaris和Linux等)機器:
$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh
Step 3 - 安裝Eclipse (IDE)
在本教程中所有的例子已經寫入使用Eclipse IDE。所以,我建議你有你的機器上安裝最新版本Eclipse。
要安裝Eclipse的dDownload的最新的Eclipse二進制文件http://www.eclipse.org/downloads/。一旦你下載安裝,解壓縮的二進制分發到一個方便的位置。例如,在C:\eclipse上Eclipse,或/usr/local/eclipse在Linux/Unix終於適當設置PATH變量。
Eclipse可以啓動Windows機器上執行下面的命令,或者你可以簡單地雙擊的eclipse.exe
%C:\eclipse\eclipse.exe
Eclipse可以啓動UNIX(Solaris和Linux等)的機器上執行下面的命令:
$/usr/local/eclipse/eclipse
成功啓動後,如果一切正常,那麼它應顯示以下結果:
Step 4 - 安裝Struts2 類庫
現在,如果一切正常,那麼你可以繼續設置您的Struts 2框架。以下是簡單的步驟,下載並安裝在機器上Struts2。
請選擇是否要安裝Hibernate在Windows或Unix,然後繼續進行下一個步驟下載.zip文件窗口.tz文件爲Unix。
下載最新版本的Struts2的二進制文件: http://struts.apache.org/download.cgi.
在寫這篇教程的時候,我下載的是struts-2.0.14-all.zip,當解壓下載的文件時,它有C:\struts-2.2.3如下的目錄結構內。
第二個步驟是解壓zip文件中的任何位置,我下載和提取struts-2.2.3-all.zip在c:\文件夾中,我的Windows 7機器上的所有jar文件複製到c:\struts-2.20.3\lib中。確保正確設置CLASSPATH變量,否則將出現錯誤問題,同時運行您的應用程序。
Struts 2 體系結構:
從高層次來看,Struts2是一個上拉MVC(MVC2)框架。在Struts2的Model-View-Controller模式實現以下五個核心組件:
Actions
Interceptors
Value Stack / OGNL
Results / Result types
View technologies
Struts 2的是從傳統的MVC框架,在該框架中的作用的模式,而不是控制器的作用略有不同,雖然有一些重疊。
上圖描述了Struts2的高層體系結構模型,視圖和控制器。一個Struts2的調度Servlet過濾器和攔截器與控制器實現,該模型實現的動作和視圖的組合的結果類型和結果。值棧和OGNL提供了共同點,其他部件之間的連接和集成。
除了從上述組分中,將有一個特定的信息涉及到配置。爲Web應用程序的配置以及配置動作,攔截器,結果等。
這是Struts的MVC模式的體系結構概述。我們將在隨後的章節中通過每個組件更詳細地熟悉和理解。
請求生命週期:
基於上述數據圖,可以解釋用戶的請求的生命週期在Struts 2如下所示:
用戶發送請求到服務器,用於請求對某些資源(即頁).
FilterDispatcher排着眼於該請求,然後確定適當的Action.
配置攔截器的功能適用於如驗證,文件上傳等。
選擇的動作執行,執行所請求的操作。
同樣,配置攔截器做任何後期處理,如果需要的話。
最後的結果是由視圖準備,並且將結果返回給用戶。
Struts 2 Hello World 實例:
從中學到了Struts 2的架構,當你點擊一個超鏈接或提交一個Struts2的Web應用程序的HTML表單中,輸入被髮送到一個Java類操作的控制器,收集。執行該操作後,結果選擇了一個資源來呈現的響應。資源通常是一個JSP,但它也可以是一個PDF文件,Excel電子表格,或Java小應用程序窗口。
假設你已經建立您的開發環境。現在,讓我們繼續建立我們的第一個Hello World struts2的項目。這個項目的目的是建立一個Web應用程序,收集用戶的username,並顯示「Hello World」,後面的用戶名。我們將創建任何Struts2項目的四個組成部分:
SN
組件&描述
1
Action
Create an action class which will contain complete business logic and conrol the interaction between the user, the model, and the view.
2
Interceptors
Create interceptors if required, or use existing interceptors. This is part of Controller.
3
View
Create a JSPs to interact with the user to take input and to present the final messages.
4
Configuration Files
Create configuration files to couple the Action, View and Controllers. These files are struts.xml, web.xml, struts.properties.
我要使用Eclipse IDE,所以下創建一個動態Web項目所需的所有組件。因此,讓我們開始創建動態Web項目。
創建一個動態Web項目:
開始你的Eclipse,然後進入「文件」>「新建」>「動態Web項目,然後輸入項目名稱爲HelloWorldStruts2和設置其他的選項,在下面的屏幕:
選擇在屏幕上的所有默認選項,最後檢查生成的web.xml部署描述符選項。這將創建一個動態Web項目在Eclipse中。現在去窗口>顯示視圖>項目資源管理器,你會看到你的項目窗口中的東西如下:
現在複製以下文件從Struts 2的lib文件夾C:\struts-2.2.3\lib添加到我們的工程WEB-INF\lib文件夾中。所以這個可以簡單地拖動和丟棄所有的WEB-INF\lib文件夾中的下列文件到。
commons-fileupload-x.y.z.jar
commons-io-x.y.z.jar
commons-language-x.y.jar
commons-logging-x.y.z.jar
commons-logging-api-x.y.jar
freemarker-x.y.z.jar
javassist-.xy.z.GA
ognl-x.y.z.jar
struts2-core-x.y.z.jar
xwork-core.x.y.z.jar
創建動作action類:
Action類是Struts 2應用程序的關鍵,我們實現了大部分Action類中的業務邏輯。因此,讓我們創建一個Java文件HelloWorldAction.java的Java資源> SRC下一個的包名com.yiibai.struts2並有下面的內容。
Action類來響應用戶的操作,當用戶點擊一個URL。 Action類中的一個或多個方法被執行,並返回一個字符串結果。基於結果的價值,一個特定的JSP頁面的呈現方式。
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;
}
}
這是一個非常簡單的類,一個名爲「name」屬性。我們有標準「名稱」屬性getter和setter方法,返回字符串「SUCCESS」執行方法。
Struts2框架的HelloWorldAction類將創建一個對象並調用execute方法在響應用戶的操作。你把業務邏輯裏面execute方法,並最終返回的字符串常量。簡單地說爲每個URL執行一個動作類,或者你可以直接使用這個類的名稱作爲操作名,也可以映射到一些其他的名稱使用struts.xml文件,如下圖所示。
創建一個視圖
我們需要一個JSP提交最後的消息,這個頁面會被稱爲Struts 2框架中預定義的動作時,會發生此映射將在struts.xml文件中定義的。所以,讓我們創建下面的JSP文件的helloWorld.jsp,在WebContent文件夾在您的Eclipse項目。要做到這一點,右鍵單擊WebContent文件夾中的項目資源管理器,然後選擇「新建」>「JSP文件。
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
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 From Struts2
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中應該是這樣的:
<action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
上面的配置文件的幾句話。在這裏,我們設置常數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文件。但是我們還需要修改如下:
org.apache.struts2.dispatcher.FilterDispatcher
我們已經指定index.jsp是我們歡迎(welcome)文件。我們已經配置Struts2過濾器上運行的所有URL(即,任何URL匹配模式/*)
啓用詳細的日誌:
可以啓用日誌記錄功能齊全,工作時用Struts 2的WEB-INF/classes文件夾下創建logging.properties文件。請在屬性文件中的以下兩行:
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.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。檢查下面你可以定義索引的行動:
<action name="index">
<result >/index.jsp</result>
</action>
<action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
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的過濾器映射到/*/*。行動,而不是這意味着所有的URL將被解析的支柱過濾器。我們將介紹時,我們會通過的「註解」一章。
struts.xml文件:
struts.xml文件中包含的配置信息,你將修改所採取的措施的開發。這個文件可以被用來覆蓋默認設置的應用程序,例如struts.devMode=false和其他設置中定義的屬性文件。這個文件可以創建文件夾下的WEB-INF/classes。
讓我們一起來看看我們在struts.xml文件中創建Hello World的例子在前面的章節中解釋。
<action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
<-- more actions 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-config
This is the root node of the configuration file.
2
form-beans
This 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 forwards
This 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-mappings
This is where you declare form handlers and they are also known as action mappings.
5
controller
This section configures Struts internals and rarely used in practical situations.
6
plug-in
This section tells Struts where to find your properties files, which contain prompts and error messages
下面是示例struts-config.xml文件:
<forward name="valid" path="/jsp/MainMenu.jsp" />
<forward name="invalid" path="/jsp/LoginView.jsp" />
</action>
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 developers
struts.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文件如下:
創建一個視圖
讓我們創建下面的JSP文件的helloWorld.jsp,在WebContent文件夾在你的eclipse項目。要做到這一點,右鍵單擊WebContent文件夾中的項目資源管理器,然後選擇「新建」>「JSP文件。該文件將被要求的情況下,返回的結果是success,這是一個字符串常量「成功」的定義在Action接口:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
以下是文件,該文件將被調用的框架的情況下作用的結果是等於字符串常量「ERROR」的錯誤,這是。以下內容的AccessDenied.jsp的
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
我們還需要在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 From Struts2
就是這樣,有沒有需要改變的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>
在上述假設的例子中,你可以看到操作的結果被複制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
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
完整的細節上面提到的攔截,請loook到Struts2文檔。但我會告訴你如何使用攔截器,一般在你的Struts應用程序。
如何使用攔截器?
讓我們來看看如何使用一個已經存在的攔截我們的「Hello World」程序。我們將使用定時器攔截器,其目的是測量過了多長時間,執行相應的操作方法。同時我PARAMS攔截器,其目的是發送的請求參數的行動。您可以嘗試不使用這個攔截器和你的榜樣,你會發現,name屬性沒有被設置的參數是不能夠達到給動作。
我們將繼續HelloWorldAction.java,web.xml中,HelloWorld.jsp和index.jsp文件,因爲他們已經創建的實例章,但讓我們如下修改struts.xml文件中添加一個攔截器
右鍵點擊項目名稱,並單擊「導出」> WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:
現在,在給定的文本框中輸入任何單詞,然後單擊「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()方法。
創建攔截器類:
讓我們創建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" %>
創建視圖:
我們還需要在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 From Struts2
hello操作定義在上面的視圖文件將被映射到的HelloWorldAction類和它的執行方法使用struts.xml文件。
配置文件
現在,我們需要註冊我們的攔截器,然後調用它,因爲我們已經在前面的例子中默認的攔截器。要註冊一個新定義的攔截器
<interceptors>
<interceptor name="myinterceptor"
class="com.yiibai.struts2.MyInterceptor" />
</interceptors>
<action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute">
<interceptor-ref name="params"/>
<interceptor-ref name="myinterceptor" />
<result name="success">/HelloWorld.jsp</result>
</action>
應該注意的是,你可以註冊多個攔截器
需要創建WebContent/WEB-INF文件夾下web.xml文件下如下:
org.apache.struts2.dispatcher.FilterDispatcher
右鍵點擊項目名稱,並單擊「導出」> WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:
現在,在給定的文本框中輸入任何單詞,然後單擊「Say Hello按鈕執行已定義的動作。現在,如果你將檢查生成的日誌,你會發現下面的文字在底部:
Pre-Processing
Inside action....
Post-Processing
堆疊多個攔截器:
正如你想像,配置多個攔截器的每個動作很快就會變得非常難以控制。出於這個原因,攔截器的攔截器棧管理。下面是一個例子,直接從在struts-default.xml文件:
上述權被稱爲basicStack,並且可以用於在您的配置中,如下所示。此配置節點被放置下<package.../>節點。每個<interceptor-ref.../>標籤引用了一個攔截器或攔截器棧已配置在當前的攔截器棧。因此,這是非常重要的,以確保名稱是唯一在所有攔截器和攔截器棧配置時,配置初始攔截器和攔截器棧。
我們已經看到了如何應用攔截器的作用,應用攔截器棧是沒有什麼不同。事實上,我們都使用完全相同的標籤:
Struts 2 Results and Result Types
正如前面提到的,
經常有一些導航規則附加的結果。例如,如果在動作方法是對用戶進行驗證,有三種可能的結果。 (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的路徑作爲身體的結果標記。
We can also specify the JSP file using a tag within the <result...> element as follows:
我們還可以提供一個分析參數,默認值是true。解析參數的位置參數確定是否將被解析爲OGNL表達式。
FreeMaker結果類型:
在這個例子中,我們將看到我們如何使用FreeMaker作爲視圖技術。 freemaker是一種流行的模板引擎,用於生成輸出,使用預定義的模板。讓我們創建一個Freemaker模板文件hello.fm以下內容:
Hello World ${name}
在此以上的文件是一個模板,其中名稱是使用已定義的動作外,將通過放慢參數。在你的CLASSPATH中將保存該文件。接下來讓我們修改struts.xml中指定的結果如下:
<action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute">
<result name="success" type="freemarker">
<param name="location">/hello.fm</param>
</result>
</action>
讓我們保持我們的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() 方法,使瀏覽器來創建一個新的請求給定的位置。
我們可以提供的位置無論是在體內的<result...>元素或作爲一個元素。重定向也支持解析的參數。下面是一個例子使用XML配置:
/NewWorld.jsp
因此,只要修改struts.xml文件中定義重定向上述類型,並創建一個新的的文件NewWorld.jpg在那裏你會被重定向hello操作時,將返回成功。
Struts2值棧/ OGNL
值棧:
值棧是一組的幾個對象保持中的下列對象提供的順序:
SN
Objects & 描述
1
Temporary Objects
There 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 Object
If 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 Object
This will be the current action object which is being executed.
4
Named Objects
These 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中的對象被稱爲使用英鎊符號,但是,值棧中的對象可以直接引用,例如,如果員工是一個動作類的屬性的話,就可以得到參考如下:
<s:property value="name"/>
而不是
<s:property value="#name"/>
如果你有所謂的「login」會話中的屬性,你可以找回如下:
<s:property value="#session.login"/>
OGNL還支持處理的集合 - 即地圖,List和Set。例如,以顯示顏色的下拉列表中,你可以這樣做:
<s:select name="color" list="{'red','yellow','green'}" />
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<String, Object> context = new HashMap<String, Object>();
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類和然後使用<s:property>的標籤,訪問值。但我展示你究竟是如何的ActionContext中和值棧在struts的工作。
創建視圖
讓我們創建下面的JSP文件helloWorld.jsp,在WebContent文件夾在eclipse項目。這種觀點的情況下采取行動的成功返回,將顯示:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
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 From Struts2
配置文件
以下是struts.xml文件的內容:
<action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
以下是web.xml文件中的內容:
org.apache.struts2.dispatcher.FilterDispatcher
右鍵點擊項目名稱,並單擊「導出」> WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:
現在,在給定的文本框中輸入任何單詞,然後點擊「Say Hello」按鈕執行已定義的動作。現在,如果你將檢查生成的日誌,你會發現下面的文字在底部:
Size of the valueStack: 3
這將顯示下面的屏幕,它會顯示任何價值,你將進入和值key1和key2,我們賦上了值棧。
結論:
希望你有較好的瞭解Struts 2概念。如果願意瞭解更多的細節和進一步的例子,如上傳文件,發送電子郵件,表單驗證等,然後可以去通過完整教程。