作者:Flyingis
前段時(shí)間用Struts完成一個(gè)小項(xiàng)目,當(dāng)時(shí)還沒(méi)有來(lái)到blogjava,很多東西也沒(méi)有記錄。現(xiàn)在花一點(diǎn)時(shí)間,將整個(gè)Struts應(yīng)用重新溫習(xí)一遍,重新挖掘項(xiàng)目開(kāi)發(fā)過(guò)程中沒(méi)有注意到的知識(shí)點(diǎn),并寫(xiě)下自己的一些心得與體會(huì)。
ActionMapping
ActionMapping將對(duì)Struts應(yīng)用中有效的業(yè)務(wù)邏輯進(jìn)行分類(lèi),當(dāng)一個(gè)請(qǐng)求到達(dá)時(shí),ActionSevlet在ActionMapping目錄中查找對(duì)應(yīng)的信息。ActionMapping是Struts應(yīng)用的一個(gè)核心設(shè)計(jì),當(dāng)需要了解一個(gè)Struts應(yīng)用,或編寫(xiě)一個(gè)新的Struts應(yīng)用的時(shí)候,都應(yīng)該從ActionMapping入手。ActionMapping有較多的屬性信息,具體參考相關(guān)文檔。
ActionForward
ActionForward是Struts的核心類(lèi)之一,其基類(lèi)僅有4個(gè)屬性:name / path / redirect / classname。在基于Struts的Web應(yīng)用程序開(kāi)發(fā)過(guò)程中,Action操作完畢后程序會(huì)通過(guò)Struts的配置文件struts-config.xml鏈接到指定的ActionForward,傳到Struts的核心類(lèi)ActionServlet,ActionServlet使用ActionForward提供的路徑,將控制傳遞給下一個(gè)步驟。ActionForward控制接下來(lái)程序的走向。ActionForward代表一個(gè)應(yīng)用的URI,它包括路徑和參數(shù),例如:
path=“/modify.do?method=edit&id=10”
ActionForward的參數(shù)除了在struts-config.xml和頁(yè)面中設(shè)置外,還可以通過(guò)在Action類(lèi)中添加參數(shù),或重新在Action中創(chuàng)建一個(gè)ActionForward。
在ActionForward中有一個(gè)重要的屬性redirect,當(dāng)redirect=false時(shí),將保存存儲(chǔ)在http請(qǐng)求和請(qǐng)求上下文中的所有內(nèi)容,僅在同一個(gè)應(yīng)用中可用。當(dāng)redirect=true時(shí),Web客戶端進(jìn)行一次新的http請(qǐng)求,請(qǐng)求的資源可以在同一個(gè)應(yīng)用中,也可以不在,原來(lái)的請(qǐng)求參數(shù)不再保存,原來(lái)的請(qǐng)求上下文也被清除,新的http請(qǐng)求僅包含ActionForward的path屬性里所包含的參數(shù)。如果在同一個(gè)應(yīng)用中,用戶會(huì)話的上下文會(huì)被維護(hù)。
ActionForward分為全局轉(zhuǎn)發(fā)和局部轉(zhuǎn)發(fā),Action的Mapping對(duì)象的findForward方法首先會(huì)檢查局部轉(zhuǎn)發(fā)列表,查找失敗就會(huì)到全局轉(zhuǎn)發(fā)列表中查找。書(shū)寫(xiě)格式中,我們一般將全局變量定義為String常數(shù),避免誤解,使得轉(zhuǎn)發(fā)列表結(jié)構(gòu)清晰易讀。
在項(xiàng)目開(kāi)發(fā)過(guò)程中經(jīng)常碰到一種情況,當(dāng)頁(yè)面已經(jīng)改變了,瀏覽器中的地址如/modify.do或/modify.jsp卻沒(méi)有變化,當(dāng)時(shí)沒(méi)有考慮這么細(xì),雖然存在疑問(wèn),但沒(méi)有影響到程序功能的實(shí)現(xiàn),因此忽略過(guò)去了,今天查找了一些資料才弄清楚。客戶端瀏覽器顯示的是瀏覽器最后被給定的URL,當(dāng)URL被提交后,在某個(gè)組件返回一個(gè)響應(yīng)給瀏覽器之前,Web應(yīng)用可能已經(jīng)轉(zhuǎn)發(fā)請(qǐng)求多次,而這些過(guò)程都發(fā)生在服務(wù)器端,客戶端瀏覽器并不知道有什么變化。當(dāng)一個(gè)http響應(yīng)被返回時(shí),它并沒(méi)有包含地址欄的值,所以瀏覽器僅僅顯示其用來(lái)作為初始請(qǐng)求的地址。通過(guò)使用redirect可以改變?yōu)g覽器地址的顯示,因?yàn)檫@樣可以向?yàn)g覽器提交一個(gè)新的請(qǐng)求,但付出的代價(jià)是數(shù)據(jù)不能通過(guò)請(qǐng)求上下文傳遞到頁(yè)面,這也是使用forward和redirect的差異之一。