簡(jiǎn)單理解兩種JSP體系結(jié)構(gòu)
Java程序員之所以喜愛(ài)JSP有數(shù)不清的理由。有些人喜歡它為交互式頁(yè)面帶來(lái)的“一次編寫(xiě),處處使用”的方式;還有些人欣賞它是因?yàn)樗菀讓W(xué)習(xí),并且使他們可以把Java作為一種服務(wù)器端腳本語(yǔ)言來(lái)使用。但更多的還都是因?yàn)橐粋€(gè)共同原因??使用JSP的***好處是它能幫助你有效地把表達(dá)與內(nèi)容分離開(kāi)。在本文中,我對(duì)下面的問(wèn)題作了深入探討,那就是,如何使用JSP體系結(jié)構(gòu)獲得***的表達(dá)-內(nèi)容分離效果。
這個(gè)模型也可以被看作是通用MVC設(shè)計(jì)模式在服務(wù)器端的一個(gè)實(shí)現(xiàn)。請(qǐng)注意,在閱讀本文之前,你需要熟悉基本的JSP和servlet編程,因?yàn)槲闹袑⒉粫?huì)涉及到任何語(yǔ)法規(guī)則問(wèn)題。
Servlets有什么問(wèn)題?
盡管JSP在動(dòng)態(tài)Web內(nèi)容服務(wù)和分離內(nèi)容與表達(dá)上可以做得非常好,但仍然會(huì)有人置疑,為什么要把servlets丟在一邊呢?其實(shí)servlets的作用不容置疑。它們?cè)诜?wù)器端處理上做得很優(yōu)秀,而且,由于它們已有了堅(jiān)實(shí)的基礎(chǔ),所以仍將被保留。實(shí)際上,從結(jié)構(gòu)上講,你可以把JSP看作是servlets的一種高級(jí)抽象,就像Servlet2.1 API的一種擴(kuò)充一樣來(lái)實(shí)現(xiàn)。然而,你也不應(yīng)當(dāng)濫用servlets,它們并非對(duì)每個(gè)人都適用。舉個(gè)例子,如果網(wǎng)頁(yè)設(shè)計(jì)者能夠很容易地用傳統(tǒng)HTML或XML工具寫(xiě)出JSP頁(yè)的話(huà),servlets就更適合那些后臺(tái)程序的開(kāi)發(fā)者,因?yàn)閟ervlets通常是用集成開(kāi)發(fā)環(huán)境(IDE)編寫(xiě)的??一般來(lái)說(shuō)這種方式需要更高級(jí)的編程技能。
在運(yùn)用servlets時(shí),即使是開(kāi)發(fā)者也必須小心謹(jǐn)慎以確保表達(dá)和內(nèi)容不存在緊密的聯(lián)系。要做到這一點(diǎn),你通常可以使用第三方HTML包(比如htmlKona)來(lái)混合代碼。但即便是這種方法,盡管它通過(guò)簡(jiǎn)單的屏幕變換帶來(lái)了一些靈活性,卻無(wú)法幫你避免表達(dá)格式本身的改動(dòng)。例如,如果你的表達(dá)格式從HTML變?yōu)镈HTML,你就必須確保那些語(yǔ)言包適應(yīng)新的格式。假設(shè)一種最壞的情況,如果一個(gè)包不可用,你也許將不得不忙于在動(dòng)態(tài)內(nèi)容中艱難地編寫(xiě)表達(dá),這會(huì)把你累死。那么,如何解決這個(gè)問(wèn)題呢?接下來(lái)你將看到,使用JSP與servlets技術(shù)相結(jié)合是構(gòu)建應(yīng)用系統(tǒng)地一種好方法。不同的體系,早期的JSP體系結(jié)構(gòu)規(guī)范提出了兩種用JSP技術(shù)建立應(yīng)用程序的方式。這兩種方式在術(shù)語(yǔ)中分別稱(chēng)作JSP Model 1 和JSP Model 2,它們的本質(zhì)區(qū)別在于處理批量請(qǐng)求的位置不同。在Model 1體系中,如圖1所示,jsp頁(yè)面獨(dú)自響應(yīng)請(qǐng)求并將處理結(jié)果返回客戶(hù)。這里仍然存在表達(dá)與內(nèi)容的分離,因?yàn)樗缘臄?shù)據(jù)存取都是由bean來(lái)完成的。
盡管Model 1體系十分 適合簡(jiǎn)單應(yīng)用的需要,它卻不能滿(mǎn)足復(fù)雜的大型應(yīng)用程序的實(shí)現(xiàn)。不加選擇地隨意運(yùn)用Model 1,會(huì)導(dǎo)致JSP頁(yè)內(nèi)被嵌入大量的腳本片段或Java代碼,特別是當(dāng)需要處理的請(qǐng)求量很大時(shí),情況更為嚴(yán)重。盡管這對(duì)于Java程序員來(lái)說(shuō)可能不是什么大問(wèn)題,但如果JSP頁(yè)面是由網(wǎng)頁(yè)設(shè)計(jì)人員開(kāi)發(fā)并維護(hù)的??通常這是開(kāi)發(fā)大型項(xiàng)目的規(guī)范??這就確實(shí)是個(gè)問(wèn)題了。從根本上講,將導(dǎo)致角色定義不清和職責(zé)分配不明,給項(xiàng)目管理帶來(lái)不必要的麻煩。圖1:JSP Model 1 體系結(jié)構(gòu)。圖中文字:BROWSER:瀏覽器;Request:請(qǐng)求;Response:響應(yīng);Application Server:應(yīng)用服務(wù)器;Enterprise Servers/Data Sources:企業(yè)服務(wù)器/數(shù)據(jù)源。我們還可以看看JSP體系結(jié)構(gòu)的另一張圖例:MVC(Model-View-Controller ) 使用JSP和 SERVLET當(dāng) JSP 剛剛出來(lái)的時(shí)候,它基本上是ASP的翻版,但是,隨著JSP的開(kāi)發(fā)者把一些新功能加入JSP,JSP變得比ASP更有擴(kuò)展性了,因?yàn)樗梢院?SERVLET 整合在一起。這樣,我們?cè)谟?SERVLET 控制應(yīng)用程序的時(shí)候可以使用 JSP 做摸板。
Model 2體系結(jié)構(gòu),如圖2所示,是一種把JSP與servlets聯(lián)合使用來(lái)實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容服務(wù)的方法。它吸取了兩種技術(shù)各自的突出優(yōu)點(diǎn),用JSP生成表達(dá)層的內(nèi)容,讓servlets完 成深層次的處理任務(wù)。在這里,servlets充當(dāng)控制者的角色,負(fù)責(zé)管理對(duì)請(qǐng)求的處理,創(chuàng)建JSP頁(yè)需要使用的bean和對(duì)象,同時(shí)根據(jù)用戶(hù)的動(dòng)作決定把那個(gè)JSP頁(yè)傳給請(qǐng)求者。特別要注意,在JSP頁(yè)內(nèi)沒(méi)有處理邏輯;它僅負(fù)責(zé)檢索原先由servlets創(chuàng)建的對(duì)象或beans,從servlet中提取動(dòng)態(tài)內(nèi)容插入靜態(tài)模板。在我看來(lái),這是一種有代表性的方法,它清晰地分離了表達(dá)和內(nèi)容,明確了角色的定義以及開(kāi)發(fā)者與網(wǎng)頁(yè)設(shè)計(jì)者的分工。事實(shí)上,項(xiàng)目越復(fù)雜,使用Model 2體系結(jié)構(gòu)的好處就越大。圖2:JSP Model 2體系結(jié)構(gòu) 圖中文字:instantlate:瞬間延時(shí);Controller、View、Model分別為MVC設(shè)計(jì)模式中的控制者、試圖、模型;其他同圖1。
JSP Model 2體系結(jié)構(gòu)在 SUN 公司的 J2EE 設(shè)計(jì)藍(lán)圖里有非常詳細(xì)的說(shuō)明,這里還有該體系結(jié)構(gòu)的另一張圖例:如何選擇使用?1。很明顯,JSP體系結(jié)構(gòu)1是以簡(jiǎn)單頁(yè)面控制為中心的,而體系2是以整體規(guī)劃為中心的。換句話(huà)說(shuō),簡(jiǎn)單的流程我建議使用JSP體系結(jié)構(gòu)1,而包含大量事物處理的項(xiàng)目建議使用體系2。2。如果你的項(xiàng)目里互交成分多不多,如果不多的話(huà),建議使用JSP體系結(jié)構(gòu)1。3。兩個(gè)體系不是對(duì)立的,如果能夠滿(mǎn)足你的需求,你可以在你的項(xiàng)目里混合的使用兩種JSP體系結(jié)構(gòu)。
【編輯推薦】