第5章 Struts 2框架入門(mén)_第1頁(yè)
第5章 Struts 2框架入門(mén)_第2頁(yè)
第5章 Struts 2框架入門(mén)_第3頁(yè)
第5章 Struts 2框架入門(mén)_第4頁(yè)
第5章 Struts 2框架入門(mén)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章Struts2框架入門(mén)5.2Struts2概覽5.3Struts2基礎(chǔ)5.1MVC框架5.4值棧與OGNL表達(dá)式5.5Struts2的標(biāo)簽庫(kù)5.1MVC框架5.1.2MVC設(shè)計(jì)模式5.1.3Struts2框架的MVC架構(gòu)5.1.1Model

1與Model

2返回5.1.1Model

1與Model

2(1)Model1Model1是在早期廣泛使用的一個(gè)模型。在Model1體系中,所有的HTTP請(qǐng)求都被直接發(fā)送到JSP文件中,JSP文件獨(dú)自響應(yīng)請(qǐng)求并將處理結(jié)果返回給用戶(hù)(所有的數(shù)據(jù)存取是由與JSP文件交互的Bean來(lái)實(shí)現(xiàn)的)。對(duì)于簡(jiǎn)單的應(yīng)用開(kāi)發(fā)而言,使用Model1是一個(gè)不錯(cuò)的選擇,但是它卻不能滿(mǎn)足復(fù)雜的大型應(yīng)用程序的實(shí)現(xiàn)。這是因?yàn)樵陂_(kāi)發(fā)一個(gè)大型的應(yīng)用程序時(shí),使用Model1可能會(huì)導(dǎo)致JSP頁(yè)面內(nèi)被嵌入大量的腳本片段或Java代碼,特別是當(dāng)需要處理的請(qǐng)求量很大時(shí),情況更為嚴(yán)重。對(duì)于網(wǎng)頁(yè)設(shè)計(jì)人員和維護(hù)人員來(lái)說(shuō),這簡(jiǎn)直就是災(zāi)難,因?yàn)轫?xiàng)目的開(kāi)發(fā)和管理勢(shì)必會(huì)因此而變得越來(lái)越困難。

5.1.1Model

1與Model

2(2)Model2Model2和Model1有一些不同。在Model2體系中,采用JSP與Servlet結(jié)合的方式來(lái)實(shí)現(xiàn)對(duì)用戶(hù)請(qǐng)求的處理,使用Servlet充當(dāng)控制器,使用JSP生成視圖界面。Servlet的任務(wù)是負(fù)責(zé)管理對(duì)請(qǐng)求進(jìn)行處理,以及創(chuàng)建JSP頁(yè)面需要使用的Bean和對(duì)象,同時(shí)根據(jù)用戶(hù)的請(qǐng)求將相應(yīng)的JSP頁(yè)面響應(yīng)給客戶(hù)端。JSP頁(yè)面則是負(fù)責(zé)檢索原先由Servlet創(chuàng)建的對(duì)象或Bean,從Servlet中提取動(dòng)態(tài)內(nèi)容插入靜態(tài)模板,它不負(fù)責(zé)處理業(yè)務(wù)邏輯。Model2的優(yōu)點(diǎn)就是它清晰地分離了表達(dá)和內(nèi)容,明確了角色的定義,以及開(kāi)發(fā)者與網(wǎng)頁(yè)設(shè)計(jì)者的分工。返回5.1.2MVC設(shè)計(jì)模式MVC組成 VC英文為Model-View-Controller,即把一個(gè)應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進(jìn)行分離,這樣一個(gè)應(yīng)用被分成3個(gè)層:模型層、視圖層和控制層,從而可以使同一個(gè)應(yīng)用程序使用不同的表現(xiàn)形式。原理

返回5.1.3Struts2框架的MVC架構(gòu)(1)Struts2中的MVCMVC架構(gòu) Struts2框架是一個(gè)基于MVC架構(gòu)的框架,它的MVC架構(gòu)如下圖所示。

5.1.3Struts2框架的MVC架構(gòu)(2)架構(gòu)模式前端控制器模式

Struts2框架接收以“*.action”結(jié)束的請(qǐng)求,并對(duì)該請(qǐng)求進(jìn)行處理。

頁(yè)面控制器模式頁(yè)面將直接請(qǐng)求指定的模型(Action),主要通過(guò)在JSP頁(yè)面中使用<s:action/>標(biāo)簽來(lái)實(shí)現(xiàn)返回5.2Struts2概覽5.2.2Struts2的簡(jiǎn)單應(yīng)用5.2.1Struts2的工作流程返回5.2.1Struts2的工作流程工作流程

Struts2框架作為一個(gè)表示層的框架,主要用于處理應(yīng)用程序與客戶(hù)端交互問(wèn)題。Struts2框架的基本工作流程如下圖所示。返回5.2.2Struts2的簡(jiǎn)單應(yīng)用(1)使用Struts2框架開(kāi)發(fā)一個(gè)簡(jiǎn)單的Web應(yīng)用程序

(1)創(chuàng)建一個(gè)Web應(yīng)用工程,工程的目錄結(jié)構(gòu)如下圖所示。5.2.2Struts2的簡(jiǎn)單應(yīng)用(2)(2)實(shí)現(xiàn)Action類(lèi)publicclassHelloAction{ privateStringmessage; //用于封裝HTTP請(qǐng)求參數(shù)的屬性

publicStringgetMessage(){ returnmessage; } publicvoidsetMessage(Stringmessage){

this.message=message; } publicStringexecute(){ //處理用戶(hù)請(qǐng)求

if((this.message.equals(""))||(this.message==null)){ message="請(qǐng)輸入問(wèn)候語(yǔ)"; } return"success"; }}5.2.2Struts2的簡(jiǎn)單應(yīng)用(3)(3)配置Action類(lèi) 創(chuàng)建完Action類(lèi)以后還需要將其在“struts.xml”文件中進(jìn)行配置,它用于配置Action的實(shí)現(xiàn)類(lèi)、邏輯視圖和物理視圖之間的映射關(guān)系<?xmlversion="1.0"encoding="GBK"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""/dtds/struts-2.0.dtd"><struts> <packagename="com"extends="struts-default"> <actionname="hello"class="com.struts2.hello.HelloAction"> <resultname="success">/hello.jsp</result> </action> </package></struts>5.2.2Struts2的簡(jiǎn)單應(yīng)用(4)(4)視圖頁(yè)面的實(shí)現(xiàn)

<%@pagelanguage="java"pageEncoding="gbk"%><%@taglibprefix="s"uri="/struts-tags"%><html> <head> <title>問(wèn)候程序</title> </head> <body> <s:propertyvalue="message"/> <s:formaction="hello"> <s:textfieldname="message"label="問(wèn)候語(yǔ)"value=""/> <br> <s:submitvalue="提交"/> </s:form> </body></html>5.2.2Struts2的簡(jiǎn)單應(yīng)用(5)(5)配置web.xml文件 在“web.xml”文件中配置Struts2的核心攔截器<filter> <filter-name>Struts2Filter</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class></filter><filter-mapping> <filter-name>Struts2Filter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>返回5.3Struts2基礎(chǔ)5.3.2結(jié)果與視圖5.3.3struts.xml的配置5.3.1Action詳解

返回5.3.1Action詳解(1)在Struts2應(yīng)用程序中,Action負(fù)責(zé)具體的業(yè)務(wù)邏輯處理,它是整個(gè)應(yīng)用的核心所在。Action可以以多種形式存在:普通的Java類(lèi)實(shí)現(xiàn)Action接口繼承ActionSupport1.普通的Java類(lèi)無(wú)參數(shù)的execute()方法:用于處理用戶(hù)請(qǐng)求。私有屬性及其屬性的set、get方法:Action類(lèi)中封裝HTTP請(qǐng)求參數(shù),因此私有屬性的名稱(chēng)應(yīng)和HTTP請(qǐng)求參數(shù)的名稱(chēng)保持一致;程序通過(guò)屬性的set、get方法來(lái)處理請(qǐng)求參數(shù),所以必須提供屬性的set、get方法。5.3.1Action詳解(2)2.實(shí)現(xiàn)Action接口Struts2提供了一個(gè)名為“com.opensymphony.xwork2.Action”的接口,開(kāi)發(fā)人員在創(chuàng)建Action類(lèi)時(shí)可實(shí)現(xiàn)該接口,3.繼承ActionSupport類(lèi)Struts2除了提供Action接口外,還提供了一個(gè)名為“com.opensymphony.xwork2.ActionSupport”的類(lèi),該類(lèi)實(shí)現(xiàn)了Action接口、Validateable接口、ValidationAware接口、TextProvider接口和LocaleProvider接口并提供了用于處理輸入校驗(yàn)、訪問(wèn)國(guó)際化資源包等不同的方法。5.3.1Action詳解(3)在Action中訪問(wèn)ServletAPI通過(guò)ActionContextActionContext

ctx=ActionContext.getContext(); //獲取一個(gè)ActionContext實(shí)例Mapsession=ctx.getSession(); //獲取SessionMapapplication=ctx.getApplication(); //獲取Application5.3.1Action詳解(4)通過(guò)實(shí)現(xiàn)*Aware()接口 publicclassTestimplementsSessionAware{ privateMapsession; privateUseruser; publicvoidsetSession(Mapsession){ //獲取Session

this.session=session; } publicStringexecute()throwsException{ if(user!=null){

session.put("user",user); return"success"; }else{ return"error"; } } } 返回5.3.2結(jié)果與視圖(1)在Struts2應(yīng)用程序中,所有的Action類(lèi)在處理完成之后返回的都是一個(gè)字符串類(lèi)型的結(jié)果,這個(gè)結(jié)果作為一個(gè)邏輯視圖而存在。Struts2框架正是通過(guò)這個(gè)字符串,在“struts.xml”配置文件中將邏輯視圖與物理視圖建立起映射關(guān)系,而這一實(shí)現(xiàn)是由<result>元素來(lái)聲明的。<actionname="Action名稱(chēng)"class="Action類(lèi)路徑"method="方法名"> <resultname="邏輯視圖名稱(chēng)"type="結(jié)果類(lèi)型"> <paramname="參數(shù)名稱(chēng)">參數(shù)值</param> </result></action>5.3.2結(jié)果與視圖(2)<result>元素包含兩個(gè)屬性name和type,其中name屬性指定了邏輯視圖名稱(chēng),type屬性指定了結(jié)果類(lèi)型。常用的類(lèi)型如下表所示:5.3.2結(jié)果與視圖(3)常用的結(jié)果類(lèi)型:1.請(qǐng)求轉(zhuǎn)發(fā)(dispatcher)請(qǐng)求轉(zhuǎn)發(fā)只能將請(qǐng)求轉(zhuǎn)發(fā)至同一個(gè)Web應(yīng)用。利用請(qǐng)求轉(zhuǎn)發(fā)瀏覽器的址欄不會(huì)發(fā)生變化。利用請(qǐng)求轉(zhuǎn)發(fā)調(diào)用者與被調(diào)用者之間共享相同的Request對(duì)象和Response對(duì)象,他們屬于同一個(gè)訪問(wèn)的請(qǐng)求和響應(yīng)。2.重定向(redirect) 重定向分為兩種情況:一種是生成一個(gè)全新的請(qǐng)求,另一種是重定向到另一個(gè)Action。重定向不僅可以指定到一個(gè)Web應(yīng)用,還能夠指定到任何JSP資源。重定向的訪問(wèn)結(jié)束后,瀏覽器的地址欄中顯示URL的變化。5.3.2結(jié)果與視圖(4)重定向的調(diào)用者與被調(diào)用者使用各自的Request對(duì)象和Response對(duì)象,他們屬于兩個(gè)獨(dú)立的訪問(wèn)請(qǐng)求和響應(yīng)過(guò)程。

對(duì)于重定向結(jié)果的類(lèi)型,可以在<result>元素中設(shè)置兩個(gè)參數(shù):“l(fā)ocation”和“parse”。location:指定重定向的地址。parse:指定在location參數(shù)中是否使用OGNL表達(dá)式,它的默認(rèn)值是“true”。通過(guò)過(guò)該參數(shù)的使用,系統(tǒng)會(huì)對(duì)結(jié)果配置信息中的OGNL表達(dá)式進(jìn)行解析、運(yùn)算,并用運(yùn)算結(jié)果替換掉原有OGNL表達(dá)式。

重定向示例代碼:<actionname="hello"class="com.struts2.hello.HelloAction"> <resultname="success"type="redirect"> <paramname="location">/show.action?arg="${message}"</param> <paramname="parse">true</param> </result></action>5.3.2結(jié)果與視圖(5)3.Action鏈(chain) 當(dāng)一個(gè)Action執(zhí)行完成后需要直接跳轉(zhuǎn)到另一個(gè)Action,此時(shí)就要用到Action鏈。通過(guò)Action鏈的使用,可以輕松實(shí)現(xiàn)兩個(gè)Action之間的數(shù)據(jù)共享。在Struts2中,Action鏈?zhǔn)峭ㄟ^(guò)一個(gè)叫做“chain”的攔截器實(shí)現(xiàn)的。返回5.3.3struts.xml的配置struts.xml文件是Struts2應(yīng)用中的一個(gè)核心配置文件,它是程序整個(gè)運(yùn)行流程的依據(jù),Struts2正是根據(jù)這個(gè)文件所配置的信息才知道處理什么程序、什么時(shí)候處理、如何進(jìn)行處理等。返回5.4值棧與OGNL表達(dá)式(1)值棧值棧中存儲(chǔ)的對(duì)象主要包括以下4種類(lèi)型:臨時(shí)對(duì)象(TemporaryObject):該對(duì)象是在程序執(zhí)行過(guò)程中,由容器自動(dòng)創(chuàng)建并存儲(chǔ)到值棧中的。臨時(shí)對(duì)象的值并不固定,會(huì)隨著應(yīng)用不同而發(fā)生變化。當(dāng)應(yīng)用結(jié)束時(shí),該對(duì)象會(huì)被清空。比如當(dāng)在頁(yè)面中利用Struts2標(biāo)簽輸出迭代的值時(shí),這些值都將以臨時(shí)對(duì)象的形式存放到值棧中。模型對(duì)象(ModelObject):該對(duì)象僅在Action使用模型驅(qū)動(dòng)方式傳值的時(shí)候被用到。如果某個(gè)Action中應(yīng)用了模型驅(qū)動(dòng)(model-driven),當(dāng)Action被請(qǐng)求時(shí),“modeldriven”攔截器會(huì)自動(dòng)從此Action中獲得模型對(duì)象,并將所獲得的對(duì)象放置在值棧中對(duì)應(yīng)Action對(duì)象的上面。當(dāng)JSP頁(yè)面需要用到這些對(duì)象所攜帶數(shù)據(jù)時(shí),也會(huì)到值棧去找對(duì)應(yīng)模型對(duì)象,獲取數(shù)值。Action對(duì)象(ActionObject):當(dāng)每個(gè)Action請(qǐng)求到來(lái)的時(shí)候,容器都會(huì)先創(chuàng)建一個(gè)此Action的對(duì)象并存入值棧,該對(duì)象攜帶所有與Action執(zhí)行過(guò)程有關(guān)的信息。命名對(duì)象(NamedObjects):主要包括Servlet作用范圍內(nèi)相關(guān)的對(duì)象信息,比如Request、Session、Application等。5.4值棧與OGNL表達(dá)式(2)值棧中對(duì)象的存儲(chǔ)順序如圖所示OGNL表達(dá)式OGNL全稱(chēng)是Object-GraphNavigationLanguage,意思是圖對(duì)象導(dǎo)航語(yǔ)言,它是表達(dá)式語(yǔ)言的一種。OGNL的功能非常強(qiáng)大,它通過(guò)簡(jiǎn)單一致的語(yǔ)法,可以任意存取對(duì)象的屬性或者調(diào)用對(duì)象的方法,并能夠遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)對(duì)象屬性字段的類(lèi)型轉(zhuǎn)化.Struts2中的很多地方都要用到OGNL表達(dá)式,比如Struts2的標(biāo)簽、Struts2的校驗(yàn)文件等。1.使用OGNL訪問(wèn)JavaBean在OGNL中使用“.”對(duì)導(dǎo)航圖進(jìn)行遍歷,例如“randfather.father.child”這種形式5.4值棧與OGNL表達(dá)式(3)2.訪問(wèn)應(yīng)用上下文 OGNL通過(guò)“#”對(duì)應(yīng)用上下文進(jìn)行訪問(wèn)。3.訪問(wèn)集合元素5.4值棧與OGNL表達(dá)式(4)對(duì)Map的訪問(wèn):返回5.5Struts2的標(biāo)簽庫(kù)5.5.2數(shù)據(jù)標(biāo)簽5.5.3表單標(biāo)簽5.5.1控制標(biāo)簽返回5.5.4非表單UI標(biāo)簽5.5.1控制標(biāo)簽控制標(biāo)簽主要用于控制輸出流程以及訪問(wèn)值棧中的值。包括:if/elseif/else標(biāo)簽:用于完成分支控制。 <!--定義一個(gè)名稱(chēng)為score的屬性并賦值70--> <s:setname="score"value="70"></s:set> <s:iftest="#score>80">成績(jī)優(yōu)秀</s:if> <s:elseiftest="#score>60">成績(jī)及格</s:elseif> <s:else>成績(jī)不及格</s:else>iterator標(biāo)簽:用于迭代輸出集合中的元素,包括List、Set和數(shù)組。 <s:iteratorid="season"value="{'春天','夏天','秋天','冬天'}"> <s:propertyvalue="season"/> </s:iterator>返回5.5.2數(shù)據(jù)標(biāo)簽(1)數(shù)據(jù)標(biāo)簽:用于對(duì)數(shù)據(jù)進(jìn)行相關(guān)操作,例如將數(shù)據(jù)存入值棧或者從值棧中取出數(shù)據(jù)。包括:bean標(biāo)簽:用于創(chuàng)建一個(gè)JavaBean實(shí)例,在其標(biāo)簽體中可以用<s:param>標(biāo)簽對(duì)JavaBean實(shí)例的參數(shù)賦值。 <s:beanname="com.domain.Dog"id="dog"> <s:paramname="name"value="'大黃'"/> <s:paramname="age"value="5"/>

狗的名字:<s:propertyvalue="name"/>

狗的年齡:<s:propertyvalue="age"/> </s:bean> 在bean標(biāo)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論