第十二章開發(fā)struts.2spring應(yīng)用_第1頁
第十二章開發(fā)struts.2spring應(yīng)用_第2頁
第十二章開發(fā)struts.2spring應(yīng)用_第3頁
第十二章開發(fā)struts.2spring應(yīng)用_第4頁
第十二章開發(fā)struts.2spring應(yīng)用_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余72頁可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡介

第十二章開發(fā)Struts2+Spring應(yīng) 介 12.2Struts2開發(fā) 準(zhǔn)備工 開 使用消 表單驗(yàn) Struts2整合 實(shí)現(xiàn)文件上傳文件單個(gè)文件中文文 已存在的文 文件上 介紹和準(zhǔn)備工 單個(gè)文件上傳例 文件上傳參數(shù)配 上傳多個(gè)文 小 參考資 Struts2Spring的整合應(yīng)用開發(fā)。在筆者剛開始Struts2Spring的文檔進(jìn)行練習(xí)的時(shí)候,很遺憾的發(fā)現(xiàn)之花了2個(gè)小時(shí)才算把例子做出來,使我深深的感到對(duì)于初學(xué)者來說(對(duì)我來說,Struts2也是最近兩周才看的,所以也算是這方面的初學(xué)者了,看著文檔卻作不出例子來,那是并不算太深入的經(jīng)驗(yàn)和大家一下,希望能對(duì)您的學(xué)習(xí)有所幫助。Struts2+Spring+Hibernate/JPA其它框架=(Struts2+Spring)+(Spring+完成整合Hibernate或者其它框架的過程。在本章我將會(huì)依次給大家Struts2,展示如何Struts2的開發(fā)包,Struts2軟件包介紹,簡單的oWorld的開發(fā),以及POJO的oWorld開發(fā),接著第九章的登錄示例StrutsLoginDemo用Struts2改寫,并加入驗(yàn)證機(jī)制和消息,稍后以及如何session,request等JSP對(duì)象介在第章發(fā)us1x應(yīng)中們經(jīng)簡介了us2和us1之的系。o(bo是個(gè)史很久優(yōu)的b層開發(fā)框架根據(jù)一資料我了解到brk1和us1很接的設(shè)計(jì)路,比較緊耦,體在的制類必繼自些的類者口需單的值對(duì):Fman開發(fā)人需要直eesesse和esin這對(duì)象,面的向需要通過特的對(duì)象完成(nrr。然brk2之后,它大引入了件機(jī)員 eespn等對(duì)象頁的向過回rn類可,于測(cè)并了中單ncnJF道于二b框架級(jí)別上(很遺的是pngMC到現(xiàn)為止也是停留rus1模式上除了和prng緊密集成之外,無其它特色,這也是它為何至今未視為優(yōu)秀的eb開發(fā)框架的原因之一brk2C兆的一庫文件不知該如取舍層框架說,ok2的插件機(jī)可以你在類庫的上按需裝,根據(jù)目的需來自由增刪類庫文件(這是和in內(nèi)核差不多的做法。么第三b框架,前來說未出現(xiàn)據(jù)尚推的JF的20本會(huì)持無配文,標(biāo)注(oain,POJO的開發(fā)模式,是否這就是第三代Web開發(fā)框架?根據(jù)文檔,我發(fā)現(xiàn)Struts2也正在進(jìn)瑣,要想用框架,必先XML+自定義庫的確是個(gè)讓人一直頭疼不已的病了(讓人讓開發(fā)人員苦言。筆者從心底里希望Java的Web層框架能易用化,標(biāo)準(zhǔn)化(大家都用StrutsStruts2MVCWebWork2Struts2就持AJAX等的開發(fā)(目前是基于DOJO框架的實(shí)現(xiàn)多種表示層框架(不僅僅局限于JSP頁面展示W(wǎng)eb層框架。開發(fā)容易上手–從和模版程序或者M(jìn)aven原型可以很容易的開發(fā)出新項(xiàng)–增強(qiáng)的(Tag)-使用樣式表驅(qū)動(dòng)的表單 –(action最好的AJAX支持–通過使用和標(biāo)準(zhǔn)Struts 觀感一致的AJAX Spring–SpringAction中注入依賴關(guān)系,無需編寫額外的連接代碼或者其它配置。(同時(shí)支持Plexus?)增強(qiáng)的表示層展示–可以將處理結(jié)果以JasperReports,Action鏈,或者文件POJO–ActionForm!JavaBean來捕獲輸入Action類上??梢酝瑫r(shí)使用二進(jìn)制和字符串類型的POJOAction–Action–發(fā)布方便的插件機(jī)制–添加JAR文件即可添加框架擴(kuò)展。無需人工配置!的插件提供對(duì)JavaServerFaces,JasperReports,JFreeChart,Tiles. –Struts2內(nèi)部,找到死循環(huán)的位置–!Action–Struts2Action,無虛依賴任何模擬的HTTP對(duì)象。–跳過明顯的或者多余的設(shè)置。大多數(shù)框架的配置元素都有Action的請(qǐng)求處理。Struts2–易于調(diào)整的–修改FreeMarker模版即可自定義。不需要再學(xué)Struts2需要下列的條件:ServletAPI2.4,JSPAPI2.0,Java5(JDK1.4ActionXXX.action→Struts2過濾器使用對(duì)象工廠(ObjectFactory,可以是自帶或者是Spring)創(chuàng)建Action類的示例→執(zhí)行IOC和器(Action對(duì)象)Action中用戶編(Result)(包括調(diào)用標(biāo)關(guān)于其底層結(jié)構(gòu),從網(wǎng)上搜集到的一些資料認(rèn)為:WebWork2,實(shí)際上是Webwork+XWork的總集,Webwork1.x版本中,整個(gè)框架采用了緊耦合的設(shè)計(jì)(Struts1x),WebWork2.0之后,WebworkWebwork2.x+XWork2.x。當(dāng)ActionWebwork2.x框架會(huì)遍歷HttpServletRequest、HttpSession、ServletContext中的數(shù)據(jù),并將其到內(nèi)部的Map實(shí)現(xiàn)中,至此之后,所有數(shù)據(jù)操作均在此Map結(jié)構(gòu)中進(jìn)行,從而將內(nèi)部數(shù)據(jù)結(jié)構(gòu)與ServletAPI相分離。至此,WebworkXWork進(jìn)行下一步處理。從這里也可以看到Webwork和XWork之間的切分點(diǎn),Webwork為XWork提供ServletServletXWork所需要的通流程處理,而Struts2的層則提供將Servlet層提供的數(shù)據(jù)進(jìn)行獨(dú)立封裝的過程,進(jìn)而XWork基于這些數(shù)據(jù)進(jìn)行操作,這樣就實(shí)現(xiàn)了一個(gè)完整的開發(fā)框架。XWork相當(dāng)于一個(gè)插件一樣和現(xiàn)有框架組合,構(gòu)成一個(gè)完整的流程處理+Servlet框架。所以大家會(huì)奇怪的看到Struts2一共有兩個(gè)jar文件:struts2-core-2.0.11.jar和xwork-2.0.4.jar,而且更讓人奇怪的是前一個(gè)文件中的包定義是org.apache.struts2,而后一個(gè)文件中的則是ActionActionStruts2的Action類實(shí)現(xiàn)了一個(gè)Action接口,連同其他接口一起來實(shí)現(xiàn)可選擇和自定義的服務(wù)。Struts2提ActionSupport的基類來實(shí)現(xiàn)一般使用的接然,Action接口使用execute方法的POJO對(duì)象可以被當(dāng)作Struts2的Action對(duì)象來使用。給開發(fā)帶來了額外的煩惱。Action資源必須是線程安全或者同步的。 回收問題ServletStruts1.x的Action類依賴于ServletAPI,當(dāng)Action被調(diào)用時(shí),以HttpServletRequestHttpServletResponse作為參數(shù)傳給executeStruts2的Action和容器無關(guān)。Servlet上下文被表現(xiàn)為簡單的Maps,允許Action被獨(dú)立的測(cè)試。Struts2的Action可以訪問最初的請(qǐng)求(如果需要的話)。但是,盡可能避免或排除其他元素直接HttpServletRequest或HttpServletResponse。測(cè)試Struts1.x的主要問題是execute方法 了ServletAPI這使得測(cè)試要依賴于容器。第 如StrutsTestCase,提供了一套Struts1的模擬對(duì)象(來進(jìn) Struts1.x使用ActionFormAction一樣,所有的ActionForm必須擴(kuò)展基類。因?yàn)槠渌鸍avaBeanActionForm使用,開發(fā)者經(jīng)常創(chuàng)建多余的類來捕獲輸入。DynaBeans可以被用來作為替ActionForm的類來創(chuàng)建。但是,開發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存在JavaBean(仍然會(huì)Struts2直接使用Action屬性作為輸入屬性,消除了對(duì)第二個(gè)輸入對(duì)象的需求。輸入屬性可能是有自己(子)屬性rich對(duì)象類型。Action屬性能夠通web頁面上的taglibs。Struts2也支ActionForm模式。rich對(duì)象類型,包括業(yè)務(wù)對(duì)象,能夠用作輸入/輸出對(duì)象。這ModelDriven特性簡化了taglibPOJO輸入對(duì)象的。Struts2JSTL,但是也支持一個(gè)更強(qiáng)大和靈活的表達(dá)式語言--"ObjectGraphNotationLanguage"Struts2使用“ValueStack”技術(shù),使taglib能 Struts2使用OGNL進(jìn)行類型轉(zhuǎn)換。提供基本和常用對(duì)象的轉(zhuǎn)驗(yàn)校驗(yàn)和內(nèi)容校驗(yàn),來支持校驗(yàn)和內(nèi)容校驗(yàn),來支持chainAction 要和不同的ActionMyEclipse6Struts2的開發(fā)還沒有提供任何直接的支持,所以本章不得不手工加入相關(guān)的jar文件來開發(fā)不過您會(huì)發(fā)現(xiàn)相比較Struts1來說,其12.2Struts2開發(fā)的進(jìn)去后點(diǎn)擊Struts2要學(xué)習(xí)Struts的話,可以其 ,或者從然都是由參與者自愿的,所的進(jìn)去后點(diǎn)擊Struts212.1由于MyEclipse6自身不帶Struts2的類庫,因此須手工它。在瀏覽器中鍵入地址,Struts的頁面,如圖12.1所目前版本是2.0.11;下方的是Struts1,目前版本是1.3.8。先來簡要看看2的包有哪些12.1struts-2.0.11-all.zip5個(gè) 表12.1完整 完整包下面的是示例應(yīng)用(ExampleApplications),大小為22MB,文件名是struts-2.0.11-apps.zip。它包含了上面完整包的apps struts2-blank-2.0.11.war,struts2-mailreader-2.0.11.war,struts2-portlet-2.0.11.war,struts2-showcase-2.0.11.war。第一個(gè)是精簡的示例應(yīng)用,大小為3.26MB,包括 actionchaining,ajax,chat,filedownload,fileupload,jsf,modelDriven等再接下來是(BlankApplicationOnly),大小為3MB,文件名是的Struts2空應(yīng)用模版,在它的包的WEB-INF/lib下包含了下面幾個(gè)jar文件:commons-logging-1.0.4.jar,freemarker-2.3.8.jar,ognl-2.6.11.jar,struts2-core-2.0.11.jarxwork-2.0.4.jarSpring的庫文件以及WebWork的5jar文件的用途:ObjectGraphNavigationLanguage(OGNL),通過修改或重寫模板使struts2的ui標(biāo)記按用可自動(dòng)調(diào)用Log4J或者JDK1.4或者更高版本的。struts-2.0.11-lib.zip,其中的文件是和完整包中的lib下的所有文件相同的。它包含了Struts2的所有和插件類庫,讀者如果是要進(jìn)行完整應(yīng)用的開發(fā),建議把這個(gè)下的jarWebWEB-INF/lib下,這樣比較保險(xiǎn)。最后剩下的分別是文檔(ation對(duì)應(yīng)完整包的docs源代(對(duì)應(yīng)完整包的src 對(duì)應(yīng)完整包的j4 希望深入全面的學(xué)習(xí),還是個(gè)頭最大的完整包(FullDistribution)。本節(jié)進(jìn)行簡單的oWorld的開發(fā),以及基于POJO的oWorld開發(fā),自定準(zhǔn)備工作MyEclipseWebStruts2類庫和配置文件?,F(xiàn)在我們來創(chuàng)建一個(gè)名為struts2o的Web項(xiàng)目。選擇菜單File>New>WebProject,可以啟動(dòng)創(chuàng)建Web項(xiàng)目的向?qū)?,如圖8.3所示。在彈出的框的ProjectName中輸入struts2o,然后選中J2EESpecificationLevel下面的JavaEE5.0單選鈕,最后點(diǎn)擊Finish按鈕就可以創(chuàng)建好這個(gè)Web項(xiàng)目了。Struts212.1節(jié)的內(nèi)容下載或者從完整包找到文件struts2-blank-2.0.11.war,接著用WinZIP或者WinRAR等解壓縮軟件解開它到電腦的硬盤上,然后將解出來的WEB-INF/lib下的5個(gè)jar文件到當(dāng)前Web項(xiàng)目的WebRoot/WEB-INF/lib下,具體的做法希望大家還記得:首先切換到Windows的文件瀏覽器中5個(gè)解壓縮出來的jar文件,然后按下快捷鍵Ctrl+C將它們到剪貼板上,然后我們?cè)偾袚Q到MyEclipse的窗口,點(diǎn)擊鼠標(biāo)左鍵選中PackageExplorer視圖下的struts2o項(xiàng)目的節(jié)點(diǎn)WebRoot/WEB-INF/lib,之后按下快捷鍵Ctrl+VjarMyEclipse加入BuildPath中,會(huì)出現(xiàn)在項(xiàng)目的節(jié)點(diǎn)ReferencedLibraries之下。<web-appversion="2.5"xmlns="h" Struts1是在web.xml添加actionservlet的方式來工作的,但是<web-appversion="2.5"xmlns="h" > <<<接下來做什么呢?以前的Struts1的開發(fā),是要在WebRoot/WEB-INF/ 不同的是它需要建在項(xiàng)目的src 下,名為struts.xml,當(dāng)項(xiàng)目發(fā)布以后,這個(gè)文件將會(huì)被到WEB-INF/classes下。那么在src 上點(diǎn)擊右鍵,選擇菜單New>File,接著在彈出框中的Filename右側(cè)輸入框中輸入文件名struts.xml,點(diǎn)擊Finish按鈕關(guān)閉對(duì)struts.xml文件。然后我們把它的源代碼修改為如下所示:<?<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" 繼承,那么繼承的這個(gè)包定義在哪里呢?打開文件WEB-INF/lib/struts2-core-2.0.11.jar文件包里根目錄下有個(gè)struts-default.xml文件里面定義了一個(gè)包:<package 2struts-default.xml里面的包定struts.xml。在稍后我們編寫第一個(gè)oWorld示例的時(shí)候,還會(huì)繼續(xù)深入的討論package和action的定義方式。<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <packagename="default"extends<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <packagename="default"extends="struts-default"namespace="/a"package定義了。這也是Struts2的一個(gè)特點(diǎn),配置文件可大可小分割。注意讀者對(duì)此先做了解即可在我們的例子中不做這方面的展示了讀者在閱 開發(fā)了。OK,現(xiàn)在我們就來開發(fā)一個(gè)最簡單的oWorld例子。擊上的按鈕,在打開的新建類的框中,輸入Package為example,Name為oWorld,點(diǎn)擊Finish按鈕后即可將此類創(chuàng)建?,F(xiàn)在其代碼修改為如下所示:packagepackageimportpublic oWorldextendsActionSupportpublicStringexecute()throwssetMessage("你好!Strutsreturn}privateprivateStringpublicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}}publicStringexecute()throwsException中,這里我們所做的操作極其簡單,就是設(shè)置Action類自身的屬性message的值為字符串Struts2。這個(gè)方法的其返回值為常量SUCCESS,其實(shí)取值就是字符串的”success”success應(yīng)該跑到哪里去呢?所以接下來我們還需要在配置文件指<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftware<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <result ??梢钥吹絘ction的名字(name)為oWorld,它的類(class)是example.oWorld,<%@pagecontentType="text/html;charset=GBK"<%@taglibprefix="s"uri="/struts-tags"<title>Struts2示例好了,接下來我們要?jiǎng)?chuàng)建這個(gè)顯示層的JSP文件,選擇菜單File>New>JSP(Advanced<%@pagecontentType="text/html;charset=GBK"<%@taglibprefix="s"uri="/struts-tags"<title>Struts2示例<h2><s:propertyStruts2的庫和EL表達(dá)式來獲取Actionmessage<?xmlversion="1.0"encoding="UTF-<!DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN" 這一句<%@<?xmlversion="1.0"encoding="UTF-<!DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN" 大家可以注意到粗斜體的<uri>/struts-tags</uri>剛好與JSP文件引入taglib里面的uri屬性匹配,這樣就找到了對(duì)應(yīng)的定義位置了。Tomcat等Web服務(wù)器會(huì)自動(dòng)加載所有jar文件下的META-INF子下的.tld標(biāo)記定義文件,這也是為什么好多框架不需要把tld文件到WEB-INF下的原因。 截圖給大家,如圖12.2所示。圖12.2struts2o項(xiàng) 鍵入如下的地址來進(jìn)試:。如果12.3Struts2程序現(xiàn)在,我們來簡要回顧一下執(zhí)行流程:首先用戶地址oWorld.action,然后Struts的struts.xmlname為oWorldaction定義,順藤摸瓜找到了對(duì)應(yīng)的example.oWorldActionexecute()message屬result定義,而它的真正地址是/oWorld.jsp,所以接著就跳轉(zhuǎn)到JSP頁面進(jìn)行顯示,同ActionmessageJSP頁面所了,這也是Struts1很不一樣的地方。再以前,須自己request對(duì)象,設(shè)置屬性,之后才能被前臺(tái)的JSP頁面到。這個(gè)過程的簡寫就是:oWorld.action→example.oWorldAction.java→execute()→success→/oWorld.jsp→獲取message屬性→顯示。packagepublicinterfaceActionpublicstaticfinaljava.lang.StringSUCCESS="success";publicstaticfinaljava.lang.StringNONE=packagepublicinterfaceActionpublicstaticfinaljava.lang.StringSUCCESS="success";publicstaticfinaljava.lang.StringNONE="none";publicstaticfinaljava.lang.StringERROR="error";publicstaticfinaljava.lang.StringINPUT="input";publicstaticfinaljava.lang.StringLOGIN=}LOGINexecute()Action的XWorkActionexecute()方法以完成業(yè)務(wù)邏輯處理。這樣對(duì)于我們的Action類來說,最簡單的方式就是只實(shí)現(xiàn)publicjava.lang.Stringexecute()這個(gè)別名定義在配置文件的result標(biāo)記中。因此剛才的 oWorld類還有一種寫法,就是直接實(shí)現(xiàn)此接口。我們把它放在項(xiàng)目的Java類example. oWorld2中了,其代碼packagepackageimportpublicoWorld2implementsActionpublicStringexecute()throwssetMessage("你好!Strutsreturn}privateStringpublicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}}接著,我們?cè)賮砜纯磗truts.xml。首先注意到的是Action的地址,它的地址由兩個(gè)部分來決定,一個(gè)packagenamespace定義,一個(gè)actionname。在此呢,我們先來介紹一下package的完整屬性列表:屬必說是否否參考下文名空間介否表 Struts2中的新概念――包:包是一種用來對(duì)action,result,resulttype,器,以及器棧進(jìn)行組織,使它們成為一個(gè)Java中的對(duì)象很相似,因?yàn)樗鼈兙杀粩U(kuò)package元素只需要一個(gè)必須的屬性:name。extends屬性是可選的,它可以讓當(dāng)前包繼承一個(gè)或者多個(gè)以前包-包括所有的器,器棧,以及action配置。注意配置文件是按照順序加載的,所以被"extends"的包必須定義在當(dāng)前包之前。還有個(gè)可選的Javaactioin配置。它的出現(xiàn)可以讓我們避免多個(gè)名字相同的action定義出現(xiàn)。它的默認(rèn)值是””,也就是空字符串。另外它還可以取值為根,也就是”/”RootNamespace,它對(duì)應(yīng)著Web應(yīng)用根的情況,對(duì)我們的例子來說就是在瀏覽器中/struts2o。其它的然這樣并不是特別的確切,那么假設(shè)我們當(dāng)前例子的配置文件的package定義為:<packagename="defaultextends="struts-defaultnamespace="/test">,重新發(fā)布項(xiàng)目后,我們Action的路徑將會(huì)是:根據(jù)Strus2的文檔,這個(gè)命名空間并不和 檔(在完整包中docs目錄下可以找到,也可以其文檔庫)的namespace-configuration.html一篇的詳細(xì)介紹,當(dāng)然對(duì)于一般的應(yīng)用來說,可以不用關(guān)心<actionname="a. oWorld"class="example.oWorld">。這時(shí)候Action的訪問路徑將會(huì)變成:。如果您將上一段所提到的namespace="/test"的配置也加進(jìn)來的話,它的路徑就會(huì)變成?!皀ame="struts.enable.SlashesInActionNames"value="true"/>,把這句話加在struts的“,如:a-oWorld,然而一般來說是不推薦這樣做的,因?yàn)檫@會(huì)導(dǎo)致某些Struts2所提供的JavaScript和(theme)無法使用,主要是AJAX支持會(huì)出問題。推薦的做法是用駝峰命名法,例如上面的可以命名為aoWorld或者加下劃線a_oWorld??赐炅薃ction的定義之后,我們來簡單的看看result元素。它有兩個(gè)作用:首先,它Action可以返回類似于"success"或者"error"這樣的別名,而result元素都提供了一種結(jié)果類型(ResultType。JSP頁面或者模版,然而很多其它的結(jié)果類型也都是常用的類型:DispatcherResult,它用來整合網(wǎng)絡(luò)資源例如JSP。由于Struts2框架大量使result元素的講解將會(huì)看起來很費(fèi)解。首先呢,Struts2已經(jīng)在其 但是它會(huì)默認(rèn)在各個(gè)類型中使用dispatcher。所以,它的完整方式為:<param oWorld.jsp: 。<result。另外,還有一種結(jié)果類型用的比較多,那就是重定向,它的寫法是:type="redirect-action"></result>Struts1GlobalFowards,Struts2。最后,我們來到表示層的JSP頁面oWorld.jsp,可以看到Action類的屬性已經(jīng)放入了request對(duì)象中,這樣我們即可以通過Struts的property來,也可以通過EL我們以前的項(xiàng)目全是用Struts1的庫做的,現(xiàn)在想把它改用Struts2來實(shí)現(xiàn),你可以想想有多大的工作量啊,所有用到Struts1的都得費(fèi)勁腦汁找到Struts2下的對(duì)應(yīng)物。但是呢,如果當(dāng)時(shí)就采用了EL和JSTL,現(xiàn)在你就只需要改一部分就可以了。這就是一就是Action類的屬性可以配合EL表達(dá)式來開發(fā),無須我們自己再親自編寫類似于Servlet類庫開來。使用消來說比較麻煩。而在Struts2中,消息支持要簡單的多。我們?nèi)砸陨衔牡捻?xiàng)目struts2o為基礎(chǔ),加入支持功能。首先我們修改JSP文件,使其能顯示的消息,修改后的oWorld.jsp源代碼<%@<%@pagecontentType="text/html;charset=GBK"<%@taglibprefix="s"uri="/struts-tags" <h2><s:property。代碼中粗斜體的部分就是一個(gè)的標(biāo)題,text用來顯示消息,而oWorld.message=Struts2isupandrunning現(xiàn)在我們需要在srcexample包下新建一個(gè)屬性文件,名為perties。PackageoWorld.message=Struts2isupandrunningTomcatIE題顯示:Struts2isupandrunning...。這說明Struts2會(huì)自動(dòng)這個(gè)文件中的內(nèi)容并把oWorld.message=StrutsoWorld.message=Struts2可是怎么從漢字得到這段轉(zhuǎn)義字符呢?答案是使用JDK的bin 具叫native2ascii.exe。現(xiàn)在大家可以選擇Windows的菜單開始>運(yùn)行,在彈出的框中輸入cmd,之后點(diǎn)擊確定按鈕,啟動(dòng)命令行。如果您已經(jīng)設(shè)置好了系統(tǒng)的PATH變量,可以鍵入native2ascii,否則呢,就鍵入c:\jdk1.6.0\bin\native2ascii,之后按下回車,就可sandStruts2Struts2用鼠標(biāo)拖住不放選中字符Struts2\u542f\u52a8\u5e76\u8fd0\u884c,使之顏色反白,然后呢,按下鍵盤上的回車鍵(即Enter鍵就能把它到Windows的剪貼板上了,之后再回MyEclipse的編輯器窗口,按下快捷鍵Ctrl+V粘貼就可以了。之后再次重新發(fā)布并運(yùn)sandStruts2Struts2packageimportpublicoWorldextendsActionSupportpublicStringexecute()throws{setMessage("你好!Struts2!"); returnSUCCESS;}privateStringpublicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.packageimportpublicoWorldextendsActionSupportpublicStringexecute()throws{setMessage("你好!Struts2!"); returnSUCCESS;}privateStringpublicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}}Struts2MyEclipseStruts2ResouceBundleEclipse插件,或者使用一些單獨(dú)的圖形界面的工具。請(qǐng)瀏覽本 .properties中新加入一行帶有參數(shù)的消擴(kuò)起來的數(shù)字作為占位符,接著在JSP頁面加入下面的代碼:<s:text 數(shù)1)等方法來調(diào)用,例如這里可以使用方法:getText(" 是很多參數(shù)呢,可以使用另一個(gè)方法:getText(Stringkey,List參數(shù)列表)。關(guān)于和ResouceBundle的內(nèi)容,請(qǐng)參考本章結(jié)束的參考資料一節(jié)?;赑OJOAction開如12.3.1一節(jié)后半部分所述,Action類可以選擇繼承自ActionSupport類或者實(shí)現(xiàn)Action接口。然而,Struts2還支POJO形式的也就是JavaAction,開發(fā)人員只要在編寫的類中提供編寫publicjava.lang.Stringexecutethrowsjava.lang.Exception這JSF是非常像的。這樣大大Action類更加的易于測(cè)試和獨(dú)立于框架本身,便于以后的重用packagepublic oPOJOpublicStringexecute()throwssetMessage("你好!Struts2return}privateStringpublicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}}新建Java類文件example.packagepublic oPOJOpublicStringexecute()throwssetMessage("你好!Struts2return}privateStringpublicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}}message的值為字符串你好!Struts2POJO的操作,之后就返回一個(gè)字符<?<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <packagename="default"extends="struts-default"<packagename="default"extends="struts-default"<%@pagecontentType="text/html;charset=GBK"<%@pagecontentType="text/html;charset=GBK"。這個(gè)頁面就是從請(qǐng)求的屬性中使用EL表達(dá)式將message屬性的值出來,而它同樣還是由框架從Action類中然后放入request對(duì)象的。在這里為了展示POJO+EL表達(dá)式開發(fā),我們沒有使用任何Struts2特定的類或者標(biāo)記庫。最后,將項(xiàng)目重新發(fā)布后運(yùn)行,打開網(wǎng)絡(luò)瀏覽器,鍵入如下的地址來進(jìn)試你好!Struts你好!Struts2注意:需要提示一下大家的是,如果這時(shí)候你企圖在JSP頁面中使用text來顯示國 ,而我們的Action類中也自然無法消息文件了,這自定義Action方法和映射通配符自定義Action方法雖然Action類定義了一個(gè)接口,里面有一個(gè)方法execute(),然而這卻并不是必須的。開發(fā)人員完全可以自己定義方法的名字,還可以輕易的將多個(gè)業(yè)務(wù)方法合并到一個(gè)12.3.1一packageimportpublicclassActionMethodextendsActionSupportpublicStringsave()throws{setMessage(packageimportpublicclassActionMethodextendsActionSupportpublicStringsave()throws{setMessage("保存數(shù)據(jù)!"); returnSUCCESS;}publicStringdelete()throws{return}privateStringpublicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}}delete()message值,但是SUCCESS這個(gè)路徑,只要返回值是個(gè)字符串類型就可以了。大家可以注意到這里并沒有定義execute()方法,雖然類本身是繼承自了ActionSupport的。<?xmlversion="1.0"encoding=<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <packagename="default"extends="struts-default" 刪除數(shù)刪除數(shù)據(jù)!。這充分證明了的確是分別調(diào)用了Action類中的save()和delete()兩個(gè)方法,從而在頁面中Action類中,例如:將用戶管理的功能都寫入到UserActionlogin,logout,add,delete等各個(gè)模塊方法,而配置的時(shí)候之需要根據(jù)method參數(shù)即可配置出對(duì)應(yīng)的5個(gè)地址,分別對(duì)應(yīng)這些方法的調(diào)用。然而,假5個(gè)操作的結(jié)果頁面都對(duì)success.jsp,但這樣一來5個(gè)幾乎重復(fù)方式和動(dòng)態(tài)的method參數(shù)來支持只使用一個(gè)action定義便可搞定這樣的情況。映射通配符action映射共享相似的模式。例如,所有的除)操作則可能也使用了相同的模式,對(duì)應(yīng)調(diào)用的方法是delete。 個(gè)實(shí)例上的save方法。同樣的,或者"deleteUser"將會(huì)調(diào)用delete方法。換句話說,后面的method=”{1}”這個(gè)定義的值{1}等于用戶輸入的*,即:{1}=*。在這種情況下,使用后綴的通配符,只需要把*號(hào)移至末尾并添加一個(gè)。件,甚至Action的名字。例如,我們的表單驗(yàn)證文件現(xiàn)在可以寫兩個(gè):。 <?<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <packagename="default"extends="struts-default"<action oWorld" <result <actionoPOJO"<actionname="SaveTest"class="example.ActionMethod" 列出<<actionname="DeleteTest"class="example.ActionMethod" <actionname=<actionname="saveTest"class="example.ActionMethod"<actionname="deleteTest"class="example.ActionMethod" 現(xiàn)在重新發(fā)布并運(yùn)行此項(xiàng)目后,通過以下兩個(gè)地址可以到這個(gè)通配符的action:,,。struts.xmlactionAction類中到底有actionname設(shè)置默認(rèn)通配符的出錯(cuò)信息,假設(shè)地址是,那么現(xiàn)在您將會(huì)看HTTPStatus404-HTTPStatus404-ThereisnoActionmappedfornamespace/andactionnametypeStatusmessageThereisnoActionmappedfornamespace/andactionnamedescriptionTherequestedresource(ThereisnoActionmappedfornamespace/andactionnameabc.)isnotavailable.OK,現(xiàn)在讓我們先在WebRoot下創(chuàng)建一個(gè)靜態(tài)HTML頁面,文件名為<metahttp-equiv="content-type"content="text/html; <?xmlversion="1.0"encoding=<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <packagename="default"extends="struts-default"地址,例如,那么它將會(huì)看到我們事先寫好的出圖 表單處理――登錄例子Action類的基本用法。然而,大多數(shù)情況下,大家更關(guān)心的恐怕就是如何表單參數(shù)了。幸運(yùn)的是現(xiàn)在表單參數(shù)再也不用編寫FormBean或者調(diào)Struts2中的表單處理。為了方便起見,這個(gè)練習(xí)仍然加到在上面介紹的struts2o項(xiàng)目中。<%@pagecontentType="text/html;charset=UTF-8"<%@taglibprefix="s"uri="/struts-tags"<s:form<%@pagecontentType="text/html;charset=UTF-8"<%@taglibprefix="s"uri="/struts-tags"<s:form "<s:submitvalue="登錄<%@pagecontentType="text/html;charset=UTF-8"<%@pagecontentType="text/html;charset=UTF-8"。這個(gè)頁面只是取出用戶名(ee)和消息(se)兩個(gè)屬性顯示在頁面中。cn自cnt表單所對(duì)應(yīng)的兩個(gè)屬性:usernamepassword。另外還帶有一個(gè)向結(jié)果頁面返回值的屬檢查用戶輸入的用戶名和是否為空(相當(dāng)于我們自己作數(shù)據(jù)有效性驗(yàn)證如果無效就success.jsp12.5packageimportpublicclassLoginextendsActionSupportprivateStringmessage,username,publicStringexecute()throwsExceptionif(isInvalid(getUsername()))returnif(isInvalid(getPassword()))returnJavapackageimportpublicclassLoginextendsActionSupportprivateStringmessage,username,publicStringexecute()throwsExceptionif(isInvalid(getUsername()))returnif(isInvalid(getPassword()))returnSystem.System.out.println("用戶名:"+getUsername()+ "+getPassword());return}privatebooleanisInvalid(Stringvalue)return(value==null||value.length()==}//getter,publicStringgetMessage()return}publicvoidsetMessage(Stringmessage)this.message=}publicStringgetUsername()return}publicvoidsetUsername(Stringusername)this.username=}publicStringgetPassword()return}publicvoidsetPassword(Stringpassword)this.password=}}。<?<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <packagename="default"extends="struts-default"<result<action現(xiàn)在讓我們重新發(fā)布然后運(yùn)行應(yīng)用struts2o,接著在瀏覽器中鍵入地址登錄頁面 12.6我們按照?qǐng)D中,輸入用戶名張三,1234,然后點(diǎn)擊登錄按鈕后,即可看到圖12.6右Console視圖中的服務(wù)器日志輸出了如下消息:用戶名:張三,1234。如果用戶名或者之一或者全部為空,點(diǎn)擊登錄按鈕后依 "" ""(hemeCSS樣式表對(duì)最終的代碼做進(jìn)一步的控制,可以認(rèn)為Struts2生成的代碼的質(zhì)量還是非常的高的。另外,Struts的表單還支際化,當(dāng)然這在一般項(xiàng)目中也許用不到,所以大家了解一下即可。在12.3.3使用消息一節(jié)中,我們已經(jīng)討論了如何向配置文件加入鍵和計(jì)算機(jī)的才給它來了個(gè)這樣的縮寫,i和n之間有18個(gè)字母的意思。i18n只有一個(gè)必需的屬性name,它指向類路徑中資源文件的路徑,例如我們的例子中的資源文件是<s:i18nname="example/package"><s:i18nname="example.package">。而對(duì)應(yīng)的<s:textfieldname="username"label="用戶名"需要給這個(gè)資源配置文件example/perties加入一行相應(yīng)的消息:username=User。如果是中文的資源文件exam username=<s:form<s:textfieldkey="username"<s:form<s:textfieldkey="username"<s:passwordname="password" "<s:submitvalue="登錄源文件中的,需要注意的是用了key就不要用lable和value來指定了。將項(xiàng)目重UserName的提示,中文系統(tǒng)則顯示用戶名,別的功能都不變,這樣就實(shí)現(xiàn)了的功能了。那就是開發(fā)人員必須熟練掌握這些自定義的,而且更的是如果使用DreamWeaver、Frontpage等可視化的頁面設(shè)計(jì)器,會(huì)無法看到頁面的顯示效果。對(duì)此,<form用戶名:<inputname="username<inputtype="passwordname="password<inputtype="submitvalue="登錄在瀏覽器中鍵入地址:,輸入用戶名和后,執(zhí)行結(jié)果是一模一樣的。這種模式有何缺點(diǎn)呢?簡單的說就是無法利用Struts2提供的內(nèi)置表單驗(yàn)證JavaScript驗(yàn)證代碼,另一種則是使用Struts2自帶的驗(yàn)證框架(包括服務(wù)器端和客戶端驗(yàn)證的雙重支持。<%@pagecontentType="text/html;charset=UTF-8"<%@taglibprefix="s"uri="/struts-tags"<script//驗(yàn)證輸入不為空 代function節(jié)所述是沒用表單而是用純HTML來寫的,那就更簡單了。form這個(gè)有個(gè)屬性叫onsubmitJavaScriptJS代碼<%@pagecontentType="text/html;charset=UTF-8"<%@taglibprefix="s"uri="/struts-tags"<script//驗(yàn)證輸入不為空 代functionalert(alert("用戶名不能為空!");returnfalse;}returnfalse;}return}<s:i18n<s:textfieldkey="username"<s:passwordname="password" "<s:submitvalue="登錄。然后運(yùn)行此項(xiàng)目后,我們就可以發(fā)現(xiàn)一旦用戶輸入為空,就彈出框并提示,同時(shí)終止表單的繼續(xù)提交。讀者也可配合一些其它成JavaScript表單驗(yàn)證框架來工作。Struts2的服務(wù)器端的表單驗(yàn)證。和Struts1相比,這里的驗(yàn)證工作相當(dāng)?shù)暮唵?。首先,是表單提交的action所對(duì)應(yīng)的類必須繼承自ActionSupport類,只有這樣才能使用Struts2自帶的驗(yàn)證機(jī)制。其次,必須使用Struts2里面的form來定義表單。再次,action定義中必須inputresult來指定表單的來源頁面,便于出錯(cuò)后返回表單輸入頁面顯示相關(guān)的信息,例如<resultname="input">/login.jsp</result>。最后是Action類相同的包下。配置文件有兩(name在12.3.5自定義Action方法和映射通配符一節(jié)我們介紹了通配符的action定義,actionaction,所以每一個(gè)被匹配的action都要定義單獨(dú)的驗(yàn)證文件,例如本章中介紹到的這個(gè)action定義在我們的項(xiàng)目中假設(shè)要做表單驗(yàn)證的話,一共需要兩個(gè)配置文件:型的通配符則視其所能對(duì)應(yīng)的單個(gè)action數(shù)目來配置對(duì)應(yīng)的驗(yàn)證文件。<!DOCTYPEvalidators"-//OpenSymphonyGroup//XWorkValidator<!DOCTYPEvalidators"-//OpenSymphonyGroup//XWorkValidator <field<field-validator<field<field-validator <!DOCTYPEvalidators"-//OpenSymphonyGroup//XWorkValidatorConfig"<!--STARTSNIPPET:validators-default--<validatorname="required"<validatorname="requiredstring"。我們來分析一下此配置文件的格式。首先我們是根據(jù)表單域來一一進(jìn)行驗(yàn)證的,即<!DOCTYPEvalidators"-//OpenSymphonyGroup//XWorkValidatorConfig"<!--STARTSNIPPET:validators-default--<validatorname="required"<validatorname="requiredstring"<validatorname="int"<validatorname="double"<validatorname="date"<validatorname="expression"<validatorname="fieldexpression"<validatorname=" <validatorname="url"<validatorname="visitor"<validatorname="conversion"<validatorname="stringlength"<validatorname="regex"<!--ENDSNIPPET:validators-default--。由此可見org>所 的驗(yàn)證器類型為eidsrg這個(gè)驗(yàn)器所對(duì)的驗(yàn)證現(xiàn)類是cmpspnxr2aaolaosidFdaaor。下來的esae則規(guī)定如果出時(shí)將會(huì)客戶端一段出錯(cuò)息,例ese>對(duì)不起,用戶名不能為空!<msg>能用戶沒在單域里輸內(nèi)容的候,臺(tái)JP頁面的表框前面示一行錯(cuò)信息,簡單,表單驗(yàn)只需要們編寫個(gè)配置件scapeognaton即可,常單。好了現(xiàn)在重發(fā)布項(xiàng)并在瀏覽器輸入址 ,保持入框?yàn)?,然后下登錄按鈕,此時(shí)我們可以看到圖12.7所示的出錯(cuò)提12.7<%@pagecontentType="text/html;charset=UTF-8"<%@taglibprefix="s"uri="/struts-tags"<%@pagecontentType="text/html;charset=UTF-8"<%@taglibprefix="s"uri="/struts-tags"12.8所示?,F(xiàn)在這個(gè)驗(yàn)證可以認(rèn)為已經(jīng)足夠好了,如果再加上本節(jié)開頭所介紹的客戶端法:用CSS來控制頁面元素通用部分的顯示效果。12.8另外,閱讀文檔WebWork2開發(fā)指南時(shí)提到WebWork也支持可配置的客戶端<!DOCTYPEvalidators"-//OpenSymphonyGroup//XWorkValidator <field<field-validator<field<field-validator<!DOCTYPEvalidators"-//OpenSymphonyGroup//XWorkValidator <field<field-validator<field<field-validator <param<param長度不能小于${minLength}位,過${maxLength}位4圖12.9長度驗(yàn)證效息需要添加到文件perties中(中文消息則需要放置到文.properties中,參考12.3.3使用消息一節(jié)內(nèi)容。現(xiàn)在,我們要做的是向perties添加一行新的資源鍵值對(duì):requiredusername=Usernamecan'tbe <field<field-validator。<field<field-validator<<field<field-validator<message分別顯示對(duì)應(yīng)語言下的出錯(cuò)提示信息,這樣就實(shí)現(xiàn)了表單驗(yàn)證提示信息的。requiredstring=${getText(fieldName)}isoWorld.message=Struts2isupandrunning...requiredstring=${getText(fieldName)}isrequired.password=Passwordusername=Userrequiredusername=Usernamecan'tbe,之后設(shè)置<messagekey="requiredstring"/>即可。這是怎么回事呢?其實(shí)${}里面的內(nèi)容是一段Java代碼,它將進(jìn)而調(diào)用ActionSupport類中的getText()方法,方法的參數(shù)就是被驗(yàn)證field的名oWorld.message=Struts2isupandrunning...requiredstring=${getText(fieldName)}isrequired.password=Passwordusername=Userrequiredusername=Usernamecan'tbe<!DOCTYPEvalidators"-//OpenSymphonyGroup//XWorkValidator<!DOCTYPEvalidators"-//OpenSymphonyGroup//XWorkValidator <field<field-validator<message<field<field-validator<message給Action注入?yún)?shù)(param)這也是一個(gè)比較重要的問題,我們知道Action類里面可以帶有屬性,這些屬性可以通過表單參數(shù)來進(jìn)行設(shè)置(POSTURL中加參數(shù)在XML文件中設(shè)置初始值,所不同的是只能注入一些有限類型的簡單數(shù)據(jù),例如基本packagepublic oPOJOpublicStringexecute()throwsException setMessage("你好!Struts2return}}就packagepublic oPOJOpublicStringexecute()throwsException setMessage("你好!Struts2return}}<actionoPOJO"<paramname="message"<actionoPOJO"<paramname="message">你好!Struts2POJO!注入值 。param的name屬性將會(huì)對(duì)應(yīng)著action類中的屬性名,的正文則是需要注入的值,這句話等價(jià)于剛剛從oPOJO類中刪除的那段Java代碼。最后,重新發(fā)布項(xiàng)目并運(yùn)行,在地址欄中鍵入地址:,將會(huì)頁面中的

。這樣,param就相當(dāng)于實(shí)現(xiàn)設(shè)置了某個(gè)參數(shù),這在我們后面所介紹的文件中可配置屬性和perties文件所產(chǎn)生的效果是一樣的,開發(fā)人員可以根據(jù)個(gè)人的可以。<constantname="屬性名"value="取值"<constantname="屬性名2"value="取值2" XMLXML文件中,而且如果有中文信息的話(例如取值是漢字),不需要轉(zhuǎn)碼。例如12.4srcperties(FileNewFile來創(chuàng)建),它發(fā)布以后,應(yīng)該放在WEB-INF/classes/perties這個(gè)位置,和struts.xml位于同一下。這個(gè)文件的配置格式如下所示:#注釋信息屬性名=2=過程可以參考本書3.2.24修改文件的字符編碼一節(jié)的內(nèi)容。那么上面的struts.objectFactory例子對(duì)應(yīng)的設(shè)置方法就是在perties文件中寫入下面的值:。么是采用配置文件,要么是寫入XML文件。Spring的依賴注入進(jìn)行開發(fā),簡Spring來創(chuàng)Action對(duì)象,并注入配置文件中任意整合其它框架例如Hibernate,JPA等等。進(jìn)行開發(fā),配置文件也十分的簡練,而且也拋棄了FormBean這樣的專門表單參數(shù)的Action類綁在一起,就等于把業(yè)務(wù)層和控制層混為一談,有違分層設(shè)計(jì)的原則,看看Spring繼承自某個(gè)類,親自表單參數(shù),大量編寫和出口配置,配置視圖層,等等。雖然Spring把自己的Web層對(duì)象類名定位ModelAndView,但是這并不能程序員依然懶惰的偏向一些成或者是開發(fā)更為簡練的框架例如:JSF,WebWork,Tapestry等等。其一個(gè)最簡單的例子:點(diǎn)擊按鈕,彈出框顯示o,那么這個(gè)功能由兩個(gè)部分:第一個(gè)作。這段代碼在HTML中這樣寫的::onclick; 在新的Web框架都在這方面下功夫改進(jìn),Struts2甚至正在研究不需要任何配置文件的開發(fā)模式;Spring2.5也在支持完全基于標(biāo)注的開發(fā)模式,盡量不再依賴XML配置文件。Struts2Spring協(xié)同工作,順利的注入Hibernated的DAO之類的對(duì)象。我們現(xiàn)在就來一步步的開發(fā)一個(gè)2整合Spring的項(xiàng)目雖然簡單,但是足夠說明其中的問題并給日后讀者自行加入Hibernate框架做好充分的準(zhǔn)備。在本章開頭已經(jīng)提及,只要Struts2+Spring成功,那么Spring+Hibernate照搬以前的開發(fā)過程即可。OKstruts2springWeb項(xiàng)目,它的最終目的就是進(jìn)一步注入任意類型的其它屬性了FileNewWebProject,可以啟動(dòng)創(chuàng)建J2EESpecificationLevelJavaEE5.0Finish按鈕就可以創(chuàng)建好這個(gè)Web項(xiàng)目了。確切的講只需要比struts2o項(xiàng)目中的類庫多出那么一個(gè)整合Spring的文件,名字是struts2-spring-plugin-2.0.11.jar。為了保險(xiǎn),讀者可以參考12.2Struts2開發(fā)包一節(jié)的內(nèi)容,把完整包里面的lib 下的所有jar文件,或者是基礎(chǔ)依賴類庫(EssentialDependenciesOnly),文件名為struts-2.0.11-lib.zip這個(gè)文件中的lib 都到當(dāng)前項(xiàng)目的WebRoot/WEB-INF/lib 下,可以參考12.3.1準(zhǔn)備工作一節(jié)的介再接下來需要加入的是Spring的類庫,如果讀者自己知道如何Spring類庫的話,commons-logging-1.0.4.jar,freemarker-2.3.8.jar,ognl-2.6.11.jar,spring.jar,struts2-core-2.0.11.jar,struts2-spring-plugin-2.0.11.jar,xwork-2.0.4.jar。當(dāng)然,保險(xiǎn)的做法還是使用MyEclipse的添加Spring開發(fā)功能向?qū)硗瓿桑敿?xì)的操作過程可以參考創(chuàng)建項(xiàng)目,添加必要的開發(fā)功能一節(jié)內(nèi)容。選擇菜單MyEclipse>ProjectCapabilitiesAddSpringCapabilities...AddSpringCapabilities向?qū)?。在這Selectthelibrariestoaddtothebuildpath(選擇添加到類路徑的類庫)一欄的Spring2.0CoreLibrariesSpring2.0WebLibraries;如果您要日后整合HibernateSpring2.0PersistenceCoreLibrariesJARLibraryInstallation(JAR類庫安裝)CopycheckedLibrarycontentstoprojectfolder(TLDsalwayscopied),這個(gè)選項(xiàng)將選中的類庫的JAR文件到項(xiàng)目,在此單選鈕下方的LibraryFolder會(huì)自動(dòng)選中/WebRoot/WEB-INF/libNextSpring配置文Finish按鈕結(jié)束整個(gè)向?qū)?。稍等片刻后,所需的ReferencedLibrariesjar文件都已經(jīng)添加完畢了。為了便于讀者比對(duì),我已經(jīng)將這一階段項(xiàng)目的完整結(jié)構(gòu)截圖,請(qǐng)參考圖12.10。 好了,現(xiàn)在我們先來寫一個(gè)Action類和JSP頁面,分別作為的控制器和前臺(tái)的表現(xiàn)Action類就是一個(gè)普J(rèn)avaBean,帶messageString類型的屬性。選擇菜單File>New>Class,或者點(diǎn)擊上的按鈕,在打開的新建類的packagepublic oPOJOpublicStringexecute()throws{return}privatepackagepublic oPOJOpublicStringexecute()throws{return}privateStringpublicStringgetMessage()return}}}publicvoidsetMessage(Stringmessage)this.message=}<web-appversion="2.5"" <!--用來定位SpringXML文件的上下文配置<web-appversion="2.5"" <!--用來定位SpringXML文件的上下文配置Struts2> <<<接下來的第一個(gè)需要修改的地方就是WebRoot/WEB-INF/web.xml文件的內(nèi)容,除了Struts2SpringWeb容器,并指定哪些配web.xml的代碼,新加入部分已經(jīng)以粗斜體格式突出顯示:別的配置文件位置,當(dāng)然也可以加入的路徑,以逗號(hào)隔開即可。這些位置分別是W-NF/ 為ctttml以plaCnxt個(gè)ML在W-NF/ases下的同樣名稱的配置文件。由于Mycie自動(dòng)生成的配置文件的名字是piaCnxml,所以我們用這樣的配置可以很順利的加載到這個(gè)配置文件。配置動(dòng)png的n從nexnoatn這第二個(gè)地方就是需要修改Struts配置文件中的內(nèi)容。首先,須設(shè)置 。這樣一來,每當(dāng)用戶請(qǐng)求后需要?jiǎng)?chuàng)建某個(gè)Action類的時(shí)候,它將會(huì)首先嘗試從Spring中來獲取,確切的說是必須配置在Spring的Bean配置文件中;如果找到了,那很好,SpringXMLStruts2負(fù)責(zé)Springbean定義和Struts配置文件中的Action定義的匹配方式,它的屬性名是就自動(dòng)裝配。這是缺省第三個(gè)地方,是什么呢?自然是我們還要對(duì)原來的Action定義進(jìn)行修改了,如果你想用Spring來創(chuàng)建這個(gè)Action,那么需要修改action中的class屬性為Spring中所定beanSpringActionclass屬性為原<?xmlversion=<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEstruts"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" <actionoPOJO"來配置,并設(shè)置必要的屬性值(注入。上一段我們已經(jīng)提及oPOJO這個(gè)不存在的類,其實(shí)把只需要對(duì)應(yīng)某個(gè)bean的name就行了,像這樣定義: 注意到oPOJO它就是那個(gè)對(duì)action定義class屬性值既然這beanSpring的管理之下,我們就可以給它設(shè)置(注入)DAO,Hibernate等等。如果讀者還需要設(shè)置其它類型的匹配模式,例如根據(jù)type

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論