JSP 程序開發(fā)模式包括 JSP 編程、JSP+JavaBean 編程、JSP+JavaBean+Servlet 編程、MVC 模式。
在 JSP 編程模式下,通過應(yīng)用 JSP 中的腳本標(biāo)志,可以直接在 JSP 頁面中實(shí)現(xiàn)各種功能。雖然這種模式很容易實(shí)現(xiàn),但是,其缺點(diǎn)也非常明顯。因?yàn)閷⒋蟛糠值?Java 代碼與 HTML 代碼混淆在一起,會(huì)給程序的維護(hù)和調(diào)試帶來很多困難,而且難以理清完整的程序結(jié)構(gòu)。
這就好比規(guī)劃管理一個(gè)大型企業(yè),如果將負(fù)責(zé)不同任務(wù)的所有員工都安排在一起工作,勢必會(huì)造成公司秩序混亂、不易管理等許多隱患。所以說,單純的 JSP 頁面編程模式是無法應(yīng)用到大型、中型甚至小型的 JSP Web 應(yīng)用程序開發(fā)中的。
JSP+JavaBean 編程模式是 JSP 程序開發(fā)經(jīng)典設(shè)計(jì)模式之一,適合小型或中型網(wǎng)站的開發(fā)。利用 JavaBean 技術(shù),可以很容易地完成一些業(yè)務(wù)邏輯上的操作,例如數(shù)據(jù)庫的連接、用戶登錄與注銷等。
JavaBean 是一個(gè)遵循了一定規(guī)則的 Java 類,在程序的開發(fā)中,將要進(jìn)行的業(yè)務(wù)邏輯封裝到這個(gè)類中,在 JSP 頁面中,通過動(dòng)作標(biāo)簽來調(diào)用這個(gè)類,從而執(zhí)行這個(gè)業(yè)務(wù)邏輯。此時(shí)的 JSP 除了負(fù)責(zé)部分流程的控制外,主要用來進(jìn)行頁面的顯示,而 JavaBean 則負(fù)責(zé)業(yè)務(wù)邏輯的處理。
可以看出,JSP+JavaBean 設(shè)計(jì)模式具有一個(gè)比較清晰的程序結(jié)構(gòu),在 JSP 技術(shù)的起步階段,該模式曾被廣泛應(yīng)用。
圖 1 表示該模式對(duì)客戶端的請求進(jìn)行處理的過程,相關(guān)的說明如下。
1.用戶通過客戶端瀏覽器請求服務(wù)器。
2.服務(wù)器接收用戶請求后調(diào)用 JSP 頁面。
3.在 JSP 頁面中調(diào)用 JavaBean。
4.在 JavaBean 中連接及操作數(shù)據(jù)庫,或?qū)崿F(xiàn)其他業(yè)務(wù)邏輯。
5.JavaBean 將執(zhí)行的結(jié)果返回 JSP+ 頁面。
6.服務(wù)器讀取 JSP 頁面中的內(nèi)容(將頁面中的靜態(tài)內(nèi)容與動(dòng)態(tài)內(nèi)容相結(jié)合)。
7.服務(wù)器將最終的結(jié)果返回給客戶端瀏覽器進(jìn)行顯示。
圖1 JSP+JavaBean設(shè)計(jì)模式
JSP+JavaBean 設(shè)計(jì)模式雖然已經(jīng)對(duì)網(wǎng)站的業(yè)務(wù)邏輯和顯示頁面進(jìn)行了分離,但這種模式下的 JSP 不但要控制程序中的大部分流程,而且還要負(fù)責(zé)頁面的顯示,所以仍然不是一種理想的設(shè)計(jì)模式。
在 JSP+JavaBean 設(shè)計(jì)模式的基礎(chǔ)上加入 Servlet 來實(shí)現(xiàn)程序中的控制層,是一個(gè)很好的選擇。在這種模式中,由 Servlet 來執(zhí)行業(yè)務(wù)邏輯并負(fù)責(zé)程序的流程控制,JavaBean 組件實(shí)現(xiàn)業(yè)務(wù)邏輯,充當(dāng)模型的角色,JSP 用于頁面的顯示。可以看出,這種模式使得程序中的層次關(guān)系更明顯,各組件的分工也非常明確。圖 2 表示該模式對(duì)客戶端的請求進(jìn)行處理的過程。
圖2 JSP+JavaBean+Servlet 設(shè)計(jì)模式
圖 2 所示的模式中,各步驟的說明如下。
1.用戶通過客戶端瀏覽器請求服務(wù)器。
2.服務(wù)器接收用戶請求后調(diào)用 Servlet。
3.Servlet 根據(jù)用戶請求調(diào)用 JavaBean 處理業(yè)務(wù)。
4.在 JavaBean 中連接及操作數(shù)據(jù)庫,或?qū)崿F(xiàn)其他業(yè)務(wù)邏輯。
5.JavaBean 將結(jié)果返回 Servlet,在 Servlet 中將結(jié)果保存到請求對(duì)象中。
6.由 Servlet 轉(zhuǎn)發(fā)請求到 JSP 頁面。
7.服務(wù)器讀取 JSP 頁面中的內(nèi)容(將頁面中的靜態(tài)內(nèi)容與動(dòng)態(tài)內(nèi)容結(jié)合)。
8.服務(wù)器將最終的結(jié)果返回給客戶端瀏覽器進(jìn)行顯示。
但 JSP+JavaBean+Servlet 模式同樣也存在缺點(diǎn)。該模式遵循了 MVC 設(shè)計(jì)模式,MVC 只是一個(gè)抽象的設(shè)計(jì)概念,它將待開發(fā)的應(yīng)用程序分解為三個(gè)獨(dú)立的部分:模型(Model)、視圖(View)和控制器(Controller)。
雖然用來實(shí)現(xiàn) MVC 設(shè)計(jì)模式的技術(shù)可能都是相同的,但各公司都有自己的 MVC 架構(gòu)。也就是說,這些公司用來實(shí)現(xiàn)自己的 MVC 架構(gòu)所應(yīng)用的技術(shù)可能都是 JSP、Servlet 與 JavaBean,但它們的流程及設(shè)計(jì)卻是不同的,所以工程師需要花更多的時(shí)間去了解。
從項(xiàng)目開發(fā)的觀點(diǎn)上來說,因?yàn)樾枰O(shè)計(jì) MVC 各對(duì)象之間的數(shù)據(jù)交換格式與方法,所以在系統(tǒng)的設(shè)計(jì)上需要花費(fèi)更多的時(shí)間。
使用 JSP+JavaBean+Servlet 模式進(jìn)行項(xiàng)目開發(fā)時(shí),可以選擇一個(gè)實(shí)現(xiàn)了 MVC 模式的現(xiàn)成的框架,在此框架的基礎(chǔ)上進(jìn)行開發(fā),能夠大大節(jié)省開發(fā)時(shí)間,會(huì)取得事半功倍的效果。目前,已有很多可以使用的現(xiàn)成的 MVC 框架,例如 Struts 框架。
MVC(Model-View-Controller,模型-視圖-控制器)是一種程序設(shè)計(jì)概念,它同時(shí)適用于簡單的和復(fù)雜的程序。使用該模式,可將待開發(fā)的應(yīng)用程序分解為三個(gè)獨(dú)立的部分:模型、視圖和控制器。
提出這種設(shè)計(jì)模式主要是因?yàn)閼?yīng)用程序中用來完成任務(wù)的代碼(模型,也稱為“業(yè)務(wù)邏輯”)通常是程序中相對(duì)穩(wěn)定的部分,并且會(huì)被重復(fù)使用,而程序與用戶進(jìn)行交互的頁面(視圖),卻是經(jīng)常改變的。
如果因需要更新頁面而不得不對(duì)業(yè)務(wù)邏輯代碼進(jìn)行改動(dòng),或者要在不同的模塊中應(yīng)用相同的功能時(shí)重復(fù)地編寫業(yè)務(wù)邏輯代碼,不僅會(huì)降低整體程序開發(fā)的進(jìn)程,而且會(huì)使程序變得難以維護(hù)。因此,將業(yè)務(wù)邏輯代碼與外觀呈現(xiàn)分離,將會(huì)更容易地根據(jù)需求的改變來改進(jìn)程序。MVC 模式的模型如圖 3 所示。
圖3 MVC模式的模型
Model(模型):MVC 模式中的 Model(模型)指的是業(yè)務(wù)邏輯的代碼,是應(yīng)用程序中真正用來完成任務(wù)的部分。
View(視圖):視圖實(shí)際上就是程序與用戶進(jìn)行交互的界面,用戶可以看到它的存在。視圖可以具備一定的功能,并應(yīng)遵守對(duì)其所做的約束。在視圖中,不應(yīng)包含對(duì)數(shù)據(jù)處理的代碼,即業(yè)務(wù)邏輯代碼。
Controller(控制器):控制器主要用于控制用戶請求并做出響應(yīng)。它根據(jù)用戶的請求,選擇模型或修改模型,并決定返回什么樣的視圖。