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