freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

struts2的工作機制原理分析及實例-資料下載頁

2025-06-29 10:30本頁面
  

【正文】 app id=WebApp_9 version= xmlns= xmlns:xsi= xsi:schemaLocation=:// filter filternamestruts2/filtername ! filterclass/filterclass filterclass /filterclass /filter filtermapping filternamestruts2/filtername urlpattern/*/urlpattern /filtermapping/webapp說明:。,并以javabean形式存放在內(nèi)存中,以后struts2對用戶的每次請求將使用內(nèi)存中數(shù)據(jù)。步驟六、發(fā)布測試。簡要分析執(zhí)行流程:,,并結(jié)合namespace查找名為login的action,查找到此action便交給其處理,LoginAction內(nèi)部會執(zhí)行execute方法,并返回結(jié)果result()。 關(guān)于表單傳參,主要是參照的action中的方法名,而非屬性名。在以前的開發(fā)中,當(dāng)修改一些配置時總是不能及時地更新到服務(wù)器,我們總會重新部署或重啟來更新改變的內(nèi)容,在struts2中可以通過一個常量來達到此目的。struts元素下增加如下內(nèi)容:constant name= value=true / 這樣配置后,當(dāng)配置文件修改保存時就會及時更新到服務(wù)器中。其它一些常量:! 指定WEB應(yīng)用的編碼集,如果使用了velocity或freemarker,它也用于指定輸出的編碼格式 constant name= value=UTF8 / ! ,指定多個請求后綴用逗號分隔 constant name= value=action / !設(shè)置瀏覽器是否緩存靜態(tài)內(nèi)容,建議:開發(fā)階段關(guān)閉,運行時開啟 constant name= value=false / !,系統(tǒng)是否重新加載該文件,開發(fā)階段打開此功能 constant name= value=true / ! 開發(fā)提示:出錯時打印更詳細的信息 constant name= value=true /! constant name= value=do,action /注意::,原因是此版本在獲取請求參數(shù)后才調(diào)用了setCharacterEncoding()方法進行編碼設(shè)置。解決此bug的方法是配置一個filter,并在doFilter方法中增加如下代碼:(“UTF8”)。 。Copy上面的myStruts2項目,改名為myStruts2Vo項目。作如下修改:在LoginAction中有兩個字段:username,password。,然后在LoginAction中提供User對象及相應(yīng)的get/set方法。:戶名:input type=text name=br密碼:input type=password name=br關(guān)鍵就是改掉name屬性值。其它基本無變動。 后話:假如此此User對象并不能和Model層的相應(yīng)對象完全對應(yīng),我們還應(yīng)借助此User對象在Action中構(gòu)建出Model層的相應(yīng)對象,這樣,在exectue方法中便能通過構(gòu)建的Model對象作為參數(shù)與Model層交互。(不建議采用)Copy上面的myStruts2Vo項目,改名為myStruts2Model項目。重點是修改LoginAction,修改后的主要內(nèi)容如下:package 。import 。import 。import 。public class LoginAction implements Action, ModelDrivenUser { private User user = new User()。 public String execute() throws Exception { if (().equals(struts2)) { return loginSuccess。 } else { return loginFailure。 } } public User getModel() { return user。 }}說明:它實現(xiàn)了ModelDriven接口,并使用了泛性機制(必須)。,和第一個實例一樣。說明:此方式一般不會使用,在此略作了解。(1)struts2的execute方法中的參數(shù)不會依賴于servletAPI,實現(xiàn)了也servlet解耦,是一種無侵入式的設(shè)計。(2)struts2提供了攔截器,利用攔截器可以進行AOP編程,實現(xiàn)權(quán)限攔截等功能。(3)struts2提供了類型轉(zhuǎn)換器,我們可以很容易地對請求參數(shù)轉(zhuǎn)換成需要的類型。(4)提供了同種表現(xiàn)層技術(shù)支持,如JSP、freeMarker、velocity等(5)可以對指定的方法進行校驗,可以輕松地實現(xiàn)表單校驗功能(6)提供了全局范圍、包范圍和action范圍的國際化資源文件管理實現(xiàn)。二、在struts2中一些配置(比如常量)(只讀性),(只讀性),,它們的優(yōu)先級逐步升高,即是說后面的配置會覆蓋掉前面相同的配置。=UTF8的配置為例進行說明:: constant name= value=gbk/constant:=UTF8:filterfilternamestruts2/filtername filterclass /filterclass initparam paramname/paramname paramvalueUTF8/paramvalue /initparam/filter說明:官方聲稱配置了此常量可以解決中文亂碼問題,但實事上并不能達到目的,在前面的三個項目中,如果我們在表單中輸入中文,其結(jié)果是會出現(xiàn)亂碼。解決此問題參看[]。,。屬性名是否必須說明Name是Package的唯一標(biāo)識,不允許同名Extends 否指定要繼承的包Namespace否指定名稱空間Abstract否聲明包為抽象否下面我們建立struts2package項目來進行package相關(guān)測試:package name=tt1 namespace=/test1 extends=strutsdefault action name=test1 class= result name=success/forward//result /action/packagepackage name=tt2 namespace=/test2 extends=strutsdefault action name=test2 class= result name=success/forward//result /action/packagea href=%=path%/test2/test2/abr:鏈接地址a href=%=path%/test1/test1/abr鏈接地址說明:,而ActionSupport默認(rèn)返回的就是“success”,。下面重點來看這個package元素的namespace屬性及action的name屬性,它們共同定義了action所映射到的實質(zhì)文件。上圖展示了鏈接地址和action的對應(yīng)關(guān)系,所以當(dāng)我們要想訪問一個action所關(guān)聯(lián)到的jsp文件時,應(yīng)該用namespace+action的name 關(guān)于它的內(nèi)容測試可以參考struts2package項目。 補充:通常情況下,action元素的name是屬性值是不能出現(xiàn)“/”的,所以希望通過action中name屬性來實現(xiàn)多級映射,: constant name= value=true/ 這樣配置后就可以再action的name元素中使用“/”了。比如:package name=tt3 extends=strutsdefault action name=test3/test3 class= result name=success/forward//result /action/package然后輸入a href=%=path%/test3/test3/abr鏈接地址就可以訪問了強調(diào):namespace默認(rèn)值“”,即不配置namespace屬性。它的意思是:如果action不能進行完整路徑匹配,則會來此namespace下進行匹配,比如:.../test/test/,如果參照namespace及action的name不能找到也之完全對應(yīng)的action,它會再到依次追溯到上級目錄中查找,即是說它會以…/test/。如果返回到最終的目錄仍找不到,它就會到namespace=/對應(yīng)的包下查找名為test的action,如果仍找不到,它就會去默認(rèn)的namespace下查找名為test的action,如果找到則執(zhí)行此action。另外,namespace也可以配置成namespace=/。它代表配置為項目的根。 總結(jié)action的名稱探索順序:完全對應(yīng)、逐步追溯到上級目錄查找、/下查找、默認(rèn)namespace下查找。為什么要提出namespace,主要是避免多人共同開發(fā)項目出現(xiàn)名字沖突。如果不使用namespace,多個人所寫的action中可能出現(xiàn)重名的現(xiàn)象,這樣當(dāng)項目合并時就會出現(xiàn)沖突。而有了namespace可以在項目開發(fā)時由項目經(jīng)理給每一個人分不同的namespace,這樣每個開發(fā)人員只需要保證自己所寫的action不同名即可。namespace引發(fā)的鏈接問題:當(dāng)我們?yōu)閍ction配置了namespace時,訪問此action的形式總會是如下形式:.../webappname/xxx/yyy/ 而當(dāng)此action成功執(zhí)行跳轉(zhuǎn)到某個jsp頁面時,如想在此jsp頁面寫鏈接,一定要寫絕對路徑,因為相對路徑是相對.../webappname/xxx/yyy/,而如果以后我們修改了action的namespace時,相對路徑又要變,所以鏈接不能寫成相對路徑。 以下介紹絕對路徑的寫法:通常用myeclipse開發(fā)時建立一個jsp文件,默認(rèn)總會有如下內(nèi)容:%String path = ()。String basePath = ()+://+()+:+()+path+/。%我們寫絕對路徑可以參此內(nèi)容。還可以參head下的base href=%=basePath% 來完成絕對路徑的書寫。:指定多個配置文件比如讓jack來單獨開發(fā)一個action,:struts package name=jack namespace=/jack extends=strutsdefault action name=test4 class= result name=success/forward//result /action /package /struts:include file=/include packagestruts根元素下。鏈接:a href=%=path %/jack/test4/a 。接上例:namespce的作用除了在前面提到的避免協(xié)同開發(fā)名字沖突外,還為認(rèn)證提供一個條件。比如jack開發(fā)的東西所關(guān)聯(lián)到的頁面需要權(quán)限才能被訪問。由于多為tomcat中的內(nèi)容,下面只列出步驟。步驟一,:?xml version=39。39。 encoding=39。utf839。?tomcatusers role rolename=manager/ role rolename=admin/ user username=jack password=jack roles=admin,manager/ user username=tom password=tom roles=manager//tomcatusers步驟二,:securityconstraint webresourcecollection webresourcenamejack/webresourcename urlpattern/jack/*/urlpattern methodPOST/method methodGET/method /webresourcecollection authconstraint rolenameadmin/rolename /authconstraint /securityconstraint securityrole rolenameadmin/rolename /securityrole loginconfig authmethodBASIC/authmethod realmnameinput authentication message/realmname /loginconfig這樣配置完成后,當(dāng)我們訪問.../jack中的任何內(nèi)容都會要求輸入密碼認(rèn)證信息,(這里就只有jack用戶名可以訪問)攔截器能在action被調(diào)用之前和被調(diào)用之后執(zhí)行一些“代碼”。Struts2框架的大部分核心功能都是通過攔截器來實現(xiàn)的,如防止重復(fù)提交、類型轉(zhuǎn)換、對象封裝、校驗、文件上傳、頁面預(yù)裝載等等,都是在攔截器的幫助下實現(xiàn)的。每一個攔截器都是獨立裝載的(pluggable),我們可以根據(jù)實際的需要為每一個action配置它所需要的攔截器。 在myStruts2項目下,重新對配置文件作如下修改:package name=myFirst namespace=/ extends=strutsdefaultinterceptorsinterceptor name=timer class= / interceptor name=params class= / /interceptors action name=login class= interceptorref name=timer/interceptorref interceptorref name=params/interceptorref result name=loginSuccess//result result name=loginFailure//result /action /package首先在package中定義了兩個攔截器,然后在login action中引用了這兩個攔截器,需要說明的是這里使用的攔截器都是系統(tǒng)自帶的攔截器。其實在extends所繼承的strutsdefault中就包含了很多攔截器,也包括我們這里所用的攔截器,但如果在此action中不使用params攔截器,將會報空指針錯,因為params攔截器的作用是傳遞表單參數(shù),如果不使用此攔截器就不能在action中得到表單參數(shù),所以引用時會報空指針錯。雖然extends繼承的strustdefault自帶有params攔截器,但是當(dāng)我們自己引用了攔截器時,繼承strutsdefault將不會再為我們分配默認(rèn)的攔截器(有點類似構(gòu)造器),但是我們?nèi)匀豢梢酝ㄟ^interceptorref name=defaultStack/來繼續(xù)使用strutsdefalut的攔截器。補充:由于上面的package繼承于strutsdefault,而我們這里所用到的timer和params都是在strutsdefalut中定義過,所以即使我們在interceptors中沒有定義過這兩個攔截器,也可以直接在action中引用。使用/interceptorstack組合多個攔截器:比如我們想把上面的params和timer這兩個攔截器組合: interceptorstack name=timer_param interceptorref name=timer / interceptorref name=params / /interceptorstack然后再在action引用interceptorref name=timer_param/”,效果和分別引用兩個是一樣的。其實我們使用strtusdefault中的interceptorref name=defaultStack/也是使用interceptorstack方式。,在struts2中實現(xiàn)action的統(tǒng)一操作也很簡單。我們以crud操作為例,把crud集中到一個Action中。步驟一、建立CRUDAction,內(nèi)容如下:package 。import 。public class CRUDAction extends ActionSupport { public String add() { return success。 } public String del() { return success。 } public String update() { return success。 } public String query() { return success。 }}步驟二、配置此Action,為了清晰明了,專為此Action,主要內(nèi)容如下:struts package name=crud extends=strutsdefault namespace=/crud action name=add class= method=add result name=success/crud//result /action action name=del
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1