国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實例詳解(五)
 這是本系列的最后一章,大象對示例進(jìn)行適當(dāng)?shù)臄U(kuò)充并說明。
    其實到第四篇,對于示例的說明就已經(jīng)全部講完了,如果按照這樣的例子,很難有什么值得學(xué)習(xí)的地方。大象本著寫點有用東西的原則,在這章,對示例進(jìn)行一下適當(dāng)?shù)臄U(kuò)充并說明。
    第五部分:擴(kuò)展框架
    paramsPrepareParamsStack攔截器棧
    paramsPrepareParamsStack這個攔截器棧是在struts2-default.xml中定義的,里面包含了很多個攔截器,最重要的是這三個:params、preparemodelDriven。我們只要記住這樣幾點。
    params:它負(fù)責(zé)將請求參數(shù)值設(shè)置到Action中與之同名的屬性中。
    prepare:當(dāng)Action實現(xiàn)了Preparable接口時,這個攔截器就會調(diào)用prepare()方法。如果你有想在execute()方法之前執(zhí)行的邏輯處理,它就可以幫你完成這個功能。
    modelDriven:如果Action實現(xiàn)了ModelDriven接口,這個攔截器就會把getModel()方法中的返回結(jié)果壓入值棧。這就意味著,可以在結(jié)果頁面上直接使用model對象的屬性。
    它的執(zhí)行順序是這樣的
    首先,params攔截器會給action中的相關(guān)參數(shù)賦值,如id,usernamepassword等等。
    然后,prepare攔截器執(zhí)行prepare()方法,prepare()會根據(jù)參數(shù),如id,去調(diào)用相關(guān)的方法,設(shè)置model對象。當(dāng)然,實現(xiàn)的這個接口方法由你自己來定義,不局限只設(shè)置model之類的功能。
    接著,modelDriven攔截器會將model對象壓入值棧,因為它是把getModel()方法中的返回結(jié)果放到值棧中,而這個方法的返回類型是個泛型參數(shù),在實現(xiàn)ModelDriven接口的時候,可以給它指定一個具體的對象類型,因此返回類型也將是這個指定的對象類型,如ModelDriven<User>
    最后,params攔截器會將參數(shù)再賦值給model對象。
    思考修改與保存這兩種動作。當(dāng)點擊人員修改時,請求為:user!input.action?id=1,params攔截器會將id參數(shù)值設(shè)置到Action中的id屬性,請一定注意,id屬性要有set()方法,然后prepare攔截器開始在prepare()方法中,根據(jù)這個id值取得User對象,接著modelDriven會調(diào)用getModel()方法,此時,方法中返回的是user對象,所以會把user加入到值棧中,最后再執(zhí)行一次params攔截器,但這時沒有其它的參數(shù)值需要賦值給user對象,所以程序會接著往下走,這里假定沒有其它的業(yè)務(wù)邏輯,執(zhí)行返回,字符串為input,根據(jù)前面講的插件知識,結(jié)果頁面為user-input.jsp,那么就跳轉(zhuǎn)到修改頁面了,而且頁面中表單域?qū)@示數(shù)據(jù)庫中的值。如果理解了修改,那么保存也就清楚了。
    prepare()方法雖然不錯,但是也有弊端,那就是它會對Action中的每個方法都進(jìn)行攔截,不管你是執(zhí)行execute還是input,還是其它的自定義方法,它都會對其攔截,這當(dāng)然不是我們所希望的。那有沒有更好的方式?答案是肯定的,請接著往下看。
    prepareMethedName
    使用prepare攔截器的另一種形式,在prepare名稱后面加上需要攔截的方法名。比如,你要攔截input方法,可以寫成prepareInput,需要攔截save方法,就寫上prepareSave。采取這樣的方式后,將會在執(zhí)行這些方法之前時,才對它們進(jìn)行攔截。
    例如,請求role!input.action,會執(zhí)行RoleAction中的input方法,如果我們設(shè)置了prepareInput方法,則會先進(jìn)入此方法執(zhí)行,執(zhí)行完后再回到input方法往下執(zhí)行。
    請注意,在使用這種方式時,Preparable接口定義的prepare()方法體內(nèi)不要含有任何代碼,就是說給這個方法一個空實現(xiàn)。這樣,它就什么都不做,所有的攔截處理就全部交由相應(yīng)的prepareMethedName來完成。
    
    
    它們在每個對應(yīng)的方法之前執(zhí)行。prepareEntity就是來初始化實體對象,然后由modelDriven攔截器將getModel()方法中的返回結(jié)果放入值棧,當(dāng)返回頁面時,就可以直接取值了。
    StrutsAction
    重新定義一個基類,里面封裝大部分的通用操作,主要依靠泛型來實現(xiàn),將hibernateDao注解進(jìn)來,通過繼承這個基類進(jìn)行基本的CRUD操作。本文末尾提供示例源碼下載,里面有詳細(xì)的注釋,這里我只貼出部分重要代碼進(jìn)行說明,為了行文需要,有些注釋去掉了,但源碼里面都有,請大家放心。
    
    通過擴(kuò)展ActionSupport,使用泛型參數(shù),構(gòu)造函數(shù)根據(jù)反射得到T的具體類型。
    
    這就是默認(rèn)的執(zhí)行方法,基本的操作,在這個超類里面都進(jìn)行了定義,每個方法里面設(shè)置的以do開頭的方法,是方便讓子類進(jìn)行覆蓋,當(dāng)基本的業(yè)務(wù)邏輯無法滿足我們的需求時,就可以在子類重寫這些方法。
    
    方法有默認(rèn)實現(xiàn),主要是列表顯示,保存和刪除,新增和修改已經(jīng)有getModel()方法取得實體,在頁面上使用s標(biāo)簽就可以直接取值,除非有特殊的業(yè)務(wù)需求,否則不用覆蓋doInputEntity()doViewEntity()方法。請注意,當(dāng)需要實現(xiàn)自己的邏輯時,只需要覆蓋上面定義的這些方法,而不用重寫execute、input之類。
    我對HibernateDao又進(jìn)行了適當(dāng)?shù)臄U(kuò)展與修改,提供了更多的基本封裝方法,不過大家還可以繼續(xù)添加。里面都有詳細(xì)的注釋,這里就不在贅述了。
    功能擴(kuò)展
    我對例子做了兩個功能,一個是角色表的增加、修改、刪除、查看,另一個就是用戶表的查詢??梢詮脑创a中看到,我在RoleAction中沒有寫一行關(guān)于增刪改查的代碼,因為它屬于基本操作,超類中已經(jīng)封裝好了,所以這部分的代碼都省了。對于用戶表的查詢,我覆蓋了doListEntity()方法,在業(yè)務(wù)層進(jìn)行條件封裝,執(zhí)行查詢,返回結(jié)果。
    
    這個list就是在超類中定義的,因為默認(rèn)實現(xiàn)中也用到了list,另外list有一個get方法,用于在頁面中顯示。如果不想采取方式取得list集合,就重寫doListEntity()方法。這里說明下,我是沒有加分頁功能的,大家可以按自己的方式添加分頁查詢。
    在用戶查詢方法中,我使用的是QBC對象查詢,因為這種方式很簡潔,不過我在HibernateDao中也寫了HQLSQL方式的查詢方法,并進(jìn)行了封裝,可以很方便的調(diào)用。
    

    
    這個queryResult方法的定義,你可以改為傳遞用戶名與角色ID的參數(shù),大象在這里就是為了方便,直接使用Request請求。這里userDao調(diào)用的query方法是在HibernateDao里面封裝的,因為繼承了HibernateDao,就直接在Service層拿來用了。至于具體的,可以去看源碼。
    頁面部分沒有進(jìn)行大的調(diào)整,主要是將role-list.jsp重命名為role.jsp,因為使用的是超類的默認(rèn)實現(xiàn)。添加了role-input.jsprole-view.jsp兩個文件,并在user.jsp中,加入了查詢條件。這些代碼都很簡單就不再貼了,而且前一篇也貼過一部分。
    對于這個例子的完整講解說明就到此結(jié)束了。大象還想補充說明一下,這個例子只適用于學(xué)習(xí),不適合商用,想在實際項目中運用,還需要對框架做大量的改造工作。本系列只是基于SSH2入門學(xué)習(xí)之用,源碼中不含jar包,下圖是本例中所需的最少jar文件,大家只要下載了spring、struts、hibernate三個完整壓縮包,那么這些jar基本上都包含了。
    
    發(fā)布并啟動Tomcat,然后輸入訪問地址:http://localhost:8080/ssh2 運行該示例,看看效果。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
struts2 ModelDriven攔截器原理以及使用方法詳解
筆記三、struts2 的ModeDriven Preparable
高級框架-Struts2-day01【悟空教程】
模型驅(qū)動 ModelDriven
【Struts2進(jìn)階】Struts2深度解析ModelDriven原理
struts2中action實現(xiàn)Preparable接口
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服