版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
js程序設(shè)計(jì)入門Srus框架基礎(chǔ)此文檔下載自官網(wǎng),除本頁,其余未修改,可直接刪除本頁本章內(nèi)容Struts2是基于MVC設(shè)計(jì)模式的Web應(yīng)用程序開發(fā)框架,它是由Struts和WebWork發(fā)展而來的。本章首先討論Struts2框架的體系結(jié)構(gòu),Action類的使用、OGNL表達(dá)式語言、Struts2標(biāo)簽,接下來介紹Struts2的國際化和用戶輸入校驗(yàn),最后介紹了使用Tiles插件構(gòu)建頁面布局。本章內(nèi)容12.1Struts2框架概述12.2注冊/登錄系統(tǒng)12.3OGNL12.4Struts2常用標(biāo)簽12.5Struts2的國際化12.6用戶輸入校驗(yàn)12.7用Tiles實(shí)現(xiàn)頁面布局12.1Struts2框架概述ApacheStruts是用于開發(fā)JavaWeb應(yīng)用程序的開源框架。Struts提供了Web應(yīng)用開發(fā)的優(yōu)秀框架,是世界上應(yīng)用最廣泛的MVC框架。然而,隨著Web應(yīng)用開發(fā)需求的日益增長,Struts已不能滿足需要,修改Struts框架成為必要。ApacheStruts小組和另一個JavaEE框架WebWork聯(lián)手共同開發(fā)一個更高級的框架Struts2。12.1Struts2框架概述Struts2結(jié)合了Struts和WebWork的共同優(yōu)點(diǎn),對開發(fā)者更友好,具有支持Ajax、快速開發(fā)和可擴(kuò)展等特性。它已成為構(gòu)建、部署和維護(hù)動態(tài)的、可擴(kuò)展的Web應(yīng)用框架。Struts2并不是Struts的簡單升級,可以說Struts2是一個既新又不新的MVC框架。Struts2的設(shè)計(jì)思想和核心架構(gòu)與WebWork是完全一致的,同時它又吸收了Struts的一些優(yōu)點(diǎn)。也就是說,Struts2是集WebWork和Struts兩者設(shè)計(jì)思想之優(yōu)點(diǎn)而設(shè)計(jì)出來的新一代MVC框架。12.1.1Struts2框架的組成Struts2框架是基于MVC設(shè)計(jì)模式的Web應(yīng)用開發(fā)框架,它主要包括控制器、Action對象、視圖JSP頁面和配置文件等,如圖12.1所示。圖12.1Struts2的MVC架構(gòu)控制器過濾器模型Action視圖Web瀏覽器JSP攔截器JavaBeans控制器:控制器由過濾器、攔截器或Action組件實(shí)現(xiàn)。模型:模型由JavaBeans實(shí)現(xiàn),它可實(shí)現(xiàn)業(yè)務(wù)邏輯。視圖:通常由JSP頁面實(shí)現(xiàn),也可以由VelocityTemplate、FreeMarker或其他表示層技術(shù)實(shí)現(xiàn)。配置文件:Struts2框架提供一個名為struts.xml配置文件,使用它來配置應(yīng)用程序中的組件。Struts2標(biāo)簽:Struts2提供了一個功能強(qiáng)大的標(biāo)簽庫,該庫提供了大量標(biāo)簽,使用這些標(biāo)簽可以簡化JSP頁面的開發(fā)。12.1.2Struts2開發(fā)環(huán)境的構(gòu)建
運(yùn)行Struts2的平臺必須滿足下面需求:ServletAPI2.4、JSPAPI2.0、Java5。1.下載Struts2庫文件開發(fā)Struts2應(yīng)用程序必須安裝Struts2庫文件??梢缘紸pacheStrutsWeb站點(diǎn)下載庫文件包,地址為:://。目前的最新版本是。假設(shè)這里下載的是,它是完整發(fā)布軟件包,其中包括示例應(yīng)用程序、文檔、所有的庫文件和源代碼。將該文件解壓到一個臨時目錄中,其中l(wèi)ib目錄中存放的是Struts2的所有庫文件,將下列文件復(fù)制到WEB-INF\lib目錄中:1.下載Struts2庫文件1.下載Struts2庫文件1.下載Struts2庫文件要使Web應(yīng)用程序支持Struts2功能,需要在web.xml文件中聲明一個核心過濾器類和映射,代碼如下:2.在web.xml中添加過濾器<filter><filter-name>struts2</filter-name><filter-class></filter-class></filter><filter-mapping>
<filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>2.在web.xml中添加過濾器配置文件用來指定URL、Java類和視圖頁面(如index.jsp)之間的關(guān)系。在開發(fā)環(huán)境下配置文件應(yīng)保存在src目錄中。下面是struts.xml文件代碼:3.創(chuàng)建struts.xml配置文件<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"":///dtds/struts-2.0.dtd"><struts> <constantname="struts.devMode"value="true"/> <packagename="basicstruts2"extends="struts-default"> <actionname="index"> <result>/index.jsp</result> </action> </package></struts>3.創(chuàng)建struts.xml配置文件提示:可以將Struts2自帶的一個名為struts2-blank應(yīng)用程序?qū)氲紼clipse中,在該應(yīng)用程序中已經(jīng)完成了各種配置,在此基礎(chǔ)上進(jìn)行開發(fā)會更方便。3.創(chuàng)建struts.xml配置文件12.1.3Struts2應(yīng)用的開發(fā)步驟開發(fā)Struts2應(yīng)用程序大致需3個基本步驟。創(chuàng)建Action動作類;創(chuàng)建結(jié)果視圖;修改配置文件struts.xml。動作類在Struts2中充當(dāng)控制器,由它處理用戶的動作。當(dāng)用戶在視圖頁面中觸發(fā)一個動作時(點(diǎn)擊超鏈接或提交表單),請求將經(jīng)由過濾器發(fā)送到一個Action動作類。Struts將根據(jù)配置文件struts.xml中的信息確定要執(zhí)行的Action對象。1.創(chuàng)建Action動作類Action對象調(diào)用execute()方法執(zhí)行業(yè)務(wù)邏輯或數(shù)據(jù)訪問邏輯。Action類執(zhí)行后根據(jù)結(jié)果選擇一個資源發(fā)送給客戶。資源可以是服務(wù)器視圖頁面,也可能是PDF文件、Excel電子表格等。當(dāng)客戶請求URL與某個動作名匹配時,Struts2將使用struts.xml文件中的映射處理請求。動作映射在struts.xml文件中使用<action>標(biāo)簽定義。1.創(chuàng)建Action動作類視圖用來響應(yīng)用戶請求、輸出處理結(jié)果。視圖通常使用JSP頁面實(shí)現(xiàn)。2.創(chuàng)建視圖頁面struts.xml文件主要用來建立動作Action類與視圖的映射。在其中為每個動作定義一個映射,它根據(jù)動作名確定執(zhí)行哪個Action類,根據(jù)Action類的執(zhí)行結(jié)果確定請求轉(zhuǎn)發(fā)到哪個視圖頁面。3.修改struts.xml配置文件12.1.4一個簡單的應(yīng)用程序假設(shè)創(chuàng)建一個向客戶發(fā)送一條消息的應(yīng)用程序,應(yīng)完成下面3步:(1)創(chuàng)建一個Action類(控制器)控制與用戶、模型和視圖的交互。(2)創(chuàng)建一個服務(wù)器頁面表示消息(視圖)。(3)在struts.xml文件中建立Action類與視圖的映射。動作是客戶單擊HTML頁面中的超鏈接向Web服務(wù)器發(fā)送一個特定請求。動作類的execute()方法被執(zhí)行并返回SUCCESS結(jié)果。Struts根據(jù)該結(jié)果返回一個視圖頁面(本例中是hellouser.jsp)。下面是HelloUserAction類的定義。1.創(chuàng)建Action動作類
packagecom.action;importcom.opensymphony.xwork2.ActionSupport;publicclassHelloUserActionextends
ActionSupport{privateStringmessage;//動作屬性
//省略getter方法和setter方法@OverridepublicStringexecute()throwsException{
setMessage("HelloStrutsUser");returnSUCCESS;}}1.創(chuàng)建Action動作類程序12.2index.jsp該頁面中使用了Struts的<s:url>標(biāo)簽。要使用Struts的標(biāo)簽,應(yīng)該使用taglib指令導(dǎo)入標(biāo)簽庫:<%@taglibprefix="s"uri="/struts-tags"%>該指令指定了Struts標(biāo)簽的prefix和uri屬性值。Struts標(biāo)簽以前綴“s”開頭,如<s:url>標(biāo)簽用來產(chǎn)生一個URL,它的action屬性用來指定動作名,這里是hello。當(dāng)用戶點(diǎn)擊該鏈接時將向容器發(fā)送hello.action請求動作。2.創(chuàng)建視圖頁面創(chuàng)建下面的JSP頁面hellouser.jsp來顯示HelloUserAction動作類的message屬性值,代碼如下。
程序12.3hellouser.jsp頁面中<s:property>標(biāo)簽顯示HelloUserAction動作類的message屬性值。通過在value屬性中的message告訴Struts框架調(diào)用動作類的getMessage()。2.創(chuàng)建視圖頁面index.jsp頁面<%@pagecontentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%><%@taglibprefix="s"uri="/struts-tags"%><html><head><title>BasicStruts2Application-Welcome</title></head><body><h3>WelcomeToStruts2!</h3><p><ahref="<s:urlaction='hello'/>">HelloUser</a></p></body></html>hellouser.jsp頁面<%@pagecontentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@taglibprefix="s"uri="/struts-tags"%><html><head><title>HelloUser!</title></head><body><h2><s:propertyvalue="message"/></h2></body></html>編輯struts.xml文件,在<package>元素中添加<action>定義,修改后的代碼如下。
<actionname="index"><result>/index.jsp</result></action>
<actionname="hello"class="“method="execute"><resultname="success">/hellouser.jsp</result></action>3.修改struts.xml配置文件訪問index.jsp頁面,當(dāng)用戶單擊該頁面中的“HelloUser”鏈接。4.程序的運(yùn)行(1)容器接收對資源hello.action的請求,根據(jù)web.xml文件的配置將所有請求轉(zhuǎn)發(fā)到過濾類,該類對象是進(jìn)入框架的入口點(diǎn)。(2)Struts框架在struts.xml文件中查找名為hello的動作映射,發(fā)現(xiàn)該映射對應(yīng)于HelloUserAction類,Struts實(shí)例化該類,然后調(diào)用其execute()方法。(3)在execute()方法中調(diào)用setMessage()方法設(shè)置message屬性值并返回SUCCESS??蚣軝z查struts.xml文件中的動作映射,并告訴容器執(zhí)行結(jié)果頁面hellouser.jsp。(4)在處理hellouser.jsp頁面時,標(biāo)簽<s:propertyvalue="message"/>將調(diào)用HelloUserAction對象的getMessage()方法,返回message的值,將響應(yīng)發(fā)送給瀏覽器。5.程序的執(zhí)行過程假設(shè)在index.jsp頁面中通過表單提供用戶名信息,在hellouser.jsp頁面中顯示用戶名。在index.jsp頁面中添加下面的表單標(biāo)簽:<s:formaction="hello"> <s:textfieldname="userName"label="用戶名"/> <s:submitvalue="提交"/></s:form>6.顯示個性化信息HelloUserAction類必須定義一個名為userName的成員變量和一個名為setUserName()的public方法,Action對象會自動接收表單域的值。privateStringuserName;publicStringgetUserName(){ returnuserName;}publicvoidsetUserName(StringuserName){ this.userName=userName;}6.顯示個性化信息在execute()方法設(shè)置message屬性值:if(userName!=null){ setMessage(getMessage()+""+userName);}訪問index.jsp頁面,在用戶名文本框中輸入Hacker,單擊“提交”按鈕,顯示的頁面如下。6.顯示個性化信息12.1.5Action動作類Struts2應(yīng)用程序可以完成的每一個操作都稱之為一個動作。例如,點(diǎn)擊一個超鏈接是一個動作,輸入表單數(shù)據(jù)后點(diǎn)擊提交按鈕也是一個動作。創(chuàng)建各種動作是Struts2開發(fā)中最重要的任務(wù)。有些動作很簡單,例如把控制權(quán)轉(zhuǎn)交給一個JSP頁面,而有些動作需要進(jìn)行一些邏輯處理,這些邏輯需要寫在動作類里。處理這些動作使用動作類。動作類其實(shí)質(zhì)就是Java類,它們可以有屬性和方法,但必須遵守下面規(guī)則。每個屬性都必須有一個getter方法和一個setter方法。動作屬性的名字必須遵守與JavaBeans屬性名同樣的命名規(guī)則。動作的屬性可以是任意類型,而不僅僅是String類型。12.1.5Action動作類動作類必須有一個不帶參數(shù)的構(gòu)造方法。如果沒有提供構(gòu)造方法,Java編譯器會自動提供一個默認(rèn)構(gòu)造方法。每個動作類至少有一個方法供Struts2在執(zhí)行這個動作時調(diào)用。一個動作類可以包含多個動作方法。在這種情況下,動作類可以為不同的動作提供不同的方法。例如,一個名為UserAction的動作類可以有l(wèi)ogin()和logout()方法,并讓它們分別對應(yīng)User_login和User_logout動作。12.1.5Action動作類Struts2定義了一個接口,所有的動作類都可以實(shí)現(xiàn)該接口,該接口中定義了5個常量和一個execute()方法,如下所示:1.Action接口publicinterfaceAction{ publicfinalstaticStringSUCCESS="success"; publicfinalstaticStringERROR="error"; publicfinalstaticStringINPUT="input"; publicfinalstaticStringLOGIN="login"; publicfinalstaticStringNONE="none"; publicStringexecute()throwsException;}1.Action接口編寫動作類通常繼承ActionSupport類,它是Action接口的實(shí)現(xiàn)類,該類還實(shí)現(xiàn)了Validateable接口、TextProvider等接口。設(shè)置校驗(yàn)錯誤的方法、返回校驗(yàn)錯誤的方法。設(shè)置和返回動作消息的方法。返回國際化信息的方法。
2.ActionSupport類ActionSupport類是Struts2的默認(rèn)動作處理類,即如果配置的Action沒有指定class屬性,系統(tǒng)自動使用ActionSupport類作為動作處理類。在Struts2中,動作類不一定必須實(shí)現(xiàn)Action接口,任何普通的Java對象(PlainOldJavaObjects,POJO)只要定義execute()方法就可以作為動作類使用。2.ActionSupport類下面的MyAction類是最簡單的動作類。
publicclassMyAction{publicStringexecute()throwsException{//執(zhí)行某些操作
return"success";}}注意,MyAction類沒有實(shí)現(xiàn)任何接口和擴(kuò)展任何類。動作執(zhí)行將調(diào)用這里的execute()方法,該方法不帶參數(shù),返回一個String對象。2.ActionSupport類12.1.6配置文件struts.xml文件主要用來建立動作Action類與視圖的映射。該文件是以<struts>為根元素的XML文件。允許出現(xiàn)在<struts>和</struts>之間的直接子元素包括package、constant、bean和include,這些元素還可包含若干子元素。12.1.6配置文件struts.xml文件DTD的完整定義在文件中,文件名為struts-2.3.dtd。下面對幾個比較重要的元素進(jìn)行討論。1.package元素<package>元素用來把動作組織成不同的包(package)。一個典型的struts.xml文件可以有一個或多個包。package元素的作用是對配置的信息進(jìn)行邏輯分組。使用該元素可以將具有類似特征的action等配置信息定義為一個邏輯配置單元,這樣可以避免重復(fù)定義。1.package元素package元素的常用屬性name是指定該包的名稱,其他包可使用此名稱引用該包extends
指定當(dāng)前包繼承哪一個已經(jīng)定義的包namespace為這個包指定一個URL映射地址abstract指定當(dāng)前包為抽象的,即該包中不能包含action的定義1.package元素在package中可以配置的信息包括actionresultinterceptor<packagename="example"
namespace="/example"
extends="default"><actionname="HelloWorld"class="example.HelloWorld"><result>/example/HelloWorld.jsp</result></action><actionname="Login_*"method="{1}"class="example.Login"><resultname="input">/example/Login.jsp</result><resulttype="redirectAction">Menu</result></action><actionname="*"class="example.ExampleSupport"><result>/example/{1}.jsp</result></action></package>用于定義一個動作。每個動作都必須有一個名字屬性:name指定動作名稱class指定動作完整類名,缺省為ActionSupport類method指定執(zhí)行動作的方法名,缺省為execute()方法2.action元素如果動作有與之對應(yīng)的動作類,則必須使用class屬性指定動作類的完整名稱。此外,還可以指定執(zhí)行動作類的哪個方法。下面是一個例子。<actionname="Product_save"class=""method="save">
2.action元素如果給出了class屬性但沒有給出method屬性,動作方法的名字將默認(rèn)為execute()。下面兩個action元素的含義是等價(jià)的。<actionname="Emp_save"class=""method="execute"><actionname="Emp_save"class="">2.action元素用來指定結(jié)果類型,即定義在動作完成后將控制權(quán)轉(zhuǎn)到哪里。<result>元素對應(yīng)動作方法的返回值。動作方法在不同的情況下可能會返回不同的值一個<action>元素可能會有多個<result>元素,每個對應(yīng)著動作方法的一種返回值。3.result元素比如,若某個方法有“success”和“input”兩種返回值,就必須提供兩個<result>元素。例如,下面的<action>元素包含兩個<result>元素。<actionname="Product_save"class=""method="save"><resultname="success"type="dispatcher">/jsp/Confirm.jsp</result><resultname="input"type="dispatcher">/jsp/Product.jsp</result></action>3.result元素如果省略<result>元素的name屬性,其默認(rèn)值是“success”,如果省略了type屬性,默認(rèn)結(jié)果類型是Dispatcher。下面兩個<result>元素的含義是相同的。<resultname="success"type="dispatcher">/jsp/Confirm.jsp</result><result>/jsp/Confirm.jsp</result>3.result元素<package>元素可以包含一個<global-results>元素,其中包含一些通用的結(jié)果。如果某個動作在它的動作聲明中不能找到一個匹配的結(jié)果,它將搜索<global-results>元素(如果有這個元素的話)。下面是<global-results>元素的一個例子。<global-results><resultname="error">/jsp/GenericErrorPage.jsp</result><resultname="login"type="redirect-action">login.jsp</result></global-results>4.global-results元素
5.constant元素
<constant>元素用來定義常量或覆蓋perties文件里定義的常量。如下所示的<constant>元素將把struts.DevMode項(xiàng)設(shè)置為true。<constantname="struts.DevMode"value="true">
6.include元素<include>元素的作用是包含其他的Struts2配置文件。這樣,通過<include>元素就可以輕松地把Struts2的配置文件分解為多個文件。<include>元素是<struts>的直接子元素,下面是一個例子。<struts><includefile="module-1.xml"/><includefile="example.xml"/></struts>12.2注冊/登錄系統(tǒng)本節(jié)實(shí)現(xiàn)一個注冊/登錄系統(tǒng)。按照MVC設(shè)計(jì)模式,可以將應(yīng)用組件分成如下:模型層包括存放用戶信息的JavaBean類。持久層包括數(shù)據(jù)庫表、DAO類等。控制層包括Action動作類。表示層包括JSP頁面。12.2注冊/登錄系統(tǒng)12.2.1定義持久化類12.2.2持久層實(shí)現(xiàn)12.2.3定義Action動作類12.2.4創(chuàng)建結(jié)果視圖12.2.5修改struts.xml配置文件12.2.6運(yùn)行應(yīng)用程序
12.2.1定義持久化類為了封裝表單數(shù)據(jù),定義一個簡單的User類,該類遵循JavaBeans規(guī)范,包含下面4個屬性。
privateStringusername;privateStringpassword;privateintage;privateStringemail;程序12.4User.java12.2.2持久層實(shí)現(xiàn)用戶數(shù)據(jù)存放在一個名為userinfo的數(shù)據(jù)表中,該表有username、password、age和email字段。CREATETABLEuserinfo(usernamevarchar(20)PRIMARYKEY,--用戶名
passwordvarchar(8)NOTNULL,--口令
ageint,--年齡
emailvarchar(50)UNIQUE);--Email地址
這里持久層實(shí)現(xiàn)使用Hibernate,需將庫文件添加到WEB-INF/lib目錄中,User類的映射文件如下。程序12.5在配置文件中增加下面一行:<mappingresource="com/model/"/>12.2.2持久層實(shí)現(xiàn)12.2.3定義Action動作類下面的RegisterAction.java程序是一個動作類。在該類中聲明了一個User類型的屬性user,并為該屬性定義了setter方法和getter方法。user對象與JSP頁面表單域使用的user名匹配。程序12.6RegisterAction.java12.2.3定義Action動作類當(dāng)表單提交時,Struts動作類首先使用User類的默認(rèn)構(gòu)造方法創(chuàng)建user屬性對象,然后用表單域的值填充該user對象的每個屬性,這個過程發(fā)生在execute()執(zhí)行之前。該類定義了register()和login(),分別用來處理注冊和登錄動作。在各自的方法體中創(chuàng)建一個Session對象,然后使用save(user()將user對象寫入數(shù)據(jù)庫,使用Query的list()檢索數(shù)據(jù)庫中是否存在user對象,從而實(shí)現(xiàn)注冊和登錄功能。12.2.4創(chuàng)建結(jié)果視圖為了將表單數(shù)據(jù)收集到User對象中,定義下面的頁面register.jsp,其中包含一個表單用來接收用戶輸入數(shù)據(jù)。程序12.7register.jsp12.2.4創(chuàng)建結(jié)果視圖當(dāng)用戶點(diǎn)擊“提交”按鈕時系統(tǒng)執(zhí)行Register動作,將表單數(shù)據(jù)提交給動作對象,因此需要在struts.xml文件中定義動作名稱。注意,4個輸入域的name屬性值對應(yīng)于User類的4個屬性,這里用對象名user來引用4個屬性。當(dāng)我們創(chuàng)建Action類處理該表單時,必須在Action類中指定該對象。12.2.4創(chuàng)建結(jié)果視圖頁面中的<s:actionerror/>和<s:fielderror/>標(biāo)簽用來顯示動作錯誤和域校驗(yàn)的錯誤。該應(yīng)用程序還包括登錄頁面login.jsp用來顯示用戶登錄信息,代碼如下。程序12.8login.jspsuccess.jsp是注冊成功顯示的頁面,代碼如下。程序12.9success.jsp12.2.4創(chuàng)建結(jié)果視圖success.jsp是注冊成功顯示的頁面,代碼如下。程序12.9success.jsp該頁面通過<s:property>標(biāo)簽顯示user對象的信息,它將調(diào)用User類的toString()輸出結(jié)果。welcome.jsp頁面用于顯示登錄成功歡迎消息,代碼如下。程序12.10welcome.jsp12.2.5修改struts.xml配置文件<actionname="registerInput"><result>/register.jsp</result></action><actionname="loginInput"><result>/login.jsp</result></action><actionname="Register"class="com.action.RegisterAction"method="register"><resultname="success">/welcome.jsp</result><resultname="error">/error.jsp</result></action><actionname="Login"class="com.action.RegisterAction"method="login"><resultname="success">/success.jsp</result><resultname="error">/error.jsp</result></action>
12.2.6運(yùn)行應(yīng)用程序在index.jsp頁面中添加下列代碼定義兩個動作<p><ahref="<s:urlaction='registerInput'/>">用戶注冊</a></p><p><ahref="<s:urlaction='loginInput'/>">用戶登錄</a></p>在index.jsp頁面中單擊“用戶注冊”鏈接,打開register.jsp頁面,如圖12-4所示。在該頁面中輸入用戶信息,單擊“注冊”按鈕,則顯示如圖12-5所示頁面。12.2.6運(yùn)行應(yīng)用程序12.3OGNLOGNL(Object-GraphNavigationLanguage)稱為對象-圖導(dǎo)航語言,它是一種簡單的、功能強(qiáng)大的表達(dá)式語言。使用OGNL表達(dá)式語言可以訪問存儲在ValueStack和ActionContext中的數(shù)據(jù)。12.3.1ValueStack棧對應(yīng)用程序的每一個動作,Struts在執(zhí)行相應(yīng)的動作方法前會先創(chuàng)建一個ValueStack對象,稱為值棧。ValueStack用來保存該動作對象及其屬性。JSP頁面能夠訪問ValueStack
12.3.1ValueStack棧在ValueStack棧的內(nèi)部有兩個邏輯組成部分,分別是ObjectStack和StackContext,如圖12.6所示。ObjectStack
parametersrequestsessionapplicationattr
Object0Object1…ObjectnStackContext12.3.2讀取ObjectStack中對象屬性
要訪問ObjectStack中對象的屬性,可以使用以下幾種形式之一:pertyNameobject['propertyName']object["propertyName"]若棧頂動作對象有一個message屬性,則可以用下面形式引用:[0].message[0]["message"][0]['message']如果從棧頂對象開始搜索,則可以省略下標(biāo)部分。例如,[0].message可直接寫成message的形式。<s:propertyvalue="message"/>還可以使用下面的語法訪問動作類的getMessage()方法:<s:propertyvalue="getMessage()"/>示例定義SampleAction動作類publicclassSampleAction{privateStringmessage;privateUserBeanuser=newUserBean();{user.setUsername("王小明");}publicStringexecute(){setMessage("世界,你好!");return"success";}示例在struts.xml文件中使用下面<action>元素定義動作。<actionname="sample"class="" method="execute"><resultname="success">/sample.jsp</result></action>示例在index.jsp頁面中添加下面代碼定義一個超鏈接引發(fā)sample動作。<ahref="<s:urlaction='sample'/>">SampleJSP</a>
示例sample.jsp<b>[0].user.username:</b><s:propertyvalue="[0].user.username"/><br><b>user.username:</b><s:propertyvalue="user.username"/><br><b>message:</b><s:propertyvalue="[0]['message']"/><br><b>getMessage():</b><s:propertyvalue="getMessage()"/><br>12.3.3讀取Stack
Context對象的屬性在Stack
Context中包含下列對象:application、session、request、parameters、attr。這些對象都是Map類型的對象,可在其中存儲“鍵/值”對數(shù)據(jù)。12.3.3讀取Stack
Context對象的屬性application中包含當(dāng)前應(yīng)用的Servlet上下文屬性session中包含當(dāng)前會話級屬性request中包含當(dāng)前請求級屬性parameters中包含當(dāng)前請求的請求參數(shù)attr用于在request、session和application作用域中查找指定的屬性。12.3.3讀取Stack
Context對象的屬性要訪問Stack
Context中的對象需要給OGNL表達(dá)式加上一個前綴字符“#”,可以使用以下幾種形式之一:#pertyName#object['propertyName']#object["propertyName"]這里object為上述5個對象之一,propertyName為對象中的屬性名。例如:<s:propertyvalue="#application.userName"/>12.3.5使用OGNL訪問數(shù)組元素若動作類SampleAction中聲明一個String數(shù)組屬性,在JSP頁面中可以使用<s:property>標(biāo)簽訪問。privateString[]cities;publicStringexecute(){cities=newString[]{"北京","上海","天津","重慶"};return"success";}12.3.5使用OGNL訪問數(shù)組元素在JSP頁面中可以使用OGNL按如下方式訪問數(shù)組元素。<b>cities:</b><s:propertyvalue="cities"/><br><b>cities.length:</b><s:propertyvalue="cities.length"/><br><b>cities[0]:</b><s:propertyvalue="cities[0]"/><br><b>top.cities:</b><s:propertyvalue="top.cities"/><br>12.3.6使用OGNL訪問List類型的屬性privateList<String>fruitList=newArrayList<String>();{fruitList.add("蘋果");fruitList.add("橘子");fruitList.add("香蕉");}publicStringexecute(){return"success";}12.3.6使用OGNL訪問List類型的屬性在JSP頁面中可以使用OGNL按如下方式訪問ArrayList的元素。<b>fruitList:</b><s:propertyvalue="fruitList"/><br><b>fruitList.size:</b><s:propertyvalue="fruitList.size"/><br><b>fruitList[0]:</b><s:propertyvalue="fruitList[0]"/><br>12.3.7使用OGNL訪問Map類型的屬性privateMap<String,String>countryMap=newHashMap<String,String>();{countryMap.put("China","北京");countryMap.put("American","紐約");countryMap.put("Australia","堪培拉");}publicStringexecute(){return"success";}
12.3.7使用OGNL訪問Map類型的屬性在JSP頁面中可以使用OGNL按如下方式訪問Map的元素。<b>countryMap:</b><s:propertyvalue="countryMap"/><br><b>countryMap.size:</b><s:propertyvalue="countryMap.size"/><br><b>countryMap[1]:</b><s:propertyvalue="countryMap['China']"/><br>12.4Struts2常用標(biāo)簽Struts2框架提供了一個標(biāo)簽庫使得Web應(yīng)用程序可以很容易地在頁面中引用動態(tài)數(shù)據(jù),創(chuàng)建動態(tài)響應(yīng)。有些標(biāo)簽?zāi)7聵?biāo)準(zhǔn)的HTML標(biāo)簽,還有些標(biāo)簽用于創(chuàng)建非標(biāo)準(zhǔn)的控件。Struts2的標(biāo)簽可以分為兩大類:通用標(biāo)簽用戶界面(UI)標(biāo)簽12.4Struts2常用標(biāo)簽12.4.1通用標(biāo)簽1.<s:property>標(biāo)簽2.<s:param>標(biāo)簽3.<s:bean>標(biāo)簽4.<s:set>標(biāo)簽5.<s:push>標(biāo)簽6.<s:url>標(biāo)簽7.<s:action>標(biāo)簽8<s:date>標(biāo)簽9<s:include>標(biāo)簽10.<s:debug>標(biāo)簽1.<s:property>標(biāo)簽用于在頁面中輸出一個動作屬性值。例如,下面標(biāo)簽將輸出customerId動作屬性的值。
<s:propertyvalue="customerId"/>下面這個<s:property>標(biāo)簽將輸出會話作用域中名為userName的屬性值。<s:propertyvalue="#session.userName"/>1.<s:property>標(biāo)簽如果沒有給出value屬性,將輸出ValueStack棧頂對象的值。通常,EL語言可以提供更簡潔的語法。例如,下面的EL表達(dá)式同樣可以輸出customerId動作屬性的值。${customerId}2.<s:param>標(biāo)簽<s:param>標(biāo)簽用于把一個參數(shù)傳遞給包含它的標(biāo)簽(如<s:bean>、<s:url>等)。它有兩個屬性:name,值為參數(shù)名value,值為參數(shù)值。<s:paramname="userName"value="userName"/><s:paramname="userName"value="%{userName}"/>2.<s:param>標(biāo)簽如果要傳遞一個String類型的字符串作為參數(shù)值,必須把它用單引號括起來。例如:<s:paramname="empName"value="'JohnSmith'"></s:param>也可以將value屬性值寫在<s:param>標(biāo)簽的開始標(biāo)簽和結(jié)束標(biāo)簽之間,如下所示:<s:paramname="empName">JohnSmith</s:param>3.<s:bean>標(biāo)簽<s:bean>標(biāo)簽用于創(chuàng)建JavaBean實(shí)例,并把它壓入ValueStack棧的StackContext。這個標(biāo)簽的功能與JSP的<jsp:useBean>動作很相似。下面定義一個ConverterBean用來實(shí)現(xiàn)攝氏溫度和華氏溫度的相互轉(zhuǎn)換。3.<s:bean>標(biāo)簽publicclassConverterBean{privatedoublecelcius;privatedoublefahrenheit;
publicdoublegetCelcius(){return(fahrenheit-32)*5/9;}publicvoidsetCelcius(doublecelcius){this.celcius=celcius;}publicdoublegetFahrenheit(){returncelcius*9/5+32;}publicvoidsetFahrenheit(doublefahrenheit){this.fahrenheit=fahrenheit;}}3.<s:bean>標(biāo)簽下面的tagDemo.jsp頁面中使用了<s:bean>和<s:param>標(biāo)簽。<body>
<p>Bean
Tag
Example</p>
<s:bean
name=""
id="converter">
<s:param
name="celcius">37</s:param>
</s:bean>37°C=<s:property
value="#converter.fahrenheit"/>°F</body>4.<s:set>標(biāo)簽
<s:set>標(biāo)簽用來在指定作用域中定義一個屬性并為其賦值,然后將其存儲到StackContext中。使用<s:set>標(biāo)簽定義popLanguage變量并賦值,然后訪問該變量。name屬性指定變量名,value屬性指定變量值。<s:setname="popLanguage"value="%{'Java'}"/>PopularLanguageis:<s:propertyvalue="#popLanguage"/>5.<s:push>標(biāo)簽<s:push>標(biāo)簽與<s:set>標(biāo)簽類似,區(qū)別是<s:push>標(biāo)簽把一個對象壓入ValueStack而不是ContextMap。<s:push>標(biāo)簽的另一個特殊的地方是,它的起始標(biāo)簽把一個對象壓入棧,結(jié)束標(biāo)簽將彈出該對象。<s:push>標(biāo)簽只有一個value屬性,它指定將被壓入ValueStack棧中的值。5.<s:push>標(biāo)簽假設(shè)有一名為Employee的JavaBean類,該類有name和age兩個屬性。在JSP中可使用下列代碼創(chuàng)建一個bean實(shí)例并將其壓入ValueStack。<s:beanname=""var="empBean">姓名:<s:propertyvalue="#empB"/><br/>年齡:<s:propertyvalue="#empBean.age"/></s:bean><hr/><s:pushvalue="#empBean">姓名:<s:propertyvalue="name"/><br/>年齡:<s:propertyvalue="age"/></s:push>6.<s:url>標(biāo)簽<s:url>標(biāo)簽用來創(chuàng)建一個超鏈接,指向其他Web資源,尤其是本應(yīng)用程序的資源。例如:<p><ahref="<s:urlaction='hello'/>">HelloWorld</a></p>該標(biāo)簽通過action屬性指定引用的資源。當(dāng)程序運(yùn)行時,將鼠標(biāo)指向鏈接,可以看到鏈接的目標(biāo)是hello.action,它相對于Web應(yīng)用程序的根目錄。6.<s:url>標(biāo)簽在<s:url>標(biāo)簽內(nèi)可以使用<s:param>標(biāo)簽為URL提供查詢串。例如:<s:urlaction="hello"var="helloLink"><s:paramname="userName">BrucePhillips</s:param></s:url><p><ahref="${helloLink}">HelloBrucePhillips</a></p>這里,使用<s:param>為請求提供一個查詢參數(shù),userName為參數(shù)名,標(biāo)簽內(nèi)的值為參數(shù)值。7.<s:action>標(biāo)簽<s:action>標(biāo)簽用于在JSP頁面中直接調(diào)用一個Action。
8<s:date>標(biāo)簽<s:date>標(biāo)簽用來對Java語言的一個Date對象進(jìn)行格式化。用戶可以指定一種輸出格式(如,“dd/MM/yyyyhh:mm”),還可以產(chǎn)生易讀的格式(如,“2小時,14分鐘”)。privateDatecurrentDate;publicStringexecute()throwsException{setCurrentDate(newDate());returnSUCCESS;}9<s:include>標(biāo)簽<s:include>標(biāo)簽用于將一個JSP頁面,或者一個Servlet的輸出包含到本頁面中。該標(biāo)簽只有一個必須的value屬性,用于指定需要包含的JSP頁面或Servlet。在<s:include>標(biāo)簽體中還可以使用<s:param>子標(biāo)簽為被包含的JSP頁面或Servlet傳遞參數(shù)。9<s:include>標(biāo)簽<p>IncludeTag(DataTags)Example!</p><s:includevalue="included_file.jsp"/><s:includevalue="included_file.jsp"><s:paramname="title">Hello,World!</s:param></s:include>10.<s:debug>標(biāo)簽在JSP頁面中可以使用<s:debug/>標(biāo)簽,它將生成一個【Debug】鏈接,單擊該鏈接可以顯示ValueStack和StackContext中有關(guān)信息,如圖12.10所示。12.4.2控制標(biāo)簽1.<s:if>,<s:else>和<s:elseif>標(biāo)簽2.<s:iterator>標(biāo)簽3.<s:append>標(biāo)簽4.<s:merge>標(biāo)簽5.<s:generator>標(biāo)簽6.<s:sort>標(biāo)簽1.<s:if>,<s:else>和<s:elseif>標(biāo)簽這3個標(biāo)簽用來進(jìn)行條件測試,它們的用途與Java語言中的if,else和elseif結(jié)構(gòu)類似。<s:if>和<s:elseif>標(biāo)簽必須帶一個test屬性,用來設(shè)置測試條件。例如,下面這個<s:if>標(biāo)簽用來測試name請求參數(shù)是否為空值null。<s:iftest="#==null">1.<s:if>,<s:else>和<s:elseif>標(biāo)簽下面例子使用<s:if>標(biāo)簽測試會話屬性loggedIn是否存在。若不存在顯示一個登錄表單,若存在顯示歡迎信息。publicStringexecute(){if(username!=null&&username.length()>0&&password!=null&&password.length()>0){ServletActionContext.getContext().getSession().put("loggedIn",true);}returnSUCCESS;}1.<s:if>,<s:else>和<s:elseif>標(biāo)簽
<s:iftest="#session.loggedIn==null"><h3>請輸入用戶名和口令</h3><s:form><s:textfieldname="username"label="用戶名"/><s:passwordname="password"label="口令"/><s:submitvalue="登錄"/></s:form></s:if><s:else>Welcome<s:propertyvalue="username"/></s:else>2.<s:iterator>標(biāo)簽<s:iterator>標(biāo)簽可以遍歷一個數(shù)組、一個Collection或一個Map對象并把其中的每一個元素壓入和彈出ValueStack棧。表12.10<s:iterator>標(biāo)簽的屬性2.<s:iterator>標(biāo)簽<s:iterator>標(biāo)簽在開始執(zhí)行時,會先把類的一個實(shí)例壓入ContextMap并在每次遍歷時更新它??梢詫⒁粋€指向這個IteratorStatus對象的變量賦給status屬性。
2.<s:iterator>標(biāo)簽表12.11IteratorStatus對象的屬性2.<s:iterator>標(biāo)簽下面的例子在IteratorAction動作類中定義了一個List屬性和一個Map屬性,并向其中添加了一些元素。iteratorTag.jsp頁面演示了如何使用<s:iterator>標(biāo)簽訪問這些集合對象的元素。程序12.15IteratorAction.java下面是iteratorTag.jsp頁面代碼。程序12.16iteratorTag.jsp2.<s:iterator>標(biāo)簽
<s:iteratorvalue="fruit"status="status"><s:property/><s:iftest="!#status.last">,</s:if><s:else><br></s:else></s:iterator>2.<s:iterator>標(biāo)簽<s:iterator>標(biāo)簽的value屬性值也可以通過常量或使用<s:set>標(biāo)簽指定值,例如:<s:iteratorvalue="{'one','two','three','four'}"><s:property/></s:iterator>2.<s:iterator>標(biāo)簽<s:setname="os"value="{'Windows','Linux','Solaries'}"/><s:iteratorvalue="#os"status="status"><s:property/><s:iftest="!#status.last">,</s:if></s:iterator>3.<s:append>標(biāo)簽<s:append>標(biāo)簽用于將多個集合對象拼接起來,形成一個新的集合。這樣就可以通過一個<s:iterator>標(biāo)簽實(shí)現(xiàn)對多個集合的迭代。使用<s:append>標(biāo)簽需要指定一個var屬性,該屬性值用來存放拼接后生成的集合對象,新集合被放入StackContext中。
3.<s:append>標(biāo)簽<s:append>標(biāo)簽可以帶多個<s:param>標(biāo)簽,每個<s:param>標(biāo)簽用來指定一個需要拼接的集合。子集合中的元素是以追加的方式拼接,即后面集合的元素追加到前面集合元素的后面。3.<s:append>標(biāo)簽<s:setvar="myList"value="{'one','two','three'}"/><!--拼接3個集合--><s:appendvar="newList"><s:paramvalue="{'OperatingSystem','DataStructure','JavaProgramming'}"/><s:paramvalue="#myList"/><s:paramvalue="fruit"/><!--動作類的屬性--></s:append>3.<s:append>標(biāo)簽<tableborder="1"width="260"><s:iteratorvalue="#newList"status="status"id="elem"><tr><td><s:propertyvalue="#status.count"/></td><td><s:propertyvalue="elem"/></td></tr></s:iterator></table>4.<s:merge>標(biāo)簽<s:merge>標(biāo)簽是將多個集合的元素合并,該標(biāo)簽與<s:append>標(biāo)簽類似。新集合的元素完全相同,但不同的是,<s:merge>標(biāo)簽是以交叉的方式合并集合元素。5.<s:generator>標(biāo)簽<s:generator>標(biāo)簽可以將指定字符串按指定分隔符分割成多個子串,臨時生成的子串可以使用<s:iterator>標(biāo)簽迭代輸出。在該標(biāo)簽體內(nèi),生成的集合位于ValueStack的頂端,一旦該標(biāo)簽結(jié)束,該集合將被移出ValueStack。<s:generator>標(biāo)簽的作用有點(diǎn)類似于String類的split()方法,但它比split()方法的功能更強(qiáng)大。5.<s:generator>標(biāo)簽表12.12<s:generator>標(biāo)簽的屬性5.<s:generator>標(biāo)簽<s:generatorval="%{'三星,諾基亞,摩托羅拉,小米'}"separator=","><ul><s:iterator><li><s:property/></li></s:iterator></ul></s:generator><s:generatorval="%{'奧迪,豐田,寶馬,比亞迪'}"separator=","id="cars"count="3"></s:generator><s:iteratorvalue="#attr.cars"><s:property/></s:iterator>
6.<s:sort>標(biāo)簽<s:sort>用來對一個可遍歷對象里的元素進(jìn)行排序。表12.13列出了它的屬性。6.<s:sort>標(biāo)簽下面的例子在SortTagAction類中定義了一個ArrayList對象存放Student對象,一個myComparator的比較器對象,使用該對象對學(xué)生集合進(jìn)行排序。程序12.17SortTagAction.java在JSP頁面中使用<s:sort>標(biāo)簽對學(xué)生對象使用指定的比較器進(jìn)行排序,結(jié)果可存入一個變量中,然后使用<s:iterator>標(biāo)簽迭代輸出。程序12.18sortDemo.jsp12.4.3表單UI標(biāo)簽表單UI標(biāo)簽主要用來在HTML頁面中顯示數(shù)據(jù)。UI標(biāo)簽的使用非常簡單。UI標(biāo)簽可以根據(jù)選定的主題自動生成HTML代碼。默認(rèn)情況下,使用XHTML主題,該主題使用表格定位表單元素。1.表單標(biāo)簽的公共屬性在HTML語言中,表單中的元素?fù)碛幸恍┩ㄓ玫膶傩?,如id屬性、name屬性以及JavaScript中的事件等。與HTML中相同,Struts2提供的表單標(biāo)簽也存在通用的屬性,而且這些屬性比較多。1.表單標(biāo)簽的公共屬性1.表單標(biāo)簽的公共屬性2.<s:form>標(biāo)簽
<s:form>標(biāo)簽用來創(chuàng)建表單,它使得創(chuàng)建輸入表單更容易。Struts2表單標(biāo)簽?zāi)M普通的表單標(biāo)簽,每個<s:form>標(biāo)簽帶有多個屬性,action屬性用來指定動作。
3.<s:textfield>和<s:password>標(biāo)簽
<s:textfield>標(biāo)簽用來生成HTML的單行輸入框,<s:password>標(biāo)簽用來生成HTML的口令輸入框,這兩個標(biāo)簽的公共屬性如表12.15所示。
3.<s:textfield>和<s:password>標(biāo)簽
下面是一段簡單的表單代碼。<s:formaction="login"><s:textfieldname="userName"label="用戶名"/><s:submitvalue="提交"/></s:form>3.<s:textfield>和<s:password>標(biāo)簽
Struts2表單標(biāo)簽最終都轉(zhuǎn)換成HTML標(biāo)準(zhǔn)標(biāo)簽。查看頁面的源文件,<s:form>標(biāo)簽轉(zhuǎn)換后的代碼4.<s:textarea>標(biāo)簽<s:textarea>標(biāo)簽用來生成HTML的文本區(qū),該標(biāo)簽的常用屬性如表12.16所示。4.<s:textarea>標(biāo)簽例如,下面代碼生成一個8行35列的文本區(qū)。<s:textareaname="description"label="簡歷:"rows="8"cols="35"/>5.<s:submit>和<s:reset>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ???025年海南海口市旅游和文化廣電體育局招聘5人筆試歷年參考題庫附帶答案詳解
- 河南2025年河南女子職業(yè)學(xué)院招聘人事代理人員筆試歷年參考題庫附帶答案詳解
- 杭州浙江杭州市西湖區(qū)傳媒中心招聘專業(yè)技術(shù)人員(編外)筆試歷年參考題庫附帶答案詳解
- 廣西2025年廣西人民醫(yī)院招聘筆試歷年參考題庫附帶答案詳解
- 宿遷2025年江蘇宿遷市洋河新區(qū)教育系統(tǒng)招聘教師7人筆試歷年參考題庫附帶答案詳解
- 威海2025年北京交通大學(xué)(威海)教輔管理人員招聘6人筆試歷年參考題庫附帶答案詳解
- 職業(yè)人群慢性病自我管理技能培訓(xùn)
- 北京2025年北京石油化工學(xué)院教師崗位招聘筆試歷年參考題庫附帶答案詳解
- 職業(yè)人群工作壓力精準(zhǔn)干預(yù)策略
- 2026-2032年中國加那利草子行業(yè)進(jìn)出口態(tài)勢分析及對外貿(mào)易前景展望報(bào)告
- 活物賣買合同協(xié)議書模板
- 清潔驗(yàn)證完整版本
- 2023年山東省中考英語二輪復(fù)習(xí)專題++時態(tài)+語態(tài)
- 現(xiàn)場移交接收方案
- 基于大數(shù)據(jù)的金融風(fēng)險(xiǎn)管理模型構(gòu)建與應(yīng)用研究
- 腹痛的診斷與治療
- 中國郵票JT目錄
- D700-(Sc)13-尼康相機(jī)說明書
- T-CHAS 20-3-7-1-2023 醫(yī)療機(jī)構(gòu)藥事管理與藥學(xué)服務(wù) 第3-7-1 部分:藥學(xué)保障服務(wù) 重點(diǎn)藥品管理 高警示藥品
- 水利水電工程建設(shè)用地設(shè)計(jì)標(biāo)準(zhǔn)(征求意見稿)
- 建設(shè)工程施工專業(yè)分包合同(GF-2003-0213)
評論
0/150
提交評論