jsp基于Web的可維護(hù)的數(shù)據(jù)庫瀏覽器(源代碼+論文+答辯PPT)
jsp基于Web的可維護(hù)的數(shù)據(jù)庫瀏覽器(源代碼+論文+答辯PPT),jsp,基于,Web,維護(hù),數(shù)據(jù)庫,瀏覽器,源代碼,論文,答辯,PPT
目錄
1緒論 1
1.1Web應(yīng)用系統(tǒng) 1
1.2體系結(jié)構(gòu) 1
2開發(fā)語言 4
2.1Servlet 4
2.2JSP 4
2.3JDBC接口技術(shù) 5
2.3.1ODBC簡介 5
2.3.2JDBC技術(shù) 5
2.3.3JDBC兩層模型和三層模型 7
3系統(tǒng)結(jié)構(gòu) 8
3.1JSP Servlets和JavaBean來構(gòu)成系統(tǒng) 8
3.1.1體系結(jié)構(gòu) 9
3.2Web 應(yīng)用程序模型 11
3.2.1應(yīng)用程序的基本功能單元 11
3.2.2多層客戶服務(wù)器應(yīng)用模型 12
3.2.3分布式系統(tǒng) 12
3.2.4基于Web的多層應(yīng)用模型 13
4可維護(hù)與實現(xiàn) 14
4.1采用靈活與可維護(hù)的設(shè)計模式 14
4.1.1模型-視圖-控制器 14
4.2要求 15
4.3設(shè)計 17
4.4實現(xiàn) 19
4.4.1表示層-視圖標(biāo)志庫 19
4.4.2邏輯 19
4.4.3應(yīng)用程序預(yù)排 20
4.4.4數(shù)據(jù)層-datasources和datasources.db軟件包 25
4.4.5部署應(yīng)用程序 25
5結(jié)論 25
致 謝 26
參考文獻(xiàn): 27
附錄 安裝Servelet/JSP環(huán)境 28
安裝Tomcat4.0 29
1緒論
1.1Web應(yīng)用系統(tǒng)
近十年來,基于Internet的應(yīng)用正以前所未有的高速度發(fā)展,其中一個重要的方向就是基于Web的應(yīng)用系統(tǒng)的發(fā)展。在此期間,隨著技術(shù)的不斷更新和應(yīng)用的不斷深入,Web應(yīng)用系統(tǒng)的發(fā)展也經(jīng)歷了幾個階段性的跨越。
(圖1.1)
在Web發(fā)展的初期,人們通常使用Web服務(wù)器作為信息發(fā)布工具,它接收用戶的HTTP請求,然后根據(jù)請求提供所對應(yīng)的HTML文檔,除了顯示手段更為豐富的特點之外,HTML文檔與普通靜態(tài)文本并沒有本質(zhì)差別。隨后產(chǎn)生了動態(tài)頁面和更多交互能力的需要,新的應(yīng)用需要根據(jù)客戶請求,從數(shù)據(jù)庫中動態(tài)獲取數(shù)據(jù)并予以顯示。由此所產(chǎn)生的技術(shù)手段有CGI和Web服務(wù)器內(nèi)置API等。這些手段在一定程度上滿足了應(yīng)用需求,但也都存在著各自的局限性:CGI效率低、速度較慢,而內(nèi)置API開發(fā)困難,移植性差。
隨著Web應(yīng)用范圍的擴(kuò)大,基于商業(yè)應(yīng)用的Web開始出現(xiàn),人們需要Web服務(wù)器端提供更為復(fù)雜的和更為靈活的應(yīng)用開發(fā)支持。JavaScript、VBScript等技術(shù)的運用,Web中對象和組件的應(yīng)用使基于Web的商業(yè)程序開發(fā)得以迅速發(fā)展。但這種應(yīng)用通常只適用于構(gòu)建規(guī)模不大的商業(yè)系統(tǒng),當(dāng)商業(yè)系統(tǒng)進(jìn)一步擴(kuò)大時,其擴(kuò)展性受到了限制,因為在Web服務(wù)器最初的設(shè)計目的中并不包括對大規(guī)模、高性能和高可靠性商業(yè)應(yīng)用的支持。應(yīng)用程序服務(wù)器(Application Server)的產(chǎn)生正是為了突破這一瓶頸。
1.2體系結(jié)構(gòu)
應(yīng)用程序服務(wù)器的產(chǎn)生與軟件體系結(jié)構(gòu)的演變發(fā)展也是密切相關(guān)的。讓我們簡單回顧一下軟件體系結(jié)構(gòu)的發(fā)展歷史。與最初的大型中央主機(jī)相適應(yīng),最初的軟件結(jié)構(gòu)體系也是Mainframe結(jié)構(gòu),該結(jié)構(gòu)下客戶、數(shù)據(jù)和程序被集中在主機(jī)上,通常只有少量的GUI界面,對遠(yuǎn)程數(shù)據(jù)庫的訪問比較困難。隨著PC的廣泛應(yīng)用,該結(jié)構(gòu)逐漸在應(yīng)用中被淘汰。
在80年代中期出現(xiàn)了Client/Server分布式計算結(jié)構(gòu),應(yīng)用程序的處理在客戶(PC機(jī))和服務(wù)器(Mainframe或Server)之間分擔(dān);請求通常被關(guān)系型數(shù)據(jù)庫處理,PC機(jī)在接受到被處理的數(shù)據(jù)后實現(xiàn)顯示和業(yè)務(wù)邏輯;系統(tǒng)支持模塊化開發(fā),通常有GUI界面。Client/Server結(jié)構(gòu)因為其靈活性得到了極其廣泛的應(yīng)用。但對于大型軟件系統(tǒng)而言,這種結(jié)構(gòu)在系統(tǒng)的部署和擴(kuò)展性方面還是存在著不足。
Internet的發(fā)展給傳統(tǒng)應(yīng)用軟件的開發(fā)帶來了深刻的影響。基于Internet和Web的軟件和應(yīng)用系統(tǒng)無疑需要更為開放和靈活的體系結(jié)構(gòu)。隨著越來越多的商業(yè)系統(tǒng)被搬上Internet,一種新的、更具生命力的體系結(jié)構(gòu)被廣泛采用,這就是為我們所知的“三層/多層計算”。
一個典型的三層模型如如下圖所示:
(圖1.2)
客戶層(client tier) 用戶接口和用戶請求的發(fā)出地,典型應(yīng)用是網(wǎng)絡(luò)瀏覽器和胖客戶(如Java程序)服務(wù)器層(server tier) 典型應(yīng)用是Web服務(wù)器和運行業(yè)務(wù)代碼的應(yīng)用程序服務(wù)器數(shù)據(jù)層(data tier) 典型應(yīng)用是關(guān)系型數(shù)據(jù)庫和其他后端(back-end)數(shù)據(jù)資源, 如 Oracle和SAP、 R/3等三層體系結(jié)構(gòu)中,客戶(請求信息)、程序(處理請求)和數(shù)據(jù)(被操作)被物理地隔離。三層結(jié)構(gòu)是個更靈活的體系結(jié)構(gòu),它把顯示邏輯從業(yè)務(wù)邏輯中分離出來,這就意味著業(yè)務(wù)代碼是獨立的,可以不關(guān)心怎樣顯示和在哪里顯示。業(yè)務(wù)邏輯層現(xiàn)在處于中間層,不需要關(guān)心由哪種類型的客戶來顯示數(shù)據(jù),也可以與后端系統(tǒng)保持相對獨立性,有利于系統(tǒng)擴(kuò)展。三層結(jié)構(gòu)具有更好的移植性,可以跨不同類型的平臺工作,允許用戶請求在多個服務(wù)器間進(jìn)行負(fù)載平衡。三層結(jié)構(gòu)中安全性也更易于實現(xiàn),因為應(yīng)用程序已經(jīng)同客戶隔離。
1.3應(yīng)用程序服務(wù)器
應(yīng)用程序服務(wù)器是三層/多層體系結(jié)構(gòu)的組成部分,應(yīng)用程序服務(wù)器位于中間層。如上圖所示,應(yīng)用程序服務(wù)器運行于瀏覽器和數(shù)據(jù)資源之間,一個簡單的實例是,顧客從瀏覽器中輸入一個定單,web服務(wù)器將該請求發(fā)送給應(yīng)用程序服務(wù)器,由應(yīng)用程序服務(wù)器執(zhí)行處理邏輯,并且獲取或更新后端用戶數(shù)據(jù)。
在企業(yè)級應(yīng)用中,應(yīng)用程序服務(wù)器是位于企業(yè)數(shù)據(jù)(以及其他企業(yè)遺留系統(tǒng))和訪問企業(yè)數(shù)據(jù)的客戶之間的中間件,它提供了業(yè)務(wù)代碼的存放和運行的環(huán)境。它從物理上把業(yè)務(wù)邏輯(Business logic)同客戶端和數(shù)據(jù)資源分離開來。應(yīng)用程序服務(wù)器可使一個商業(yè)系統(tǒng)得以快速簡便的開發(fā)和部署,也可以適應(yīng)商業(yè)系統(tǒng)的用戶增加而無需重構(gòu)系統(tǒng),這一切都是因為它處于一個相對獨立的結(jié)構(gòu)層。在實際應(yīng)用中,一個企業(yè)系統(tǒng)可以由多個應(yīng)用程序服務(wù)器、多個Web服務(wù)器和多個數(shù)據(jù)庫服務(wù)器組成,應(yīng)用程序代碼可以分布在這多個應(yīng)用程序服務(wù)器上。
應(yīng)用程序服務(wù)器是企業(yè)級web應(yīng)用的必經(jīng)之路,新的企業(yè)級應(yīng)用需要關(guān)鍵性應(yīng)用能對不斷增加的用戶數(shù)量保持持續(xù)可用,此外企業(yè)應(yīng)用還需要高的安全性和可靠性,無論訪問系統(tǒng)的用戶數(shù)量發(fā)生變化,還是系統(tǒng)數(shù)據(jù)資源發(fā)生變化,應(yīng)用程序服務(wù)器都應(yīng)始終保持運行。在應(yīng)用程序服務(wù)器之前,Web應(yīng)用程序通常運行在Web服務(wù)器中,但Web服務(wù)器最初只是被設(shè)計用來提供Web頁面相關(guān)服務(wù)的,因此開發(fā)/運行Web應(yīng)用程序是緩慢而復(fù)雜的。而應(yīng)用程序服務(wù)器的強(qiáng)大功能則能夠為企業(yè)級應(yīng)用系統(tǒng)的開發(fā)和部署提供有力的保證。
一個對應(yīng)用程序服務(wù)器的定義如下:采用具有分布式計算能力的集成結(jié)構(gòu)、支持瘦客戶機(jī)的軟件服務(wù)器產(chǎn)品。應(yīng)用程序服務(wù)器的基本用途包括:管理客戶會話、管理業(yè)務(wù)邏輯、管理與后端計算資源(包括數(shù)據(jù)、事務(wù)和內(nèi)容)的連接。
上述定義的涵蓋范圍是應(yīng)用程序服務(wù)器本身,我們認(rèn)為實際上應(yīng)用程序服務(wù)器還應(yīng)該包括其開發(fā)環(huán)境。每一個應(yīng)用程序服務(wù)器產(chǎn)品都有自己的API。為了充分利用應(yīng)用程序服務(wù)器所提供的功能,開發(fā)人員必須學(xué)會用這些API編程。服務(wù)器的API對實用系統(tǒng)的開發(fā)至關(guān)重要,掌握API方法和它們提供的功能需要花一定的學(xué)習(xí)時間。
越來越多地,應(yīng)用程序服務(wù)器采用諸如COM、CORBA、Enterprise JavaBeans(EJB)和Java Servlets等標(biāo)準(zhǔn)化技術(shù)(其中CORBA和EJB更為常用),上述標(biāo)準(zhǔn)化技術(shù)的采用使開發(fā)變得更加容易,因為它們?yōu)橥ㄓ梅?wù)器管理功能提供了標(biāo)準(zhǔn)化API,遵循標(biāo)準(zhǔn)保證了當(dāng)更改應(yīng)用程序服務(wù)器時原有組件可移植。
2開發(fā)語言
2.1Servlet
Servlet是使用Java Servlet 應(yīng)用程序設(shè)計接口(API)及相關(guān)類和方法的 Java 程序。除了 Java Servlet API,Servlet 還可以使用用以擴(kuò)展和添加到 API 的 Java 類軟件包。Servlet 在啟用 Java 的 Web 服務(wù)器上或應(yīng)用服務(wù)器上運行并擴(kuò)展了該服務(wù)器的能力。Java servlet對于Web服務(wù)器就好象Java applet對于Web瀏覽器。Servlet裝入Web服務(wù)器并在Web服務(wù)器內(nèi)執(zhí)行,而applet裝入Web瀏覽器并在Web瀏覽器內(nèi)執(zhí)行。Java Servlet API 定義了一個servlet 和Java使能的服務(wù)器之間的一個標(biāo)準(zhǔn)接口,這使得Servlets具有跨服務(wù)器平臺的特性。
Servlet 通過創(chuàng)建一個框架來擴(kuò)展服務(wù)器的能力,以提供在 Web 上進(jìn)行請求和響應(yīng)服務(wù)。當(dāng)客戶機(jī)發(fā)送請求至服務(wù)器時,服務(wù)器可以將請求信息發(fā)送給 Servlet,并讓 Servlet 建立起服務(wù)器返回給客戶機(jī)的響應(yīng)。 當(dāng)啟動 Web 服務(wù)器或客戶機(jī)第一次請求服務(wù)時,可以自動裝入 Servlet。裝入后, Servlet 繼續(xù)運行直到其它客戶機(jī)發(fā)出請求。Servlet 的功能涉及范圍很廣。例如,Servlet 可完成如下功能:
(1) 創(chuàng)建并返回一個包含基于客戶請求性質(zhì)的動態(tài)內(nèi)容的完整的 HTML頁面。
(2) 創(chuàng)建可嵌入到現(xiàn)有 HTML 頁面中的一部分 HTML 頁面(HTML 片段)。
(3) 與其它服務(wù)器資源(包括數(shù)據(jù)庫和基于 Java 的應(yīng)用程序)進(jìn)行通信。
(4) 用多個客戶機(jī)處理連接,接收多個客戶機(jī)的輸入,并將結(jié)果廣播到多個客戶機(jī)上。
(5) 當(dāng)允許在單連接方式下傳送數(shù)據(jù)的情況下,在瀏覽器上打開服務(wù)器至applet的新連接,并將該連 接保持在打開狀態(tài)。當(dāng)允許客戶機(jī)和服務(wù)器簡單、高效地執(zhí)行會話的情況下,applet也可以啟動客戶瀏覽器和服務(wù)器之間的連接。可以通過定制協(xié)議或標(biāo)準(zhǔn)(如 IIOP)進(jìn)行通信。
(6) 對特殊的處理采用 MIME 類型過濾數(shù)據(jù),例如圖像轉(zhuǎn)換和服務(wù)器端包括(SSI)。
(7) 將定制的處理提供給所有服務(wù)器的標(biāo)準(zhǔn)例行程序。例如,Servlet 可以修改如何認(rèn)證用戶。
2.2JSP
JavaServer PagesTM (JSP)技術(shù)為創(chuàng)建顯示動態(tài)生成內(nèi)容的Web頁面提供了一個簡捷而快速的方法。JSP技術(shù)的設(shè)計目的是使得構(gòu)造基于Web的應(yīng)用程序更加容易和快捷,而這些應(yīng)用程序能夠與各種Web服務(wù)器,應(yīng)用服務(wù)器,瀏覽器和開發(fā)工具共同工作。JavaServer Pages (JSP)技術(shù)就是被設(shè)計用來滿足能夠在任何Web或應(yīng)用程序服務(wù)器上運行,將應(yīng)用程序邏輯和頁面顯示分離,能夠快速地開發(fā)和測試,簡化開發(fā)基于Web的交互式應(yīng)用程序的過程.
JSP規(guī)范是Web服務(wù)器、應(yīng)用服務(wù)器、交易系統(tǒng)、以及開發(fā)工具供應(yīng)商間廣泛合作的結(jié)果。太陽微系統(tǒng)公司(Sun Microsystems Inc.)開發(fā)出這個規(guī)范來整合和平衡已經(jīng)存在的對Java編程環(huán)境(例如,Java Servlet和JavaBeansTM)進(jìn)行支持的技術(shù)和工具。其結(jié)果是產(chǎn)生了一種新的、開發(fā)基于Web應(yīng)用程序的方法,給予使用基于組件應(yīng)用邏輯的頁面設(shè)計者以強(qiáng)大的功能。 Web頁面開發(fā)人員不會都是熟悉腳本語言的編程人員。JavaServer Page技術(shù)封裝了許多功能,這些功能是在易用的、與JSP相關(guān)的XML標(biāo)識中進(jìn)行動態(tài)內(nèi)容生成所需要的。標(biāo)準(zhǔn)的JSP標(biāo)識能夠訪問和實例化JavaBeans組件,設(shè)置或者檢索組件屬性,下載Applet,以及執(zhí)行用其他方法更難于編碼和耗時的功能。通過開發(fā)定制化標(biāo)識庫,JSP技術(shù)是可以擴(kuò)展的。今后,第三方開發(fā)人員和其他人員可以為常用功能創(chuàng)建自己的標(biāo)識庫。這使得Web頁面開發(fā)人員能夠使用熟悉的工具和如同標(biāo)識一樣的執(zhí)行特定功能的構(gòu)件來工作。JSP技術(shù)很容易整合到多種應(yīng)用體系結(jié)構(gòu)中,以利用現(xiàn)存的工具和技巧,并且擴(kuò)展到能夠支持企業(yè)級的分布式應(yīng)用。作為采用Java技術(shù)家族的一部分,以及Java 2(企業(yè)版體系結(jié)構(gòu))的一個組成部分,JSP技術(shù)能夠支持高度復(fù)雜的基于Web的應(yīng)用。由于JSP頁面的內(nèi)置腳本語言是基于Java編程語言的,而且所有的JSP頁面都被編譯成為Java Servlet,JSP頁面就具有Java技術(shù)的所有好處,包括健壯的存儲管理和安全性。作為Java平臺的一部分,JSP擁有Java編程語言“一次編寫,各處運行”的特點。
隨著越來越多的供應(yīng)商將JSP支持添加到他們的產(chǎn)品中,您可以使用自己所選擇的服務(wù)器和工具,更改工具或服務(wù)器并不影響當(dāng)前的應(yīng)用。當(dāng)與Java 2平臺,企業(yè)版(J2EE)和Enterprise JavaBean技術(shù)整合時,JSP頁面將提供企業(yè)級的擴(kuò)展性和性能,這對于在虛擬企業(yè)中部署基于Web的應(yīng)用是必需的。
2.3JDBC接口技術(shù)
JDBC是一種可用于執(zhí)行SQL語句的JavaAPI(ApplicationProgrammingInterface應(yīng)用程序設(shè)計接口)。它由一些Java語言編寫的類和界面組成。JDBC為數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺工具開發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計接口,使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。
2.3.1ODBC簡介
說到JDBC,很容易讓人聯(lián)想到另一個十分熟悉的字眼“ODBC”。ODBC是OpenDatabaseConnectivity的英文簡寫。它是一種用來在相關(guān)或不相關(guān)的數(shù)據(jù)庫管理系統(tǒng)(DBMS)中存取數(shù)據(jù)的,用C語言實現(xiàn)的,標(biāo)準(zhǔn)應(yīng)用程序數(shù)據(jù)接口。通過ODBCAPI,應(yīng)用程序可以存取保存在多種不同數(shù)據(jù)庫管理系統(tǒng)(DBMS)中的數(shù)據(jù),而不論每個DBMS使用了何種數(shù)據(jù)存儲格式和編程接口。
2.3.2JDBC技術(shù)
JDBC是一種可用于執(zhí)行SQL語句的JavaAPI(ApplicationProgrammingInterface,應(yīng)用程序設(shè)計接口)。它由一些Java語言寫的類、界面組成。JDBC給數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺工具開發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計接口,使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。
通過使用JDBC,開發(fā)人員可以很方便地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫。也就是說,開發(fā)人員可以不必寫一個程序訪問Sybase,寫另一個程序訪問Oracle,再寫一個程序訪問Microsoft的SQLServer。用JDBC寫的程序能夠自動地將SQL語句傳送給相應(yīng)的數(shù)據(jù)庫管理系統(tǒng)(DBMS)。不但如此,使用Java編寫的應(yīng)用程序可以在任何支持Java的平臺上運行,不必在不同的平臺上編寫不同的應(yīng)用。Java和JDBC的結(jié)合可以讓開發(fā)人員在開發(fā)數(shù)據(jù)庫應(yīng)用時真正實現(xiàn)“WriteOnce,RunEverywhere!”
Java具有健壯、安全、易用等特性,而且支持自動網(wǎng)上下載,本質(zhì)上是一種很好的數(shù)據(jù)庫應(yīng)用的編程語言。它所需要的是Java應(yīng)用如何同各種各樣的數(shù)據(jù)庫連接,JDBC正是實現(xiàn)這種連接的關(guān)鍵。
JDBC擴(kuò)展了Java的能力,如使用Java和JDBCAPI就可以公布一個Web頁,頁中帶有能訪問遠(yuǎn)端數(shù)據(jù)庫的Applet?;蛘咂髽I(yè)可以通過JDBC讓全部的職工(他們可以使用不同的操作系統(tǒng),如Windwos,Machintosh和UNIX)在Intranet上連接到幾個全球數(shù)據(jù)庫上,而這幾個全球數(shù)據(jù)庫可以是不相同的。隨著越來越多的程序開發(fā)人員使用Java語言,對Java訪問數(shù)據(jù)庫易操作性的需求越來越強(qiáng)烈。
MIS管理人員喜歡Java和JDBC,因為這樣可以更容易經(jīng)濟(jì)地公布信息。各種已經(jīng)安裝在數(shù)據(jù)庫中的事務(wù)處理都將繼續(xù)正常運行,甚至這些事務(wù)處理是存儲在不同的數(shù)據(jù)庫管理系統(tǒng)中;而對新的數(shù)據(jù)庫應(yīng)用來說,開發(fā)時間將縮短,安裝和版本升級將大大簡化。程序員可以編寫或改寫一個程序,然后將它放在服務(wù)器上,而每個用戶都可以訪問服務(wù)器得到最新的版本。對于信息服務(wù)行業(yè),Java和JDBC提供了一種很好的向外界用戶更新信息的方法。
簡單地說,JDBC能完成下列三件事:
1)同一個數(shù)據(jù)庫建立連接;
2)向數(shù)據(jù)庫發(fā)送SQL語句;
3)處理數(shù)據(jù)庫返回的結(jié)果。
JDBC是一種底層API,這意味著它將直接調(diào)用SQL命令。JDBC完全勝任這個任務(wù),而且比其他數(shù)據(jù)庫互聯(lián)更加容易實現(xiàn)。同時它也是構(gòu)造高層API和數(shù)據(jù)庫開發(fā)工具的基礎(chǔ)。高層API和數(shù)據(jù)庫開發(fā)工具應(yīng)該是用戶界面更加友好,使用更加方便,更易于理解的。但所有這樣的API將最終被翻譯為象JDBC這樣的底層API。目前兩種基于JDBC的高層API正處在開發(fā)階段。
1)SQL語言嵌入Java的預(yù)處理器。雖然DBMS已經(jīng)實現(xiàn)了SQL查詢,但JDBC要求SQL語句被當(dāng)作字符串參數(shù)傳送給Java程序。而嵌入式SQL預(yù)處理器允許程序員將SQL語句混用:Java變量可以在SQL語句中使用,來接收或提供數(shù)值。然后SQL的預(yù)處理器將把這種Java/SQL混用的程序翻譯成帶有JDBCAPI的Java程序。
2)實現(xiàn)從關(guān)系數(shù)據(jù)庫到Java類的直接映射。Javasoft和其他公司已經(jīng)宣布要實現(xiàn)這一技術(shù)。在這種“對象/關(guān)系”映射中,表的每一行都將變成這類的一個實例,每一列的值對應(yīng)實例的一個屬性。程序員可以直接操作Java的對象;而存取所需要的
SQL調(diào)用將在內(nèi)部直接產(chǎn)生。還可以實現(xiàn)更加復(fù)雜的映射,比如多張表的行在一個
Java的類中實現(xiàn)。
隨著大家對JDBC興趣的不斷濃厚,越來越多的開發(fā)人員已經(jīng)開始利用JDBC為基礎(chǔ)的工具進(jìn)行開發(fā)。這使開發(fā)工作變得容易。同時,程序員也正在開發(fā)對最終用戶來說訪問數(shù)據(jù)庫更加容易的應(yīng)用程序。
2.3.3JDBC兩層模型和三層模型
JDBC支持兩層模型,也支持三層模型訪問數(shù)據(jù)庫。
兩層模型中,一個java Appple或者一個JA-va應(yīng)用直接同數(shù)據(jù)庫連接。這就需要能直接被訪問的數(shù)據(jù)庫進(jìn)行連接的JDBC驅(qū)動器。用戶的SQL語句被傳送給數(shù)據(jù)庫,而這些語句執(zhí)行的結(jié)果將被傳回給用戶。數(shù)據(jù)庫可以在同一機(jī)器上,也可以另一機(jī)器上通過網(wǎng)絡(luò)進(jìn)行連接。這被稱為“Client/Server”結(jié)構(gòu),用戶的計算機(jī)作為Client,運行數(shù)據(jù)庫的計算機(jī)作為Server。這個網(wǎng)絡(luò)可是intranet,比如連接全體雇員的企業(yè)內(nèi)部網(wǎng),當(dāng)然也可以是internet。
在三層模型中,命令將被發(fā)送到服務(wù)的“中間層”,而“中間層”將SQL語句發(fā)送到數(shù)據(jù)庫。數(shù)據(jù)庫處理SQL語句并將結(jié)果返回“中間層”,然后“中間層”將它們 返回用戶。MIS管理員將發(fā)現(xiàn)三層模型很有吸引力,因為“中間層”可以進(jìn)行對訪問的控制并協(xié)同數(shù)據(jù)庫的更新,另一個優(yōu)勢就是如果有一個“中間層”用戶就可以使用一個易用的高層的API,這個API可以由“中間層”進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換成底層的調(diào)用。而且,在許多情況下,三層模型可以提供更好的性能。
到目前為止,“中間層”通常還是用C或C++實現(xiàn),以保證其高性能。但隨著優(yōu)化編譯器的引入,將java的字節(jié)碼轉(zhuǎn)換成高效的機(jī)器碼,用java來實現(xiàn)“中間層”將越來越實際。而JDBC是允許從一個java“中間層”訪問數(shù)據(jù)庫的關(guān)鍵。
3系統(tǒng)結(jié)構(gòu)
3.1JSP Servlets和JavaBean來構(gòu)成系統(tǒng)
本節(jié)我們討論用JSP,Servlets,和JavaBean來構(gòu)成一個系統(tǒng)的途徑。下面有集中不同的結(jié)構(gòu)。每一種都是從上一種發(fā)展過來的,下面的圖表顯示了發(fā)展過程的梗概。
(圖3.1)
當(dāng)Sun公司開始推廣JSP的時候,很多人認(rèn)為可以通過Web頁面來請求的企業(yè)級結(jié)構(gòu)將會取代Servlet。雖然JSP是J2EE規(guī)范的關(guān)鍵組成部分,它處理請求和應(yīng)答機(jī)制。我們需要更深入的研究JSP和Servlet的關(guān)系。
本節(jié)的另一個部分談了JSP代碼的實現(xiàn)細(xì)節(jié),如何編譯轉(zhuǎn)化為Servlet。JSP是建立在Servlet API基礎(chǔ)之上的,;利用了Servlet的語義。理解了這個,提出一個有意思的問題:我們是否不再需要在使用WEB的系統(tǒng)中開發(fā)標(biāo)準(zhǔn)的Servlet?是否有一種方法來結(jié)合JSP和Servlet?如果有的話,我們需要把Java代碼放在何處?在JSP的請求過程中,是否涉及到了其他的組件,比如說JavaBean?如果有的話,他們在這個體系結(jié)構(gòu)處與什么位置,扮演什么角色?
明白這些問題是很重要的。雖然JSP技術(shù)是基本的Servlet技術(shù)的繼承,但是JSP在Servlet的基礎(chǔ)上有所創(chuàng)新,他們可以互相協(xié)作,互相補(bǔ)充對方的不足。
3.1.1體系結(jié)構(gòu)
在討論體系結(jié)構(gòu)之前,有必要提一下兩種使用JSP技術(shù)的基本方法
第一種是以頁面為中心(Page-Centric)的(Client/Server)方式,這樣方式是把請求直接發(fā)給JSP頁面。
第二中方式分發(fā)方式(多層結(jié)構(gòu)的)。這種方式以一個JSP或者Servlet做為一個基本的控制器,它又把請求分給JSP頁面或者JavaBean。
首先我們看看Page-Centric的結(jié)構(gòu)。這樣的結(jié)構(gòu)通常都是來客戶機(jī)和服務(wù)器端都有一個應(yīng)用程序。最常見的例子是PowerBuilder的例子。Servlet或者JSP在服務(wù)器端截獲客戶的請求,直接的訪問數(shù)據(jù)庫等資源。
(圖3.2)
這個結(jié)構(gòu)的優(yōu)點就是編程簡單。允許頁面的設(shè)計者根據(jù)資源的狀態(tài)動態(tài)的生成頁面的內(nèi)容。但是,這樣的結(jié)構(gòu)不適合多個客戶同時訪問資源,這樣同時會有大量的請求需要服務(wù)端來處理。每個請求都會建立一個連接,消耗一定的資源。這樣,需要讓這些連接共享一些資源。其中最明顯的例子就是用JDBC連接數(shù)據(jù)庫中用到的連接池(Connection pools)。對結(jié)構(gòu)使用不適當(dāng)?shù)脑?,會?dǎo)致JSP中出現(xiàn)大量的JAVA代碼。這雖然對java程序設(shè)計人員不會有什么問題,可是大量的代碼分散在JSP中,不利于維護(hù)和修改。
這種基本的結(jié)構(gòu)包括通過嵌入在JSP中的代碼直接的向服務(wù)器發(fā)請求。這樣有幾個優(yōu)點:從開發(fā)看來,成本很低。所有的JAVA代碼都嵌入到HTML中,復(fù)雜性降低了。
(圖3.3)
減少了復(fù)雜性,當(dāng)系統(tǒng)規(guī)模增大的時候,這種結(jié)構(gòu)的缺點也出來了。例如,把太多的應(yīng)用邏輯放到了JSP頁面中。前面我們提到,利用Servlet或者Bean可以把開發(fā)者角色分的更清楚,提高代碼的可重用性。
本論文所用的是多層結(jié)構(gòu)的JSP,在這種結(jié)構(gòu)下,用一個Servlet或者JSP當(dāng)作主要的控制器。將所有的客戶請求分配給其它的JSP、JavaBean或者EJB。
在一個多層結(jié)構(gòu)的應(yīng)用系統(tǒng)中,服務(wù)端的被分成好幾層,如圖3.4所示:
(圖3.4)
在本論文中,應(yīng)用系統(tǒng)是一個多層結(jié)構(gòu)的,中間層的JSP通過其它的對象或者Enterprise JavaBean來訪問后臺資源。EJB服務(wù)器和EJB提供訪問訪問資源的方法,支持事務(wù),支持安全管理。目前,J2EE支持這樣的編程。多層結(jié)構(gòu)應(yīng)用設(shè)計的第一步,是明確系統(tǒng)涉及的對象和他們之間的關(guān)系。也就是首先要確定對象模式。這一步可以通過Rational Rose之類的工具來實現(xiàn)。通常,對象模式的確定需要特別小心,如果對象太多,會增加系統(tǒng)的復(fù)雜性。如果對象模式做的好的話,可以說系統(tǒng)就成功了一半。然后是確定JSP和Servlet,根據(jù)他們扮演的角色的不同,分成兩類。在J2EE中都叫做web組件。
1、?一類(Front-end)是用來處理應(yīng)用流程的。其中有很多對后臺對象(例如EJB)的調(diào)用。他們不處理頁面的表示問題,只是截獲從用戶過來的請求,提供應(yīng)用系統(tǒng)的一個入口。簡化安全管理,而且易于控制應(yīng)用系統(tǒng)的狀態(tài)。
2、還有一類(Presentation)是用來生成HTML或者XML的。這些JSP主要的目的就是來動態(tài)的產(chǎn)生頁面內(nèi)容。
圖3.5表示了這兩類之間的關(guān)系,第一類(Front-end)接收一個請求,然后選擇一個合適的Presentation組件來處理。處理之后,或者直接把結(jié)果返回給客戶,或者把結(jié)果返回給另一個前端組件。
(圖3.5)
有時這種對象模式的劃分是比較困難的。但是,劃分的越清晰,那設(shè)計也越清晰。
這種分類有點類似與模式-視圖(Model-View)結(jié)構(gòu),front-end相當(dāng)于Model,presentation相當(dāng)與View。如圖3.6:
(圖3.6)
在這個模式下,JSP用來產(chǎn)生表示層或者執(zhí)行一些操作。Front-end組件當(dāng)作控制器,處理客戶的請求,生成JavaBean和EJB對象。而在Presentation JSP組件中并沒有處理邏輯過程,只是簡單的從別的對象中得到數(shù)據(jù),然后動態(tài)的插入到模板中。
如果不愿意寫front-end類型的Servlet,也可以寫一些只包括代碼,不包含任何Presentation表示部分的邏輯。不管是寫Servlet還是寫JSP,這樣的結(jié)構(gòu)都把內(nèi)容和表示分開了,將程序開發(fā)者和頁面設(shè)計者比較明確的區(qū)分開來。對系統(tǒng),特別是比較大規(guī)模的系統(tǒng)的設(shè)計是比較適合的。
3.2Web 應(yīng)用程序模型
應(yīng)用程序是什么,簡單的來說,它是人類客觀世界的問題領(lǐng)域在計算機(jī)世界的解決方案。我們生活的客觀世界復(fù)雜多樣,計算機(jī)世界也是博大精深,怎樣從普遍的意義上來表述應(yīng)用程序是一個非常有用的課題。應(yīng)用程序的編程模型,也就是應(yīng)用程序的拓?fù)浣Y(jié)構(gòu),是一門關(guān)于應(yīng)用程序的科學(xué)。從事軟件設(shè)計、軟件開發(fā)的人員,如果能夠就應(yīng)用程序的編程模型有足夠的重視,將受益匪淺。
3.2.1應(yīng)用程序的基本功能單元
??? 組成應(yīng)用程序的功能代碼及其資源,按照其在應(yīng)用程序中的功能,可以簡單分解成為三個部分:用戶界面(User Interface),事務(wù)邏輯(Business Logic)和數(shù)據(jù)存取(Data Access)。應(yīng)用程序的基本功能單元如圖3.7所示。
圖3.7、應(yīng)用程序功能分解
3.2.2多層客戶服務(wù)器應(yīng)用模型
??? 兩層應(yīng)用程序模型的出現(xiàn)極大的增加了應(yīng)用程序的靈活性,同時也帶來應(yīng)用程序可維護(hù)性的提高。但是,在兩層應(yīng)用程序中仍然存在著不便維護(hù)的缺點,客戶端的邏輯或是客戶端的嵌入SQL極有可能隨著數(shù)據(jù)庫的改變或是事務(wù)邏輯的變化而變化,不得不重新實現(xiàn)并發(fā)布一個新的客戶端,也就是說,這樣的應(yīng)用程序模型仍然是比較脆弱的。三層或是更多層應(yīng)用模型的出現(xiàn),解決了這樣的問題。
??? 在三層的應(yīng)用程序模型中,事務(wù)邏輯與用戶界面和數(shù)據(jù)存取明顯的分離出來,將客戶端的用戶界面與服務(wù)器端數(shù)據(jù)存取隔離開來,極大的改善了應(yīng)用程序的可維護(hù)性。
??? 注意,雖然最常用的多層客戶/服務(wù)器模型是三層模型,但是,現(xiàn)在已經(jīng)出現(xiàn)了將事務(wù)邏輯層和數(shù)據(jù)存取層增加的趨勢。這種更多更細(xì)的分層不但提高了系統(tǒng)的維護(hù)性能,同時也增加了系統(tǒng)的重用性和與分布式系統(tǒng)概念融合的可能性。
??? 圖3.8所示為一個典型的三層模型:
圖3.8、三層客戶/服務(wù)器應(yīng)用模型
3.2.3分布式系統(tǒng)
??? 在分層的客戶/服務(wù)器應(yīng)用模型中,下一層為上一層提供服務(wù),上一層調(diào)用下一層提供的服務(wù),這不利于功能的重用。為了最大限度的發(fā)揮系統(tǒng)的功能,分布式系統(tǒng)打破分層系統(tǒng)中對于客戶和服務(wù)器的定義,將應(yīng)用程序的代碼實現(xiàn)分解為遵循某個標(biāo)準(zhǔn)規(guī)范的對象,這些對象中提供的功能被封裝到接口中。在某個具體的服務(wù)邏輯中,一個對象可能充當(dāng)客戶端的功能,它需要調(diào)用另一個對象提供服務(wù);但是,在另一個服務(wù)邏輯中,同一個對象可能為另一個對象提供服務(wù),充當(dāng)服務(wù)器的功能。
??? 常見的分布式對象規(guī)范有COM/DCOM、CORBA、Java RMI等。
??? 分布式系統(tǒng)模型如圖3.9所示。
圖3.9、分布式系統(tǒng)模型
3.2.4基于Web的多層應(yīng)用模型
??? WWW的發(fā)展,使得Internet的應(yīng)用不再局限于提供一些靜態(tài)的內(nèi)容、甚至也不滿足于提供一些簡單的動態(tài)內(nèi)容。傳統(tǒng)以獨立的軟件包形式發(fā)布的一些應(yīng)用程序,正逐漸被搬上Internet,以出租服務(wù)的方式提供給用戶,這就是ASP(Application Service Provider)。由于Web的特點是Internet 上的HTTP,是一種請求應(yīng)答式的無連接的服務(wù)形式,所以這種基于Web的應(yīng)用程序在體系結(jié)構(gòu)上有其獨特的特點。
圖3.10、基于Web的多層應(yīng)用模型
4可維護(hù)與實現(xiàn)
4.1采用靈活與可維護(hù)的設(shè)計模式
當(dāng)您設(shè)計建造不同的應(yīng)用程序時,您時而不時地會碰到相同或者非 常類似的問題域。每次碰到這些問題時您都必須去重新尋找解決方案 。為了節(jié)省時間與精力,如果有一個知識庫,能夠捕獲這樣的具有共 性的問題域與被證明是正確的解決方案,將是非常理想的。 用最簡單的話來說,這樣的通用解決方案就是一個設(shè)計模式。這樣 的知識庫,或者說參考處,包含了這些模式,就是設(shè)計模式目錄。
模式摸板通常包含一個用來描述模式所代表的意義的名字,緊跟著 的是模式的適用范圍、動機(jī)、在實現(xiàn)過程中的問題等等。除了描述問 題與闡明解決方案,模式還解釋在使用本模式的實現(xiàn)過程中可能存在 的問題和后果。使用這樣的模式讓應(yīng)用程序的設(shè)計變得透明。這些模式已經(jīng)被不同 的開發(fā)者在不同的領(lǐng)域內(nèi)成功地使用過,所以,一個模式的優(yōu)點和缺 點(也包括實現(xiàn)過程中的問題)都已經(jīng)事先知道。所有的設(shè)計模式都 是可重復(fù)使用的,并且在特定的場合中適用。這就給了您靈活性。同 J2EE應(yīng)用程序有關(guān)的設(shè)計模式的使用在J2EE平臺技術(shù)方面提供了更多 優(yōu)勢來展示了解決方案。
4.1.1模型-視圖-控制器
如果您所建造的這個應(yīng)用程序只是給單一類型的客戶使用的, 那問題就簡單了。我們可以簡單地將數(shù)據(jù)存取/數(shù)據(jù)修改邏輯與不同的 客戶視圖邏輯混合在一起。但是隨著一個完全互連的無線世界的出現(xiàn), 客戶端的設(shè)備從PDA、蜂窩電話到一個功能強(qiáng)大的桌面系統(tǒng)上的瀏覽器 都有,這還不包括其他的傳統(tǒng)設(shè)備。在這種情況下,將數(shù)據(jù)存取與視 圖混合在一起來作為解決方案,將會有很多問題,這是因為:
§ 您必須開發(fā)這個應(yīng)用程序的不同版本,以便適應(yīng)與支持各種不同 的客戶需要
§ 由于視圖的代碼與數(shù)據(jù)存取/修改的代碼糾纏在一起,重復(fù)的數(shù) 據(jù)存取/修改代碼散步在各處,這就使得應(yīng)用程序幾乎是不可維護(hù)的。
§ 開發(fā)生命周期被不必要地擴(kuò)展了
為了找到這個問題的解決方案,請注意以下幾點:
§ 不論客戶類型如何,被存取與顯示的數(shù)據(jù)必須來自同一個企業(yè)級 的數(shù)據(jù)源。
§ 所有的客戶必須能夠?qū)?shù)據(jù)源進(jìn)行修改。
§ 不論是修改一個客戶類型,還是修改數(shù)據(jù)存取/修改邏輯,都不應(yīng) 該影響到應(yīng)用程序的其他組件。
我們需要開發(fā)出松散耦合的應(yīng)用程序的解決方案。采用模型-視圖-控制器(MVC)結(jié)構(gòu)。MVC已經(jīng)被非常有效地應(yīng)用在GUI類型的 應(yīng)用程序的設(shè)計上。通過在J2EE應(yīng)用程序上采用MVC結(jié)構(gòu),您可以將數(shù)據(jù) 存取邏輯與數(shù)據(jù)表現(xiàn)邏輯分別開來。您也可以建造一個靈活的并且是很 容易擴(kuò)充的控制器來控制應(yīng)用程序的整個流程。下圖展示了MVC結(jié)構(gòu)。
圖4.1
如下所述,MVC結(jié)構(gòu)可以映射到多層的企業(yè)級J2EE應(yīng)用程序:
§ 所有的企業(yè)級數(shù)據(jù)與用于處理數(shù)據(jù)的事物邏輯都能用這個模型來 表示。
§ 視圖可以通過這個模型存取數(shù)據(jù),然后決定如何將數(shù)據(jù)表達(dá)給客 戶。當(dāng)模型改變時,視圖必須確認(rèn)給用戶所表達(dá)的內(nèi)容也跟著改變。
§ 控制器可以與視圖交互,并且將客戶的行為轉(zhuǎn)換為模型可以理解 與執(zhí)行的行為??刂破饕哺鶕?jù)最新的客戶行為與相關(guān)的模型行為來決 定下一個要被顯示的視圖是什么。
將上述的邏輯應(yīng)用到應(yīng)用程序中,您將這樣建造應(yīng)用程序:
§ 應(yīng)用程序的事務(wù)邏輯由組成MVC結(jié)構(gòu)中的模型的EJB來代表。模型 對來自控制器的要求作出反映,并存取/修改相應(yīng)的數(shù)據(jù)。
§ 應(yīng)用程序界面的不同屏組成MVC結(jié)構(gòu)中的視圖。當(dāng)模型改變時,視 圖自動更新。
§ 應(yīng)用程序的控制器是一些對象的集合,這些對象接收用戶的行為, 并且將其轉(zhuǎn)換為模型可理解的請求,一旦模型完成了對請求的處理, 就決定下一個要顯示在屏幕上的內(nèi)容是什么。
4.2要求
這里要實現(xiàn)一個數(shù)據(jù)庫瀏覽器應(yīng)用程序:用于顯示一個關(guān)系數(shù)據(jù)庫,通過它可以查看數(shù)據(jù)庫中的任何表,并顯示經(jīng)過多種不同格式查詢后的結(jié)果。
Web界面的要求是允許用戶瀏覽相關(guān)數(shù)據(jù)庫中的內(nèi)容.該界面使用戶可以通過指定一個JDBC驅(qū)動器或URL來與一個數(shù)據(jù)庫連接。接著,應(yīng)用程序會允許用戶瀏覽數(shù)據(jù)庫中定義的所有表,并且可以選擇任何一個表對其數(shù)據(jù)進(jìn)行處理。同樣,用戶還可以輸入SQL查詢語句并查看這些查詢操作產(chǎn)生的列表數(shù)據(jù)。在用戶使用會話的任何時間內(nèi),必須確保用戶可以很容易地斷開數(shù)據(jù)庫,并連接到另一個數(shù)據(jù)庫上。
用戶可以自己選擇瀏覽數(shù)據(jù)的方式。在開發(fā)第一階段,要求具備以下三個視圖頁面:
1、一個以清晰只讀格式顯示表格內(nèi)容的列表視圖
2、一個允許數(shù)據(jù)被剪切并被拈貼到電子表格或文本文件的CSV(以逗號分開的變量)視圖
3、一個可編輯的視圖,允許對任何一行數(shù)據(jù)加以更新
剛開始時,程序的實用性將比表達(dá)方式更加重要。但是,有一點是最基本的,既程序應(yīng)該在不需要采用大量技術(shù)的情況下,就可以很容易改變JSP外觀。
將來很可能會需要使用其它視圖:一些XML視圖以及一個微軟Excel格式的視圖,后者可以使用戶不必在自己的瀏覽器里瀏覽,而直接下載所需內(nèi)容。每個視圖都必須允許用戶切換到表示相同數(shù)據(jù)的另一視圖中。在選定一個新視圖前,當(dāng)前視圖應(yīng)該是默認(rèn)視圖。
在隨后的開發(fā)過程中,可能還需要使用一個String小應(yīng)用程序來實現(xiàn)快速響應(yīng)功能,應(yīng)此一定不要將數(shù)據(jù)對象與JSP表示聯(lián)系在一起。
在系統(tǒng)開發(fā)第一階段中,無須考慮用戶會話中的個性化信息,在隨后的開發(fā)階段中,還會對這一功能進(jìn)行設(shè)計。
另一項需要考慮的長遠(yuǎn)目標(biāo),是應(yīng)用程序除了要支持關(guān)系數(shù)據(jù)庫外,還應(yīng)支持其他數(shù)據(jù)源。此時,可能需要包括那些使用JNDI來訪問的目錄。
接下來要介紹這些功能。
首次訪問應(yīng)用程序時,將要求用戶提供有關(guān)數(shù)據(jù)庫連接的地址信息,如圖4.2所示。
圖4.2
用戶一旦提交了有效的數(shù)據(jù),系統(tǒng)將要求用戶在瀏覽實際數(shù)據(jù)之前,選擇一個表格或輸入一個SQL查詢語句,如圖4.3所示。
圖4.3
在選擇了響應(yīng)的表格之后,用戶將可以在數(shù)據(jù)的不同視圖之間進(jìn)行切換,并且可以隨時選擇不同的表格或查詢結(jié)果。下面是一個典型的數(shù)據(jù)視圖,其中包含了整個應(yīng)用程序內(nèi)的導(dǎo)航鏈接,如圖4.4所示。
圖4.4
當(dāng)用戶瀏覽完所需的數(shù)據(jù)庫時,可以退出系統(tǒng)。此時,所有打開的資源都將被關(guān)閉,并且產(chǎn)生一個確認(rèn)業(yè)面。
4.3設(shè)計
開發(fā)周期的第一部是,JSP/JAVA程序員將要求商家預(yù)排所有的頁面:與前面顯示的視圖相似,但要更詳細(xì)一些。在進(jìn)行預(yù)排工作中,還應(yīng)確定所需的錯誤處理操作。這樣做,可以使開發(fā)員在項目早期的設(shè)計階段對此有一個大致的概念。例如,實際應(yīng)用程序總是存在風(fēng)險的,開發(fā)程序中功能最為復(fù)雜的部分會有多大難度?性能是否會令人滿意?早期開發(fā)概念模型使開發(fā)員可以在開發(fā)周期的初級階段對這些風(fēng)險加以估量和解決,在交互式的開發(fā)過程中,這是非常重要的一步。
為了更加全面的理解網(wǎng)頁流程,可以使用一個狀態(tài)圖,它是理解和處理網(wǎng)絡(luò)應(yīng)用程序行為的一個有效途徑(注意狀態(tài)圖不同于網(wǎng)絡(luò)流程圖。應(yīng)用程序的狀態(tài)轉(zhuǎn)換不一定與用戶會話的網(wǎng)頁流程相對應(yīng))。下面這個狀態(tài)圖顯示了數(shù)據(jù)庫瀏覽器轉(zhuǎn)換過程中的狀態(tài)的以及各個狀態(tài)間的合法轉(zhuǎn)換,如圖4.5所示。
圖4.5
與程序員同時工作的網(wǎng)絡(luò)設(shè)計員將制作出網(wǎng)頁的HTML模板。一旦網(wǎng)頁流程確定下來并正確實施,這些HTML模板在添加了必要的JSP代碼之后就可以實現(xiàn)動態(tài)功能了。至關(guān)重要的是,最終形成的JSP中應(yīng)盡量少的包含處理邏輯。這樣一來,對數(shù)據(jù)的解釋做進(jìn)一步修改的網(wǎng)頁設(shè)計人員才能夠理解它們。
技術(shù)設(shè)計的第一步重要工作是確認(rèn)應(yīng)用程序?qū)ο?。建立?yīng)用程序時,可能需要一個數(shù)據(jù)源對象,一個或幾個為圖形用戶界面提供這一對象的視圖,以及一些顯示數(shù)據(jù)的JSP。JSP只是中間層用來顯示數(shù)據(jù)的視圖,JSP不能直接訪問系統(tǒng)數(shù)據(jù)對象。
設(shè)計時必須縱向查看應(yīng)用程序結(jié)構(gòu),并決定每個組件應(yīng)屬于哪一層。數(shù)據(jù)源目標(biāo)很明顯屬于企業(yè)源抽象層。除了所需的網(wǎng)頁流程,這應(yīng)用程序中幾乎就沒有什么其他業(yè)務(wù)邏輯了,應(yīng)此,業(yè)務(wù)層中的實現(xiàn)并不重要。然而,這并不是說JSP中擁有大部分應(yīng)用程序業(yè)務(wù)邏輯。非特定用戶界面顯示層的、是必須的。此外,還應(yīng)了解今后可能需要就使用Swing接口,以及一些JSP無法顯示的數(shù)據(jù)視圖(如Excel)。該層不僅要為JSP提供數(shù)據(jù),還要為任何圖形用戶界面提供服務(wù)。它將包含大量系統(tǒng)數(shù)據(jù)模型。
程序會使用views標(biāo)志庫,當(dāng)需要時,可以通過它來使用Swing數(shù)據(jù)模型,該標(biāo)志庫將在隨后介紹。使用這一技術(shù),無須使用大量腳本語言既可生成動態(tài)標(biāo)志,并且確保系統(tǒng)的絕大部分實現(xiàn)代碼可以獨立JSP技術(shù)。
會話bean將保存用戶的個性化信息。它還將保存每位用戶所需數(shù)據(jù)模板的備份。由于會話bean可以保存隨會話狀態(tài)改變而改變的數(shù)據(jù)模板,所以無須對網(wǎng)頁bean做過多的要求(通常,一個網(wǎng)頁bean可以容納每個視圖的模板)。這反映一個事實,既所有應(yīng)用視圖顯示的數(shù)據(jù)結(jié)構(gòu)是相同的,應(yīng)此該結(jié)構(gòu)應(yīng)該屬于應(yīng)用程序,而不是單獨屬于任何一頁。
由于存在添加視圖的可能性,所以使用請求控制器模式可以最大限度地提高編寫程序的靈活性。這意味著當(dāng)需要增加視圖時,JSP中無需在包含網(wǎng)頁流程業(yè)務(wù)邏輯。
與前面介紹請求控制器模式時使用的示例不同,實現(xiàn)本程序時,使用JSP控制器(這樣做,更容易實現(xiàn)和部署應(yīng)用程序)。本程序還使用了一個特殊的action參數(shù)(而不是映射的URL)來為每一請求指定處理程序??刂破鞲鶕?jù)指令參數(shù)值動態(tài)的載入處理程序類別,以確保應(yīng)用程序的功能可以通過增加新的請求處理程序得到擴(kuò)展。
4.4實現(xiàn)
由于表示方式與數(shù)據(jù)源分離,所以可以分別設(shè)計表示方式(JSP和支持類)和數(shù)據(jù)源。
4.4.1表示層-視圖標(biāo)志庫
視圖(view)標(biāo)志庫視圖提供了幾套自定義標(biāo)志,用于顯示存儲在Swing數(shù)據(jù)模型中的數(shù)據(jù)。
其中使用的標(biāo)志有:
〈view:jspTable〉—保存TableModel,以便于子標(biāo)志使用。獲取標(biāo)題打開與關(guān)閉的屬性。
〈views:headingOpen〉—配置TableModel標(biāo)題的打開屬性。
〈views:headingClose〉—配置TableModel標(biāo)題的關(guān)閉屬性。
〈views:headingCell〉重復(fù)處理表格標(biāo)題,并輸出相應(yīng)信息。
〈views:rows〉—重復(fù)處理表格中的所有行。
〈views:rowOpen〉—配置RowsTag的行打開屬性。
〈views:rowClose〉—配置RowsTag的行關(guān)閉屬性。
〈views:cell〉—模擬HeaderTag重復(fù)處理表格中的行。
表示層-ui和ui.requesthandlers軟件包
表示層的核心是請求控制器,controller.jsp。它可以用來創(chuàng)建RequestController會話bean的一個實例,該實例可以實現(xiàn)頁面流程邏輯,并可以推動控制器定義的JSP視圖對請求做出響應(yīng)。是入口點。
4.4.2邏輯
RequestController類將實現(xiàn)應(yīng)用程序的所有網(wǎng)頁流程。
RequestController.java
RequestController本身的任務(wù)是檢查參數(shù),并且調(diào)用適當(dāng)?shù)腞equestController實例來指定所需的JSP視圖,并將這一視圖的URL返回到controller.jsp中。通過在行為參數(shù)值和值類名間建立映射,RequestController可以指定所需的RequestHandler的類型。例如,DBConnect(應(yīng)用程序首先要完成的操作)被映射到一個名為ui.requestthandlers.DBConnect的Java類上,后者必須實現(xiàn)RequestHandler接口。出于效率原因,RequestController類將把實例化后的請求處理器保存到一個散列表中,以便將來可以利用它們來處理同一類型的請求。這樣做可以確保映射機(jī)制的使用不會過多地降低應(yīng)用程序的性能。
如果行為參數(shù)沒有被傳遞到該網(wǎng)頁中將向用戶顯示注冊頁面。
所有請求都屬于RequestController類,該類負(fù)責(zé)實例化系統(tǒng)所需的bean,并根據(jù)需要,使用映射機(jī)制來實例化所需的請求處理器。
RequestController.getNextPage()
getNextPage()方法可以將所有發(fā)往應(yīng)用程序的請求全部發(fā)送出去。該方法將對請求信息進(jìn)行處理,更新會話,并返回最終所得JSP視圖的URL。該方法首先檢查行為參數(shù)中是否包含一個值,如果沒有,將向用戶顯示注冊網(wǎng)頁。否則,該程序?qū)嵗c指令相連的處理器。如果沒有與行為參數(shù)相關(guān)的處理器,將產(chǎn)生一個BrowserException異常。最后,如果在使用CheckSessionBeanIsAavilable()方法后,還是沒有找到于之相連的處理器,那么將創(chuàng)建一個會話bean以結(jié)束操作流程,并返回處理器所選視圖的URL。
RequestController.getHandlerInstance()
正如前面所說的,getHandlerInstance()在散列表中存儲了各類的實例。
RequestController.checkDessionBeanIsAvailable()
CheckSessionBeanIsAvailable()將對用戶會話bean進(jìn)行檢查,并將其返回。如果找不到將創(chuàng)建一個新的bean實例。
RequestHandler接口
RequestHandler接口十分簡單,每個行為類都必須實現(xiàn)該接口。
BrowseSession.java
介紹RequestHandler接口的實現(xiàn)前,首先介紹它們?nèi)绾闻c應(yīng)用程序的JSP視圖通信??梢酝ㄟ^會話bean來實現(xiàn)通信功能,它容納了當(dāng)前的數(shù)據(jù)源和會話信息(任何當(dāng)前表格的選擇,用戶鍵入的SQL查詢歷史,以及當(dāng)前的JSP視圖)。每個JSP視圖都將聲明這個會話bean,但是該會話bean只能在一個地方被實例化,既在RequestController類中。雖然會話bean與表達(dá)方式無關(guān),但是由于它可以顯示JSP視圖使用的模型。
最后幾種方法構(gòu)成該類的isXXX getXXX setXXX方法。其他一些方法則有valueBound() valueUnbound()以及用來實現(xiàn)jspstule.NameValueModel的內(nèi)部類QueryNameValueModel,jspstyle.NameValueModel可用于顯示查詢歷史。
4.4.3應(yīng)用程序預(yù)排
首先返回進(jìn)入應(yīng)用程序的第一頁,注冊網(wǎng)頁。如圖4.6:
圖4.6
本頁是login.html,它包含一個表單,該表單中除了包含驅(qū)動程序名稱,url,登陸名和密碼字段外,還包含一個提供了DBConnect值的隱藏行為字段。RequestContrller類將使用該值將用戶指定到ui.requestthandlers.DBConnect RequestHandler的實現(xiàn)代碼中:
DBConnect.java
DBConnect必須嘗試實例化一個數(shù)據(jù)對象,并且如果成功,將返回另一個字段的url,使用戶可以根據(jù)需要選擇查看的表,或鍵入查詢操作。
如果連接有效,用戶可以看到一個網(wǎng)頁,此時,可以對數(shù)據(jù)庫中的表格進(jìn)行選擇如圖4.7:
圖4.7
chooseTable.jsp
該頁是動態(tài)的,由chooseTable.jsp實現(xiàn)。既然需要從應(yīng)用程序的視圖中選擇一個表,那么可以找出實際所需的表單,然后將它放入一個包含jsp中。
這個包含jsp,_chooseTable.jspf,可以生成表單。它將接收一個boolean變量作為參數(shù),該變量可用于定義表的類型。DBCconnect請求處理器會把來自數(shù)據(jù)源的數(shù)據(jù)添加到會話對象中。
數(shù)據(jù)對象將顯示它們所含表格的NameValueModel,可以使用標(biāo)志來顯示這些數(shù)據(jù)。它是一個主體標(biāo)志,它將根據(jù)內(nèi)容的大小和內(nèi)容模型具有的XML屬性重復(fù)的處理主體標(biāo)志中的內(nèi)容。
會話bean將用于顯示另一個名-值模型,如果支持的SQL會話bean得知數(shù)據(jù)源,它就可以用來包含先前的SOL查詢歷史。一個單獨的表單將被用于該顯示模型,并允許用戶進(jìn)行查詢。
_chooseTable.jspf
ChooseTable.java
ChooseTable隱藏的指令字段將啟動RequestController類,該類將使用ChooseTable請求處理器類處理那些由于提交該表達(dá)而產(chǎn)生的請求。
用戶在選擇了一個表格或鍵入一個SQL查詢語句后,將看到數(shù)據(jù)表形式的默認(rèn)視圖。如圖4.8:
圖4.8
這一網(wǎng)頁由tableview.jsp產(chǎn)生的。這一JSP視圖通過調(diào)用會話bean的getTableModel()方法來查找應(yīng)該顯示在表格中的數(shù)據(jù)。此時,ChooseTable請求處理器將調(diào)用會話bean 的setTableIndex()方法將適當(dāng)?shù)谋砀衲P捅恢糜跁抌ean中。
由于要求每個視圖在用戶選擇修改前保持其默認(rèn)狀態(tài),所以,該JSP視圖會話bean的setTableViewJsp()方法,并使用其Servlet路徑,以確保視圖處于默認(rèn)狀態(tài)。
tableView.jsp
為實現(xiàn)這一網(wǎng)頁,還應(yīng)使用另一網(wǎng)頁,_chooseMode.jspf。它提供了指向其它可選視圖的連接。通過檢查使用它時所在的網(wǎng)頁名稱,就可以排除目前的視圖。
_chooseMode.jspf
CSV視圖
考慮另一個視圖,為了讓用戶可以將數(shù)據(jù)剪切和拈帖數(shù)據(jù)到其它應(yīng)用程序中。如圖4.9所示:
圖4.9
csvView.jsp
該視圖同樣使用了標(biāo)志。
編輯視圖
它允許用戶對表格中的每行數(shù)據(jù)加以更新。工作方法如圖4.10所示:
圖4.10
標(biāo)志再一次生成所需的HTML,雖然代碼更加復(fù)雜??梢韵虮砀衲P头祷氐臄?shù)據(jù)值添加另一標(biāo)題字段(Update values)和列,來測試該表格的靈活性。該表格的每一行都是一個表單,同時請求控制器(Update Table)具有常規(guī)隱藏行為值,此外還需要提供包含用戶希望更新行號碼的隱藏行為值。而另外一列將用于放置每行的提交按鈕。
editable.jsp
還需一個確認(rèn)網(wǎng)頁(updateOK.jsp)一個錯誤處理(systemError.jsp)。
錯誤處理
systemError.jsp圖4.11顯示了更新操作后的錯誤網(wǎng)頁
圖4.11
其他RequestHandlers
現(xiàn)在看看實現(xiàn)其他視圖時所需的RequestHandlers。注意,應(yīng)用程序運行SQL查詢后所得輸出結(jié)果如圖4.12:
該功能由RunQuery請求處理器實現(xiàn)
RunQuery.java
RunQuery需要檢驗兩個參數(shù):query(用戶鍵入新查詢操作后產(chǎn)生的)和oldquery,當(dāng)用戶從查詢輸入文本框右面的下拉框中選中一個
收藏
編號:30550163
類型:共享資源
大小:1.12MB
格式:RAR
上傳時間:2021-10-10
20
積分
- 關(guān) 鍵 詞:
-
jsp
基于
Web
維護(hù)
數(shù)據(jù)庫
瀏覽器
源代碼
論文
答辯
PPT
- 資源描述:
-
jsp基于Web的可維護(hù)的數(shù)據(jù)庫瀏覽器(源代碼+論文+答辯PPT),jsp,基于,Web,維護(hù),數(shù)據(jù)庫,瀏覽器,源代碼,論文,答辯,PPT
展開閱讀全文
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學(xué)習(xí)交流,未經(jīng)上傳用戶書面授權(quán),請勿作他用。