明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

案例講解JSP Model2體系結(jié)構(gòu)(上)

[摘要]最近已經(jīng)有了很多相關(guān)的介紹,JSP正在成為一種卓越的Java技術(shù),可用于創(chuàng)建動(dòng)態(tài)Web應(yīng)用程序。Java程序員之所以喜愛JSP有數(shù)不清的理由。有些人喜歡它為交互式頁面帶來的“一次編寫,處處使用”的方式;還有些人欣賞它是因?yàn)樗菀讓W(xué)習(xí),并且使他們可以把Java作為一種服務(wù)器端腳本語言來使用。但更多的...
最近已經(jīng)有了很多相關(guān)的介紹,JSP正在成為一種卓越的Java技術(shù),可用于創(chuàng)建動(dòng)態(tài)Web應(yīng)用程序。Java程序員之所以喜愛JSP有數(shù)不清的理由。有些人喜歡它為交互式頁面帶來的“一次編寫,處處使用”的方式;還有些人欣賞它是因?yàn)樗菀讓W(xué)習(xí),并且使他們可以把Java作為一種服務(wù)器端腳本語言來使用。但更多的還都是因?yàn)橐粋(gè)共同原因――使用JSP的最大好處是它能幫助你有效地把表達(dá)與內(nèi)容分離開。在本文中,我對(duì)下面的問題作了深入探討,那就是,如何使用JSP Model 2體系結(jié)構(gòu)獲得最佳的表達(dá)-內(nèi)容分離效果。這個(gè)模型也可以被看作是通用MVC設(shè)計(jì)模式在服務(wù)器端的一個(gè)實(shí)現(xiàn)。請(qǐng)注意,在閱讀本文之前,你需要熟悉基本的JSP和servlet編程,因?yàn)槲闹袑⒉粫?huì)涉及到任何語法規(guī)則問題。

Servlets有什么問題?
  盡管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ò)充一樣來實(shí)現(xiàn)。然而,你也不應(yīng)當(dāng)濫用servlets,它們并非對(duì)每個(gè)人都適用。舉個(gè)例子,如果網(wǎng)頁設(shè)計(jì)者能夠很容易地用傳統(tǒng)HTML或XML工具寫出JSP頁的話,servlets就更適合那些后臺(tái)程序的開發(fā)者,因?yàn)閟ervlets通常是用集成開發(fā)環(huán)境(IDE)編寫的――一般來說這種方式需要更高級(jí)的編程技能。在運(yùn)用servlets時(shí),即使是開發(fā)者也必須小心謹(jǐn)慎以確保表達(dá)和內(nèi)容不存在緊密的聯(lián)系。要做到這一點(diǎn),你通?梢允褂玫谌紿TML包(比如htmlKona)來混合代碼。但即便是這種方法,盡管它通過簡單的屏幕變換帶來了一些靈活性,卻無法幫你避免表達(dá)格式本身的改動(dòng)。例如,如果你的表達(dá)格式從HTML變?yōu)镈HTML,你就必須確保那些語言包適應(yīng)新的格式。假設(shè)一種最壞的情況,如果一個(gè)包不可用,你也許將不得不忙于在動(dòng)態(tài)內(nèi)容中艱難地編寫表達(dá),這會(huì)把你累死。那么,如何解決這個(gè)問題呢?接下來你將看到,使用JSP與servlets技術(shù)相結(jié)合是構(gòu)建應(yīng)用系統(tǒng)地一種好方法。

不同的體系
  早期的JSP規(guī)范提出了兩種用JSP技術(shù)建立應(yīng)用程序的方式。這兩種方式在術(shù)語中分別稱作JSP Model 1 和JSP Model 2,它們的本質(zhì)區(qū)別在于處理批量請(qǐng)求的位置不同。在Model 1體系中,如圖1所示,jsp頁面獨(dú)自響應(yīng)請(qǐng)求并將處理結(jié)果返回客戶。這里仍然存在表達(dá)與內(nèi)容的分離,因?yàn)樗缘臄?shù)據(jù)存取都是由bean來完成的。盡管Model 1體系十分適合簡單應(yīng)用的需要,它卻不能滿足復(fù)雜的大型應(yīng)用程序的實(shí)現(xiàn)。不加選擇地隨意運(yùn)用Model 1,會(huì)導(dǎo)致JSP頁內(nèi)被嵌入大量的腳本片段或Java代碼,特別是當(dāng)需要處理的請(qǐng)求量很大時(shí),情況更為嚴(yán)重。盡管這對(duì)于Java程序員來說可能不是什么大問題,但如果JSP頁面是由網(wǎng)頁設(shè)計(jì)人員開發(fā)并維護(hù)的――通常這是開發(fā)大型項(xiàng)目的規(guī)范――這就確實(shí)是個(gè)問題了。從根本上講,將導(dǎo)致角色定義不清和職責(zé)分配不明,給項(xiàng)目管理帶來不必要的麻煩。


  圖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ù)源。

  Model 2體系結(jié)構(gòu),如圖2所示,是一種把JSP與servlets聯(lián)合使用來實(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頁需要使用的bean和對(duì)象,同時(shí)根據(jù)用戶的動(dòng)作決定把那個(gè)JSP頁傳給請(qǐng)求者。特別要注意,在JSP頁內(nèi)沒有處理邏輯;它僅負(fù)責(zé)檢索原先由servlets創(chuàng)建的對(duì)象或beans,從servlet中提取動(dòng)態(tài)內(nèi)容插入靜態(tài)模板。在我看來,這是一種有代表性的方法,它清晰地分離了表達(dá)和內(nèi)容,明確了角色的定義以及開發(fā)者與網(wǎng)頁設(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。

  為了進(jìn)一步闡明Model 2體系結(jié)構(gòu)的概念,我們來看一個(gè)用它實(shí)現(xiàn)的例子:一個(gè)叫做“音樂無國界”的網(wǎng)上音樂商店。