struts七點(diǎn)經(jīng)驗(yàn)-2(轉(zhuǎn))
Posted on 2006-07-20 17:25 duyouyou.com 閱讀(455) 評(píng)論(0) 編輯 收藏 所屬分類: web技術(shù)
3. 使用應(yīng)用模塊(Application Modules)
Struts 1.1的一個(gè)新特性是應(yīng)用模塊的概念。應(yīng)用模塊允許將單個(gè)Struts應(yīng)用劃分成幾個(gè)模塊,每個(gè)模塊有自己的Struts配置文件,JSP頁(yè)面,Action等等。這個(gè)新特性是為了解決大中型的開(kāi)發(fā)隊(duì)伍抱怨最多的一個(gè)問(wèn)題,即為了更好的支持并行開(kāi)發(fā)允許多個(gè)配置文件而不是單個(gè)配置文件。
注:在早期的beta版本中,該特性被稱為子應(yīng)用(sub-applications),最近的改名目的是為了更多地反映它們?cè)谶壿嬌系姆止ぁ?br />
顯然,當(dāng)很多開(kāi)發(fā)人員一起參加一個(gè)項(xiàng)目時(shí),單個(gè)的Struts配置文件很容易引起資源沖突。應(yīng)用模塊允許Struts按照功能要求進(jìn)行劃分,許多情況已經(jīng)證明這樣更貼近實(shí)際。例如,假設(shè)我們要開(kāi)發(fā)一個(gè)典型的商店應(yīng)用程序。可以將組成部分劃分成模塊比如catalog(商品目錄), customer(顧客), customer service(顧客服務(wù)), order(訂單)等。每個(gè)模塊可以分布到不同的目錄下,這樣各部分的資源很容易定位,有助于開(kāi)發(fā)和部署。圖1 顯示了該應(yīng)用的目錄結(jié)構(gòu)。
注:如果你無(wú)需將項(xiàng)目劃分成多個(gè)模塊,Struts框架支持一個(gè)缺省的應(yīng)用模塊。這就使得應(yīng)用程序也可以在1.0版本下創(chuàng)建,具有可移植性,因?yàn)閼?yīng)用程序會(huì)自動(dòng)作為缺省的應(yīng)用模塊。
為了使用多應(yīng)用模塊功能,必須執(zhí)行以下幾個(gè)準(zhǔn)備步驟:
· 為每個(gè)應(yīng)用模塊創(chuàng)建獨(dú)立的Struts配置文件。
· 配置Web 部署描述符 Web.xml文件。
· 使用org.apache.struts.actions.SwitchAction 來(lái)實(shí)現(xiàn)程序在模塊之間的跳轉(zhuǎn).
創(chuàng)建獨(dú)立的Struts配置文件
每個(gè)Struts應(yīng)用模塊必須擁有自己的配置文件。允許創(chuàng)建自己的獨(dú)立于其他模塊的Action,ActionForm,異常處理甚至更多。
繼續(xù)以上面的商店應(yīng)用程序?yàn)槔覀兛梢詣?chuàng)建以下的配置文件:一個(gè)文件名為struts-config-catalog.xml,包含catalog(商品目錄)、items(商品清單)、和其它與庫(kù)存相關(guān)的功能的配置信息;另一個(gè)文件名為struts- config-order.xml, 包含對(duì)order(訂單)和order tracking(訂單跟蹤)的設(shè)置。第三個(gè)配置文件是struts-config.xml,其中含有屬于缺省的應(yīng)用模塊中的一般性的功能。
配置Web部署描述符
在Struts的早期版本中,我們?cè)赪eb.xml中指定Struts配置文件的路徑。好在這點(diǎn)沒(méi)變,有助于向后兼容。但對(duì)于多個(gè)應(yīng)用模塊,我們需要在Web部署描述符中增加新的配置文件的設(shè)定。
對(duì)于缺省的應(yīng)用(包括Struts的早期版本),Struts framework 在Web.xml文件中查找?guī)в衏onfig的元素,用于載入Action mapping 和其它的應(yīng)用程序設(shè)定。作為例子,以下的XML片斷展現(xiàn)一個(gè)典型的元素:
注:如果在現(xiàn)有的元素中找不到"config"關(guān)鍵字,Struts framework將缺省地使用/WEB/struts-config.xml
為了支持多個(gè)應(yīng)用模塊(Struts 1.1的新特性),必須增加附加的元素。與缺省的元素不同的是,附加的元素與每個(gè)應(yīng)用模塊對(duì)應(yīng),必須以config/xxx的形式命名,其中字符串xxx代表該模塊唯一的名字。例如,在商店應(yīng)用程序的例子中,元素可定義如下(注意粗體字部分):
第一個(gè)元素對(duì)應(yīng)缺省的應(yīng)用模塊。第二和第三個(gè)元素分別代表非缺省應(yīng)用模塊catalog 和 order。
當(dāng)Struts載入應(yīng)用程序時(shí),它首先載入缺省應(yīng)用模塊的配置文件。然后查找?guī)в凶址甤onfig/xxx 形式的附加的初始化參數(shù)。對(duì)每個(gè)附加的配置文件也進(jìn)行解析并載入內(nèi)存。這一步完成后,用戶就可以很隨意地用config/后面的字符串也就是名字來(lái)調(diào)用相應(yīng)的應(yīng)用模塊。
多個(gè)應(yīng)用模塊之間調(diào)用Action類
在為每個(gè)應(yīng)用模塊創(chuàng)建獨(dú)立的配置文件之后,我們就有可能需要調(diào)用不同的模塊中Action。為此必須使用Struts框架提供的SwitchAction類。Struts 會(huì)自動(dòng)將應(yīng)用模塊的名字添加到URL,就如Struts 自動(dòng)添加應(yīng)用程序的名字加到URL一樣。應(yīng)用模塊是對(duì)框架的一個(gè)新的擴(kuò)充,有助于進(jìn)行并行的團(tuán)隊(duì)開(kāi)發(fā)。如果你的團(tuán)隊(duì)很小那就沒(méi)必要用到這個(gè)特性,不必進(jìn)行模塊化。當(dāng)然,就算是只有一個(gè)模塊,系統(tǒng)還是一樣的運(yùn)作。
4. 把JSP放到WEB-INF后以保護(hù)JSP源代碼
為了更好地保護(hù)你的JSP避免未經(jīng)授權(quán)的訪問(wèn)和窺視, 一個(gè)好辦法是將頁(yè)面文件存放在Web應(yīng)用的WEB-INF目錄下。
通常JSP開(kāi)發(fā)人員會(huì)把他們的頁(yè)面文件存放在Web應(yīng)用相應(yīng)的子目錄下。一個(gè)典型的商店應(yīng)用程序的目錄結(jié)構(gòu)如圖2所示。跟catalog (商品目錄)相關(guān)的JSP被保存在catalog子目錄下。跟customer相關(guān)的JSP,跟訂單相關(guān)的JSP等都按照這種方法存放。
這種方法的問(wèn)題是這些頁(yè)面文件容易被偷看到源代碼,或被直接調(diào)用。某些場(chǎng)合下這可能不是個(gè)大問(wèn)題,可是在特定情形中卻可能構(gòu)成安全隱患。用戶可以繞過(guò)Struts的controller直接調(diào)用JSP同樣也是個(gè)問(wèn)題。
為了減少風(fēng)險(xiǎn),可以把這些頁(yè)面文件移到WEB-INF 目錄下。基于Servlet的聲明,WEB-INF不作為Web應(yīng)用的公共文檔樹(shù)的一部分。因此,WEB-INF 目錄下的資源不是為客戶直接服務(wù)的。我們?nèi)匀豢梢允褂肳EB-INF目錄下的JSP頁(yè)面來(lái)提供視圖給客戶,客戶卻不能直接請(qǐng)求訪問(wèn)JSP。
采用前面的例子,圖3顯示將JSP頁(yè)面移到WEB-INF 目錄下后的目錄結(jié)構(gòu)
如果把這些JSP頁(yè)面文件移到WEB-INF 目錄下,在調(diào)用頁(yè)面的時(shí)候就必須把"WEB-INF"添加到URL中。例如,在一個(gè)Struts配置文件中為一個(gè)logoff action寫(xiě)一個(gè)Action mapping。其中JSP的路徑必須以"WEB-INF"開(kāi)頭。如下所示:請(qǐng)注意粗體部分.
這個(gè)方法在任何情況下都不失為Struts實(shí)踐中的一個(gè)好方法。是唯一要注意的技巧是你必須把JSP和一個(gè)Struts action聯(lián)系起來(lái)。即使該Action只是一個(gè)很基本的很簡(jiǎn)單JSP,也總是要調(diào)用一個(gè)Action,再由它調(diào)用JSP。
最后要說(shuō)明的是,并不是所有的容器都能支持這個(gè)特性。WebLogic早期的版本不能解釋Servlet聲明,因此無(wú)法提供支持,據(jù)報(bào)道在新版本中已經(jīng)改進(jìn)了。總之使用之前先檢查一下你的Servlet容器。
Struts 1.1的一個(gè)新特性是應(yīng)用模塊的概念。應(yīng)用模塊允許將單個(gè)Struts應(yīng)用劃分成幾個(gè)模塊,每個(gè)模塊有自己的Struts配置文件,JSP頁(yè)面,Action等等。這個(gè)新特性是為了解決大中型的開(kāi)發(fā)隊(duì)伍抱怨最多的一個(gè)問(wèn)題,即為了更好的支持并行開(kāi)發(fā)允許多個(gè)配置文件而不是單個(gè)配置文件。
注:在早期的beta版本中,該特性被稱為子應(yīng)用(sub-applications),最近的改名目的是為了更多地反映它們?cè)谶壿嬌系姆止ぁ?br />
顯然,當(dāng)很多開(kāi)發(fā)人員一起參加一個(gè)項(xiàng)目時(shí),單個(gè)的Struts配置文件很容易引起資源沖突。應(yīng)用模塊允許Struts按照功能要求進(jìn)行劃分,許多情況已經(jīng)證明這樣更貼近實(shí)際。例如,假設(shè)我們要開(kāi)發(fā)一個(gè)典型的商店應(yīng)用程序。可以將組成部分劃分成模塊比如catalog(商品目錄), customer(顧客), customer service(顧客服務(wù)), order(訂單)等。每個(gè)模塊可以分布到不同的目錄下,這樣各部分的資源很容易定位,有助于開(kāi)發(fā)和部署。圖1 顯示了該應(yīng)用的目錄結(jié)構(gòu)。
![]() 圖 1. 一個(gè)典型的商店應(yīng)用程序的目錄結(jié)構(gòu) |
注:如果你無(wú)需將項(xiàng)目劃分成多個(gè)模塊,Struts框架支持一個(gè)缺省的應(yīng)用模塊。這就使得應(yīng)用程序也可以在1.0版本下創(chuàng)建,具有可移植性,因?yàn)閼?yīng)用程序會(huì)自動(dòng)作為缺省的應(yīng)用模塊。
為了使用多應(yīng)用模塊功能,必須執(zhí)行以下幾個(gè)準(zhǔn)備步驟:
· 為每個(gè)應(yīng)用模塊創(chuàng)建獨(dú)立的Struts配置文件。
· 配置Web 部署描述符 Web.xml文件。
· 使用org.apache.struts.actions.SwitchAction 來(lái)實(shí)現(xiàn)程序在模塊之間的跳轉(zhuǎn).
創(chuàng)建獨(dú)立的Struts配置文件
每個(gè)Struts應(yīng)用模塊必須擁有自己的配置文件。允許創(chuàng)建自己的獨(dú)立于其他模塊的Action,ActionForm,異常處理甚至更多。
繼續(xù)以上面的商店應(yīng)用程序?yàn)槔覀兛梢詣?chuàng)建以下的配置文件:一個(gè)文件名為struts-config-catalog.xml,包含catalog(商品目錄)、items(商品清單)、和其它與庫(kù)存相關(guān)的功能的配置信息;另一個(gè)文件名為struts- config-order.xml, 包含對(duì)order(訂單)和order tracking(訂單跟蹤)的設(shè)置。第三個(gè)配置文件是struts-config.xml,其中含有屬于缺省的應(yīng)用模塊中的一般性的功能。
配置Web部署描述符
在Struts的早期版本中,我們?cè)赪eb.xml中指定Struts配置文件的路徑。好在這點(diǎn)沒(méi)變,有助于向后兼容。但對(duì)于多個(gè)應(yīng)用模塊,我們需要在Web部署描述符中增加新的配置文件的設(shè)定。
對(duì)于缺省的應(yīng)用(包括Struts的早期版本),Struts framework 在Web.xml文件中查找?guī)в衏onfig的元素
![]() |
注:如果在現(xiàn)有的
為了支持多個(gè)應(yīng)用模塊(Struts 1.1的新特性),必須增加附加的
![]() |
第一個(gè)
當(dāng)Struts載入應(yīng)用程序時(shí),它首先載入缺省應(yīng)用模塊的配置文件。然后查找?guī)в凶址甤onfig/xxx 形式的附加的初始化參數(shù)。對(duì)每個(gè)附加的配置文件也進(jìn)行解析并載入內(nèi)存。這一步完成后,用戶就可以很隨意地用config/后面的字符串也就是名字來(lái)調(diào)用相應(yīng)的應(yīng)用模塊。
多個(gè)應(yīng)用模塊之間調(diào)用Action類
在為每個(gè)應(yīng)用模塊創(chuàng)建獨(dú)立的配置文件之后,我們就有可能需要調(diào)用不同的模塊中Action。為此必須使用Struts框架提供的SwitchAction類。Struts 會(huì)自動(dòng)將應(yīng)用模塊的名字添加到URL,就如Struts 自動(dòng)添加應(yīng)用程序的名字加到URL一樣。應(yīng)用模塊是對(duì)框架的一個(gè)新的擴(kuò)充,有助于進(jìn)行并行的團(tuán)隊(duì)開(kāi)發(fā)。如果你的團(tuán)隊(duì)很小那就沒(méi)必要用到這個(gè)特性,不必進(jìn)行模塊化。當(dāng)然,就算是只有一個(gè)模塊,系統(tǒng)還是一樣的運(yùn)作。
4. 把JSP放到WEB-INF后以保護(hù)JSP源代碼
為了更好地保護(hù)你的JSP避免未經(jīng)授權(quán)的訪問(wèn)和窺視, 一個(gè)好辦法是將頁(yè)面文件存放在Web應(yīng)用的WEB-INF目錄下。
通常JSP開(kāi)發(fā)人員會(huì)把他們的頁(yè)面文件存放在Web應(yīng)用相應(yīng)的子目錄下。一個(gè)典型的商店應(yīng)用程序的目錄結(jié)構(gòu)如圖2所示。跟catalog (商品目錄)相關(guān)的JSP被保存在catalog子目錄下。跟customer相關(guān)的JSP,跟訂單相關(guān)的JSP等都按照這種方法存放。
![]() 圖 2.基于不同的功能 JSP 被放置在不同的目錄下 |
這種方法的問(wèn)題是這些頁(yè)面文件容易被偷看到源代碼,或被直接調(diào)用。某些場(chǎng)合下這可能不是個(gè)大問(wèn)題,可是在特定情形中卻可能構(gòu)成安全隱患。用戶可以繞過(guò)Struts的controller直接調(diào)用JSP同樣也是個(gè)問(wèn)題。
為了減少風(fēng)險(xiǎn),可以把這些頁(yè)面文件移到WEB-INF 目錄下。基于Servlet的聲明,WEB-INF不作為Web應(yīng)用的公共文檔樹(shù)的一部分。因此,WEB-INF 目錄下的資源不是為客戶直接服務(wù)的。我們?nèi)匀豢梢允褂肳EB-INF目錄下的JSP頁(yè)面來(lái)提供視圖給客戶,客戶卻不能直接請(qǐng)求訪問(wèn)JSP。
采用前面的例子,圖3顯示將JSP頁(yè)面移到WEB-INF 目錄下后的目錄結(jié)構(gòu)
![]() 圖 3. JSP存放在 WEB-INF 目錄下更為安全 |
如果把這些JSP頁(yè)面文件移到WEB-INF 目錄下,在調(diào)用頁(yè)面的時(shí)候就必須把"WEB-INF"添加到URL中。例如,在一個(gè)Struts配置文件中為一個(gè)logoff action寫(xiě)一個(gè)Action mapping。其中JSP的路徑必須以"WEB-INF"開(kāi)頭。如下所示:請(qǐng)注意粗體部分.
這個(gè)方法在任何情況下都不失為Struts實(shí)踐中的一個(gè)好方法。是唯一要注意的技巧是你必須把JSP和一個(gè)Struts action聯(lián)系起來(lái)。即使該Action只是一個(gè)很基本的很簡(jiǎn)單JSP,也總是要調(diào)用一個(gè)Action,再由它調(diào)用JSP。
最后要說(shuō)明的是,并不是所有的容器都能支持這個(gè)特性。WebLogic早期的版本不能解釋Servlet聲明,因此無(wú)法提供支持,據(jù)報(bào)道在新版本中已經(jīng)改進(jìn)了。總之使用之前先檢查一下你的Servlet容器。