數(shù)據(jù)庫系統(tǒng)實驗項目2014-2015上課程_第1頁
數(shù)據(jù)庫系統(tǒng)實驗項目2014-2015上課程_第2頁
數(shù)據(jù)庫系統(tǒng)實驗項目2014-2015上課程_第3頁
數(shù)據(jù)庫系統(tǒng)實驗項目2014-2015上課程_第4頁
數(shù)據(jù)庫系統(tǒng)實驗項目2014-2015上課程_第5頁
已閱讀5頁,還剩184頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Java2EnterpriseEdition

SSH

FrameworkIntegrationAgendaWeb應(yīng)用的發(fā)展1JSP2Struts23Hibernate4Spring5Web應(yīng)用的發(fā)展Html,CGI,ASP,PHP,JSP,MVC,Ajax.

PartⅠPartⅠWeb應(yīng)用的發(fā)展Web應(yīng)用程序即基于網(wǎng)頁的應(yīng)用程序,用戶無需安裝任何專用程序,只用瀏覽器來訪問服務(wù)器,通過瀏覽網(wǎng)頁就可以實現(xiàn)業(yè)務(wù)流程。相對于原來的客戶端/服務(wù)器(C/S)模式,這種新程序開發(fā)模式稱為瀏覽器/服務(wù)器(B/S)模式。Web應(yīng)用的業(yè)務(wù)邏輯完全在應(yīng)用服務(wù)器端實現(xiàn),客戶端只需要瀏覽器即可進(jìn)行業(yè)務(wù)處理,是一種全新的軟件系統(tǒng)構(gòu)造技術(shù),是當(dāng)今應(yīng)用軟件的首選體系結(jié)構(gòu)。1.1從靜態(tài)網(wǎng)頁說起最開始的Web只是一個一個的站點(website),它們由很多靜態(tài)網(wǎng)頁堆積而成,內(nèi)容更新只能通過修改網(wǎng)頁本身來實現(xiàn)。靜態(tài)網(wǎng)頁是指沒有后臺數(shù)據(jù)庫、不含程序、不可交互和不會有任何改變的網(wǎng)頁。靜態(tài)網(wǎng)頁的內(nèi)容變化只能通過重新編輯網(wǎng)頁文件來實現(xiàn)。在程序設(shè)計中一般又把html網(wǎng)頁稱為靜態(tài)網(wǎng)頁。HTML是HypertextMarkupLanguage的縮寫,中文也就是超文本鏈接標(biāo)示語言。HTML文本是由HTML命令組成的描述性文本,HTML命令可以說明文字、圖形、動畫、聲音、表格、鏈接等。1.2動態(tài)網(wǎng)頁的鼻祖CGI隨著互聯(lián)網(wǎng)的發(fā)展越來越多的應(yīng)用程序轉(zhuǎn)移到Web上去,如:查詢數(shù)據(jù)庫、調(diào)用程序處理等。真正的Web應(yīng)用開始出現(xiàn),必須要有動態(tài)網(wǎng)頁才能滿足用戶的需求,最早的動態(tài)網(wǎng)頁是CGI程序。CGI(Commongateintergace)通用網(wǎng)關(guān)接口的簡稱。它是一段部署在服務(wù)器上的程序供同客戶端的頁面來調(diào)用的接口,通俗的講CGI就像是一座橋把網(wǎng)頁和Web服務(wù)器中的執(zhí)行程序連接起來。CGI應(yīng)用程序的工作原理瀏覽器通過HTML表單或超鏈接請求指向一個CGI應(yīng)用程序的URL。服務(wù)器收到請求。服務(wù)器執(zhí)行所指定CGI應(yīng)用程序。CGI應(yīng)用程序執(zhí)行所需要的操作,通常是基于瀏覽者輸人的內(nèi)容。CGI應(yīng)用程序把結(jié)果格式化為網(wǎng)絡(luò)服務(wù)器和瀏覽器能夠理解的文檔(通常是HTML網(wǎng)頁)。網(wǎng)絡(luò)服務(wù)器把結(jié)果返回到瀏覽器中。CGI編寫語言CGI可以用任何一種語言編寫,只要這種語言具有標(biāo)準(zhǔn)輸入、輸出和環(huán)境變量。UNIX環(huán)境中:Perl(PracticalExtractionandReportLanguage)BourneShell或者Tcl(ToolCommandLanguage)PHP(HypertextPreprocessor)

Windows環(huán)境中:C和C++Perl由于其跨操作系統(tǒng)、易于修改的特性成為了CGI的主流編寫語言,以至于一般的“cgi程序”就是Perl程序。1.3三足鼎立雖然CGI可以實現(xiàn)動態(tài)網(wǎng)頁,但它還是基于傳統(tǒng)的編程方式,尤其是不適合網(wǎng)頁輸出。網(wǎng)頁的輸出需要用大量的print語句來實現(xiàn),開發(fā)者幾乎無法從程序中看出最后輸出的網(wǎng)頁的是什么樣,更無法使用網(wǎng)頁編輯工具,程序設(shè)計人員與網(wǎng)頁開發(fā)人員無法分工協(xié)助。于是替代CGI專為開發(fā)動態(tài)網(wǎng)頁的語言出現(xiàn)了,目前最熱門的有3種:ASP、JSP和PHP。它們占據(jù)了Web應(yīng)用的絕大部分市場,而且各有優(yōu)勢成了三足鼎立之勢。1.3.1系出名門ASP和ASP(ActiveServerPage)是微軟公司開發(fā)的代替CGI腳本程序的一種應(yīng)用。ASP是在服務(wù)器端運(yùn)行的,可以用來創(chuàng)建和運(yùn)行動態(tài)網(wǎng)頁或Web應(yīng)用程序。ASP網(wǎng)頁可以包含HTML標(biāo)記、普通文本、腳本命令以及COM組件等。利用ASP可以向網(wǎng)頁中添加交互式內(nèi)容(如在線表單),也可以創(chuàng)建使用HTML網(wǎng)頁作為用戶界面的Web應(yīng)用程序。ASP在外表上看起來仍然是一個HTML文件,只是在需要變化的部分加入的了一些ASP特有的腳本,這些腳本又稱為ASPBean。ASP-工作原理

用戶向瀏覽器地址欄輸入網(wǎng)址,默認(rèn)頁面的擴(kuò)展名是.asp。瀏覽器向服務(wù)器發(fā)出請求。服務(wù)器引擎開始運(yùn)行ASP程序。ASP文件按照從上到下的順序開始處理,執(zhí)行腳本命令,執(zhí)行HTML頁面內(nèi)容。頁面信息發(fā)送到瀏覽器。1.3.2草根中走出的巨人PHPPHP是:HypertextPreprocessor(超級文本預(yù)處理語言)的縮寫。PHP是一種開放源代碼的腳本編程語言,與ASP和JSP一樣都是一種在服務(wù)器端執(zhí)行的嵌入HTML文檔的腳本語言,也需要在容器中運(yùn)行。PHP獨特的語法混合了C、Java、Perl以及PHP自創(chuàng)新的語法。PHP具有非常強(qiáng)大的功能,所有的CGI或者JavaScript的功能PHP都能實現(xiàn),而且支持幾乎所有流行的數(shù)據(jù)庫以及操作系統(tǒng)。PHP成功的兩大秘訣,第一條就是簡單,為編程者提供最大的便利。第2條就是“Community(強(qiáng)大的社區(qū))”,眾多的個人參與者對PHP的發(fā)展提供了非常大的幫助,所以PHP被戲稱為草根語言。PHP的最新版本也具備了面向?qū)ο笳Z言的特性。1.3.3來自Java陣營JSP和J2EEJSP(JavaServerPage)是由Sun公司倡導(dǎo)、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)有點類似ASP技術(shù),它是在傳統(tǒng)的HTML文件中插入Java程序段(Scriptlet)和JSP標(biāo)簽(tag),從而形成JSP文件,文件擴(kuò)展名就是.jsp。JSP技術(shù)使用Java編程語言編寫類、標(biāo)簽和Scriptlets,來封裝產(chǎn)生動態(tài)網(wǎng)頁的處理邏輯,可以說JSP的跨平臺能力是與生俱來的。JSP也需要自己的運(yùn)行環(huán)境,稱為JSP服務(wù)器或者JSP容器,目前流行的JSP服務(wù)器有開源項目ApacheTomcat、JBoss和廠商提供產(chǎn)品的weblogic、webshpere等。1.4模型-視圖-控制器(MVC)設(shè)計模式是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。MVC正是這樣的一個設(shè)計模式,它強(qiáng)制性的使應(yīng)用程序的輸入、處理和輸出分開。在Web應(yīng)用中MVC模式被極為廣泛的采用,幾乎所有的設(shè)計人員都或多或少的要遵循或者參考MVC模式。1.4.1MVC簡介MVC本來是存在于桌面應(yīng)用程序中,M(model)是指數(shù)據(jù)模型,V(View)是指用戶界面,C(Control)則是控制器。使用MVC的目的是將M和V的實現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式。后來MVC被借用到Web應(yīng)用開發(fā)中去,發(fā)現(xiàn)更能發(fā)揮它的威力,最后被Sun公司推薦為J2EE平臺的一個經(jīng)典模式。模型、視圖與控制器的分離,使得一個模型可以具有多個顯示視圖。如果用戶通過某個視圖的控制器改變了模型的數(shù)據(jù),所有其它依賴于這些數(shù)據(jù)的視圖都應(yīng)反映到這些變化。因此,無論何時發(fā)生了何種數(shù)據(jù)變化,控制器都會將變化通知所有的視圖,導(dǎo)致顯示的更新。這實際上是一種模型的變化-傳播機(jī)制。1.4.2MVC的組成部分視圖(View)代表用戶交互界面,對于Web應(yīng)用來說就是HTML界面。隨著應(yīng)用的復(fù)雜性和規(guī)模性,界面的處理也變得具有挑戰(zhàn)性。一個應(yīng)用可能有很多不同的視圖,MVC設(shè)計模式對于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,以及用戶的請求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。模型(Model)就是業(yè)務(wù)流程/狀態(tài)的處理以及業(yè)務(wù)規(guī)則的制定。控制(Controller)可以理解為一個分發(fā)器,他來決定選擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請求,控制層并不做任何的數(shù)據(jù)處理。1.4.3MVC帶來的好處大部分Web應(yīng)用程序是用ASP,PHP或者JSP開發(fā)出來。它們將像數(shù)據(jù)庫查詢語句這樣的程序代碼和像HTML這樣的表示層代碼混在一起。經(jīng)驗比較豐富的開發(fā)者會將數(shù)據(jù)從表示層分離開來,但這通常比較困難,尤其是維護(hù)他人編寫的已有代碼。MVC從根本上強(qiáng)制性的將它們分開,最大程度上實現(xiàn)了程序代碼與網(wǎng)頁的分離。多個視圖能共享一個模型,現(xiàn)在需要用越來越多的方式來訪問應(yīng)用程序。對此,其中一個解決之道是使用MVC,無論你的用戶想要Flash界面或是WAP界面,用一個模型就能處理它們。由于數(shù)據(jù)和業(yè)務(wù)規(guī)則從表示層分開,所以可以最大化的重用代碼。1.5Ajax的興起J2EE和.NET等框架使服務(wù)器端的設(shè)計和開發(fā)有了很大的發(fā)展,而用戶界面的改善卻一直比較滯后,總是一個網(wǎng)頁轉(zhuǎn)向另一個網(wǎng)頁,強(qiáng)制用戶進(jìn)入提交、等待、重新顯示的范例,用戶的動作總是與服務(wù)器的“思考時間”同步。Ajax的出現(xiàn)極大的豐富了用戶體驗,出現(xiàn)時間不長其影響卻非常之大。這里不得不提到Google,Google是Ajax的推廣者也是實踐者,他的產(chǎn)品中大量使用了Ajax,同時也提供了很好的Ajax的開發(fā)包。1.5.1什么是AjaxAjax不是一種新技術(shù),實際上它由幾種蓬勃發(fā)展的技術(shù)以新的強(qiáng)大方式組合而成。Ajax包含:基于XHTML和CSS標(biāo)準(zhǔn)的表示;使用DocumentObjectModel進(jìn)行動態(tài)顯示和交互;使用XML和XSLT進(jìn)行數(shù)據(jù)交換與處理;使用XMLHttpRequest與服務(wù)器進(jìn)行異步通信;使用JavaScript綁定一切;Ajax是由JesseJamesGarrett創(chuàng)造的,稱它為“AsynchronousJavaScript+XML(異步JavaScript和XML)的簡寫”。1.5.2Ajax的工作原理Ajax的核心是JavaScript對象XmlHttpRequest。該對象在InternetExplorer5中首次引入,它是一種支持異步請求的技術(shù)。異步交互意味著在發(fā)送請求之后瀏覽器可以繼續(xù)處理頁面中的事件。數(shù)據(jù)在后臺進(jìn)行傳遞,并且可以自動裝入到頁面中,無需進(jìn)行頁面刷新。簡而言之,XmlHttpRequest使您可以使用JavaScript向服務(wù)器提出請求并處理響應(yīng),而不阻塞用戶。Ajax常用的框架是:DWR,Ext,jQuery,MooTools,Prototype,Scriptaculous1.5.3Ajax的優(yōu)勢所在Ajax引擎讀取信息,并且互動地重寫網(wǎng)頁,這使網(wǎng)頁能無縫化更新,也就是在頁面已經(jīng)下載完畢后改變頁面內(nèi)容,這不僅僅是網(wǎng)頁內(nèi)部的互動還可以從外部獲取數(shù)據(jù)。在以前只能有用戶來輸入數(shù)據(jù)提交并刷新網(wǎng)頁,但現(xiàn)在使用XMLHTTPRequest可以不重載頁面的情況下讀寫服務(wù)器上的數(shù)據(jù),使用戶的輸入達(dá)到最少。基于XML的網(wǎng)絡(luò)通訊也并不是新事物,與FLASH和JAVAApplet相比,Ajax并且不需要插件或下載小程序,不打破沙箱原則,對用戶更安全。JSP工作原理,Web.xml,基本語法,編譯指令,

動作標(biāo)簽,內(nèi)置對象,Servlet,Filter,Listener.

PartⅡPartⅡ?qū)W習(xí)JSPJSP完全以Java語言開發(fā),是純Java的應(yīng)用。JSP經(jīng)服務(wù)器轉(zhuǎn)換后與一般的Java類完全相同,而這一特性也使JSP具有了Java所具備的所有優(yōu)勢,如面向?qū)ο?、簡單性、跨平臺等等。J2EE提供了良好的框架和指南,在此標(biāo)準(zhǔn)中開發(fā)程序?qū)哟胃忧宄_發(fā)更有效率,產(chǎn)品的可用性、可移植性更好。JSP的工作原理JSP服務(wù)器管理JSP頁面有兩個階段:轉(zhuǎn)換階段(translationphase)和執(zhí)行階段(executionphase)。當(dāng)一個客戶發(fā)送請求時,JSP服務(wù)器檢驗JSP頁面的語法是否正確,將JSP頁面轉(zhuǎn)換為Servlet(Servlet就是用Java語言實現(xiàn)的CGI程序)源文件,然后調(diào)用javac工具類編譯Servlet源文件生成class文件,這一階段是轉(zhuǎn)換階段。JSP目錄結(jié)構(gòu)在Tomcat上發(fā)布Web應(yīng)用之前,首先要了解Tomcat的目錄結(jié)構(gòu),Tomcat6.0與以前的版本相比較對目錄結(jié)構(gòu)做了很大改動,合并和簡化了一些目錄,現(xiàn)在的結(jié)構(gòu)簡單而且清晰。解讀web.xmlJavaWeb應(yīng)用通過一個基于XML的發(fā)布描述符文件來配置其發(fā)布信息,這個文件名為web.xml,它存放于WEB-INF子目錄下。在web.xml文件中可主要包含如下配置信息:(1)Servlet的定義。(2)Servlet的初始化參數(shù)。(3)Servlet以及JSP的映射。(4)Filter的定義。(5)安全域配置參數(shù)。(6)e文件清單。(7)資源引用。(8)環(huán)境變量的定義。JSP基本的語法JSP網(wǎng)頁主要分為腳本與網(wǎng)頁數(shù)據(jù)兩部分。網(wǎng)頁數(shù)據(jù)就是JSP服務(wù)器不處理的部分,例如:HTML的內(nèi)容,會直接送到客戶端端執(zhí)行。腳本必須經(jīng)由JSP服務(wù)器處理的部分,而大部分腳本都以XML作為語法基礎(chǔ),并且大小寫必須要一致。腳本有4種類型:編譯指令、JSP腳本、動作標(biāo)簽和表達(dá)式語言(ExpressionLanguage),其中表達(dá)式語言又簡稱為EL是JSP2.0新增的功能。編譯指令和動作標(biāo)簽編譯指令主要用來提供整個JSP網(wǎng)頁相關(guān)的信息,并且用來設(shè)定JSP網(wǎng)頁的相關(guān)屬性,例如:網(wǎng)頁的編碼方式、語法、信息等。起始符號為“<%@”,終止符號為“%>”中間部分就是一些指令和一連串的屬性設(shè)定。JSP有3編譯指令:page、include和taglib。動作標(biāo)簽又稱為動作元素、動作指令,也可以理解為JSP自帶的標(biāo)準(zhǔn)標(biāo)簽庫。動作標(biāo)簽利用XML語法格式的標(biāo)記來控制JSP服務(wù)器的行為。利用動作標(biāo)簽可以動態(tài)地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼。起始符號為<jsp:xxx>,終止符號為</jsp:xxx>。JSP的內(nèi)置對象內(nèi)置對象也稱內(nèi)建對象、隱含對象,是不需要聲明,直接可以在JSP中使用的Java對象。JSP基于Java語言,面向?qū)ο笠彩撬囊淮筇厣?。JSP的內(nèi)置對象就是把最常用最重要的幾個對象直接創(chuàng)建然后內(nèi)置了,用戶無需再顯示的用代碼聲明,用好JSP內(nèi)置對象是JSP編程的精髓。JSP有以下九個內(nèi)置對象:request、response、out、pageContext、session、application、config、page、exception。JSP的內(nèi)置對象pageContext是javax.servlet.jsp.PageContext的實例,該對象代表該JSP頁面上下文,使用該對象可以訪問頁面中的共享數(shù)據(jù)。request是最常用的內(nèi)置對象。request對象包含所有請求的信息,如請求的來源、標(biāo)頭、cookies和請求相關(guān)的參數(shù)值等。response表示HttpServletResponse對象,并提供了幾個用于設(shè)置送回瀏覽器的響應(yīng)的方法。session可以存貯用戶的狀態(tài)信息。session在第一個JSP頁面被裝載時自動創(chuàng)建,完成會話期管理。從一個客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個服務(wù)器結(jié)束,被稱為一個會話。JSP的內(nèi)置對象服務(wù)器啟動后就產(chǎn)生了這個application對象,當(dāng)客戶再所訪問的網(wǎng)站的各個頁面之間瀏覽時,這個application對象都是同一個。JSP4個內(nèi)置對象的范圍(scope),分別為

pageContext<request<session<application 都具有方法setAttribute()和getAttribute()。JSP的內(nèi)置對象page是java.lang.Object的實例,表示從該頁面產(chǎn)生的一個Servlet實例,相當(dāng)于這個JSP產(chǎn)生的Servlet類的this,可以通過page對象訪問實例的屬性和函數(shù)。在JSP頁面中,很少使用page對象。out對象是javax.jsp.JspWriter的一個實例,是一個輸出流,用來向客戶端輸出數(shù)據(jù)。config表示一個javax.servlet.ServletConfig對象。該對象用于存取Servlet實例的初始化參數(shù)。Exception對象用作處理JSP文件執(zhí)行時發(fā)生的錯誤和異常只有在錯誤頁面里才可以使用,前提是:在頁面指令里要有isErrorPage=true的頁面中。ServletServlet所提供的功能就是一個Java版本的CGI。JavaServletAPI定義了Servlet和服務(wù)器之間的標(biāo)準(zhǔn)接口,這使得Servlet具有跨服務(wù)器平臺的特性。Servlet通過創(chuàng)建一個框架擴(kuò)展服務(wù)器的能力,采用請求-響應(yīng)模式提供Web服務(wù)。當(dāng)客戶機(jī)發(fā)送請求至服務(wù)器時,服務(wù)器將請求信息發(fā)送給Servlet,Servlet生成響應(yīng)內(nèi)容并將其傳給Server服務(wù)器,然后再由Server服務(wù)器將響應(yīng)返回給客戶端。過濾器(Filter)一個過濾器是一個可以傳送請求或修改響應(yīng)的對象。過濾器并不是Servlet,他們并不實際創(chuàng)建一個請求。他們是請求到達(dá)一個Servlet前的預(yù)處理程序,在響應(yīng)離開Servlet后的后處理程序。就像你將在后面的例子中看到的,一個過濾器能夠做如下工作。(1)在一個Servlet被調(diào)用前截獲該調(diào)用。(2)在一個Servlet被調(diào)用前檢查請求。(3)修改在實際請求中提供了可定制請求對象的請求頭和請求數(shù)據(jù)。(4)修改在實際響應(yīng)中提供了可定制響應(yīng)對象的響應(yīng)頭和響應(yīng)數(shù)據(jù)。(5)在一個Servlet被調(diào)用之后截獲該調(diào)用。監(jiān)聽器(Listener)監(jiān)聽器可以監(jiān)聽客戶端的請求、服務(wù)端的操作等。通過監(jiān)聽器,可以自動激發(fā)一些操作,如監(jiān)聽在線用戶數(shù)量,當(dāng)增加一個HttpSession時,給在線人數(shù)加1。監(jiān)聽器還有一個好處是可以在不修改現(xiàn)有系統(tǒng)基礎(chǔ)上,增加Web應(yīng)用程序生命周期事件的跟蹤。編寫監(jiān)聽器需要實現(xiàn)相應(yīng)的接口,常用的監(jiān)聽接口:(1)ServletContextAttributeListener(2)ServletContextListener(3)HttpSessionListener(4)HttpSessionAttributeListenerStruts2體系結(jié)構(gòu),Action,Result,Interceptors,Tags,EL,OGNL,Theme,View,國際化.

PartⅢPartⅢStruts2Struts這個名字來源于在建筑和舊式飛機(jī)中使用的支持金屬架,顧名思義它提供了一個基本框架和眾多組件。它是Apache基金會的一個開源項目,采用MVC模式,能夠很好地幫助Java開發(fā)者利用J2EE開發(fā)Web應(yīng)用。Struts主要采用Servlet和JSP技術(shù)來實現(xiàn),把Servlet、JSP、自定義標(biāo)簽和信息資源(messageresources)整合到一個統(tǒng)一的框架中。而新的MVC框架WebWork是由OpenSymphony組織開發(fā)的,也是致力于組件化和代碼重用的J2EEWeb框架,后來Struts與WebWork兩合并,稱為Sturts2??蚣艿囊饬x框架可以極大地提高開發(fā)效率,RickardOberg(WebWork創(chuàng)造者和JBoss創(chuàng)始人之一)曾經(jīng)說過:框架的強(qiáng)大之處不是源自它能讓你做什么,而是它不能讓你做什么。Rickard所說的話解釋了什么是框架:框架使混亂的東西變得結(jié)構(gòu)化。Web應(yīng)用程序框架鼓勵開發(fā)人員使用一系列框架所提供的基礎(chǔ)類和類庫,從而避免雜亂的JSP所造成的混亂。這句話對初學(xué)者更有意義,框架能保證開發(fā)和設(shè)計不會偏離正確的方向。Struts2配置Struts2的配置非常簡單,在web.xml中配置Struts2提供的過濾器并把所有的請求(/*)映射到這個過濾器。<web-app> <filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2. dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>Struts2體系結(jié)構(gòu)Struts2工作流程客戶端提起一個(HttpServletRequest)請求,即在瀏覽器中輸入。請求被提交到一系列(三層)過濾器,ActionContextCleanUp、其他過濾器(SiteMesh等)、FilterDispatcher。FilterDispatcher是控制器核心,即MVC中的C,F(xiàn)ilterDispatcher詢問ActionMapper是否需要調(diào)用某個Action來處理(request)請求,如果是,則FilterDispatcher把請求的處理交給ActionProxy。ActionProxy通過ConfigurationManager(struts.xml)找到需要調(diào)用的Action類.ActionProxy創(chuàng)建一個ActionInvocation的實例,同時ActionInvocation通過代理模式調(diào)用Action。但在調(diào)用之前ActionInvocation會根據(jù)配置加載Action相關(guān)的所有Interceptor。一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果。示例程序——login.jsp(1)<%@pagelanguage=“java”contentType=“text/html;charset=UTF-8”%>

<%@taglibprefix=“s”uri=“/struts-tags”%>

<html>

<head><title><s:textname=“l(fā)ogin.jsp.title”></s:text></title></head>

<body>

<s:formaction=“l(fā)ogin”>

<tablealign=“center”>

<tr>

<td><s:textfieldname=“username”key=“l(fā)ogin.jsp.username”/></td>

<td></td>

</tr>

<tr>

<td><s:passwordname="password"key="login.jsp.password“/></td>

<td></td>

</tr>

<tr>

<td><s:submitkey="login.jsp.login"></s:submit>

</td>

<td><s:resetkey="login.jsp.reset"></s:reset></td>

</tr>

</table></s:form></body></html>示例程序——LoginAction(2)

packagecom.annlee.login.action;importcom.annlee.constant.StrutsConstant;

importcom.opensymphony.xwork2.ActionContext;

importcom.opensymphony.xwork2.ActionSupport;publicclassLoginActionextendsActionSupport

{

privateStringusername;

privateStringpassword;

publicStringgetUsername()

{

returnusername;

}

publicvoidsetUsername(Stringusername)

{

this.username=username;

}

publicStringgetPassword()

{

returnpassword;

}

publicvoidsetPassword(Stringpassword)

{

this.password=password;

}publicStringexecute()throwsException

{

if(getUsername().equals("aaa")

&&getPassword().equals("fff"))

{

ActionContext.getContext().getSession().put("user",getUsername());

returnStrutsConstant.STRING_SUCCESS;

}

else

{

returnStrutsConstant.STRING_ERROR;

}

}}示例程序——web.xml(3)

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appversion="2.4"xmlns=""

xmlns:xsi=""

xsi:schemaLocation="/web-app_2_4.xsd"><!--Struts定義Struts2的FilterDispathcer的Filter-->

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter><!--FilterDispatcher用來初始化struts2并且處理所有的WEB請求-->

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping></web-app>示例程序——struts.xml(4)

<?xmlversion="1.0"encoding="GBK"?>

<!DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"">

<struts>

<packagename="lee"extends="struts-default">

<actionname="login"class="com.annlee.login.action.LoginAction">

<resultname="input">/login.jsp</result>

<resultname="error">/error.jsp</result>

<resultname="success">/mainpage.jsp</result>

</action>

</package>

</struts>示例程序——perties(5)struts.custom.i18n.resources=resource.messageResourceLoginAction-validation.xml(6)<?xmlversion="1.0"encoding="GBK"?>

<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"

""><validators>

<fieldname="username">

<field-validatortype="requiredstring">

<messagekey="login.jsp.username.required"/>

</field-validator>

</field>

<fieldname="password">

<field-validatortype="requiredstring">

<messagekey="login.jsp.password.required"/>

</field-validator>

</field>

</validators>3.1ActionAction是Struts2編程的核心部分,在MVC模式中擔(dān)任控制部分的角色,在Struts2中使用的最多。ActionSupport是一個讓action類能夠更好工作的基類,包含了action能夠提供的許多可選服務(wù)的默認(rèn)實現(xiàn),讓開發(fā)者更容易地開發(fā)自己的action類。用ActionContext與Web容器發(fā)生聯(lián)系在Action的接口定義中,excute()方法并沒有HttpServletRequest和HttpServletResponse參數(shù),也就是說Struts2的Action不用去依賴于任何Web容器。但在Web應(yīng)用程序開發(fā)中,往往需要在Action里直接獲取請求(Request)或會話(Session)的一些信息。Struts2提供了ActionContext對象,與Web容器發(fā)生聯(lián)系。ActionContext是Action執(zhí)行時的上下文,可以把它看作是一個Map,存放的是Action在執(zhí)行時需要的對象,如參數(shù)(Parameter)、會話(Session)、Servlet上下文、本地化(Locale)信息等。在每次執(zhí)行Action之前都會創(chuàng)建新的ActionContext,也就是說在同一個線程里ActionContext里的屬性是唯一的,這樣的Action就可以在多線程中使用。Action驅(qū)動模式Struts2中,提供了兩種Action驅(qū)動模式:Property-Driven(屬性驅(qū)動)和Model-Driven(模型驅(qū)動)。模型驅(qū)動的Action很像Struts1中的FormBean,在傳遞過程中有一個單獨的值對象來作為參數(shù)的載體,但在Struts2中這個值對象不必再繼承任何接口,只要普通JavaBean就可以充當(dāng)模型部分。Property-Driven就是Action將直接用自己的字段來充當(dāng)FormBean的功能,如:在Action中直接包含了username屬性和它set、get方法。它一般用在頁面表單比較簡單的情況使用,而且可以直接把屬性作為Action的字段。3.2Result類型Result是在Action執(zhí)行完,一個結(jié)果返回后決定發(fā)生什么事的類。開發(fā)者可以根據(jù)他們的應(yīng)用和環(huán)境的需要創(chuàng)建自己的Result類型。所有Result都實現(xiàn)了com.opensymphony.xwork.Result接口,它是所有action執(zhí)行結(jié)果的通用接口。在struts-default.xml中定義了系統(tǒng)提供的缺省Result類型,并把它們映射為action配置中可以引用的名字。頁面跳轉(zhuǎn)ResultDispatcherResult是最常用的一種result,也是Struts2默認(rèn)的result,稱為通用result。action執(zhí)行完后,請求會導(dǎo)向?qū)?yīng)的View,相當(dāng)于<jsp:forword>標(biāo)簽實現(xiàn)的跳轉(zhuǎn)功能。示例:<resultname="success"type="dispatcher"> <paramname="location">foo.jsp</param></result>RedirectResult與DispatcherResult作用類似,也是實現(xiàn)頁面跳轉(zhuǎn)。對上次的響應(yīng)將重定向到指定的位置,可以理解為在客戶端跳轉(zhuǎn)用戶又重新請求了一個新的URL。Redirect是重新產(chǎn)生一個新的request,因此原來request保存的東西將不再有效。創(chuàng)建action鏈ChainResult是一種result類型,它基于自己的攔截器stack(堆棧)和result調(diào)用一個action,這樣允許一個action附帶著原來的狀態(tài)將請求轉(zhuǎn)到目標(biāo)action。Struts2提供把多個Action按照預(yù)先定義好的順序或者流程鏈接起來的能力。這個特性通過給指定的Action設(shè)置一個ChainResult,然后通過一個ChainingInterceptor攔截目標(biāo)Action來實現(xiàn)。3.3攔截器(Interceptors)攔截器是Struts2的一個強(qiáng)有力工具,有許多功能都是構(gòu)建于它之上,如國際化、轉(zhuǎn)換器,校驗等。Interceptor是Struts2的一大特色,在執(zhí)行action之前和之后可以使請求通過一個或多個Interceptor。多個攔截器組合在一起實現(xiàn)某一個功能稱為interceptor鏈(在Struts2中稱為攔截器棧InterceptorStack)。interceptor鏈就是將interceptor按一定的順序聯(lián)結(jié)成一條鏈。在訪問被攔截的方法或字段時,interceptor鏈中的interceptor就會按其之前定義的順序被調(diào)用。Interceptor的原理Struts2的interceptor實現(xiàn)相對簡單。當(dāng)請求到達(dá)Struts2的ServletDispatcher時,Struts2會查找配置文件,并根據(jù)其配置實例化相應(yīng)的interceptor對象,然后串成一個列表(list),最后一個一個地調(diào)用列表中的攔截器。3.4Struts2TagsStruts2的標(biāo)簽庫與先取版本有很大進(jìn)步,不再僅依賴于JSP標(biāo)簽,還包括FreeMarker和Velocity。標(biāo)簽可以分為兩類:通用標(biāo)簽和UI標(biāo)簽(也可稱為HTML標(biāo)簽)。在使用的時候與使用JSP自定義標(biāo)簽相同第一步就是要導(dǎo)入標(biāo)簽庫,Struts2的引用方法簡單如下:<%@taglibprefix="s"uri="/struts-tags"%>標(biāo)簽語法Struts2的標(biāo)簽語法非常容易理解,所有的屬性最初都是被設(shè)置為字符串的,然后它們會解析%{}語法,任何大括號之間的內(nèi)容都會基于valuestack求值。注意3個規(guī)范:(1)所有String類型屬性的都會解析%{}中間的字符。(2)所有非字符串類型屬性都不會解析,但是會直接被當(dāng)作一個OGNL表達(dá)式求值。(3)對第二個規(guī)則的例外情況是如果非字符串屬性以“%{”開始并以“}”結(jié)束,這些字符在對表達(dá)式求值之前會被截取出來。HTML標(biāo)簽HTML標(biāo)簽不過多提供控制結(jié)構(gòu)或邏輯,而是著重于如何使用action類、valuestack或者DataTags中的數(shù)據(jù),并且在HTML的中呈現(xiàn)出來。如果說普通標(biāo)簽只是簡單的輸出結(jié)果的話,HTML標(biāo)簽的輸出則是因模板(template)而異,它們常常組合在一個作為一個主題(theme),做實際的渲染輸出html的工作。模板(templates)和主題(theme)Struts提供的Html標(biāo)簽的核心是主題和模板。首先明確一下3個概念:(1)Tag(標(biāo)簽):小段代碼,在JSP、FreeMarker或者Velocity里執(zhí)行。(2)Template(模板):一個文件,通常使用JSP或者FreeMarker編寫,能被特定的標(biāo)簽(HTMLtags)輸出。(3)Theme(主題):一系列templates打包在一起,提供通用的功能。模板裝載Struts2的模板缺省情況下總是FreeMarker模板(在以前的webwork中是Velocity),標(biāo)簽?zāi)0逖b載方式:首先搜索web應(yīng)用程序然后搜索classpath。這和其他FreeMarker文件的加載方式一樣,例如在result中可以配置使用FreeMarker所為結(jié)果頁面。模板是基于主題和模板目錄來裝載的。模板目錄使用struts.ui.templateDir屬性,在perties里來定義(缺省是_template_).這意味著,如果一個標(biāo)簽使用了ajax主題,下面的兩個位置將會被搜索(按照順序):(1)在web應(yīng)用中:/template/ajax/template.ftl。(2)在classpath里:/template/ajax/template.ftl。選擇主題(theme)主題可以使用不同的規(guī)則來選擇,按照下面的順序:(1)特定標(biāo)簽上的主題屬性。如:<s:textfieldlabel="%{getText("state.label")}"name="state"theme=”sample”/>(2)一個標(biāo)簽外圍的Form標(biāo)簽的主題屬性??梢院唵蔚馗淖僨orm的theme屬性來覆蓋整個表單的主題設(shè)置。這可以輕松地在幾個選擇的地方使用ajax主題。(3)page會話范圍內(nèi)的以theme為名稱的屬性。選擇主題(theme)(4)request會話范圍內(nèi)的命名為theme的屬性??梢曰谟脩舻膔equest來改變主題。如果根據(jù)請求的不同而改變結(jié)果頁面的風(fēng)格,這可能很有用。(5)session會話范圍內(nèi)的命名為theme的屬性??梢曰谟脩舻膕ession來改變theme。如果需要用戶能個性化他們的界面感觀時,每個用戶可以自定義自己的風(fēng)格,這可能很有用。(6)application會話范圍內(nèi)的命名為theme的屬性。(7)perties內(nèi)的struts.ui.theme屬性(缺省是xhtml)。如果想要改變整個應(yīng)用的主題,調(diào)整perties。Struts2自帶主題Struts2自帶了4中主題,可以根據(jù)需要來選擇不同的主題,甚至的同一個網(wǎng)頁中使用多個主題。1.simple主題2.xhtml主題3.css_xhtml主題4.Ajax主題3.5EL簡介EL全名為ExpressionLanguage,它原本是JSTL為方便存取數(shù)據(jù)所自定義的語言。開始EL只能在JSTL標(biāo)簽中使用,到了JSP2.0之后,EL已經(jīng)正式納入成為標(biāo)準(zhǔn)規(guī)范之一。因此,只要是支持Servlet2.4/JSP2.0的Container,就都可以在JSP頁面中直接使用EL了。使用方法如:<p>Hi!${username}</p>3.6OGNL概述OGNL就是ObjectGraphNavigationLanguage的縮寫(對象圖形導(dǎo)航語言)。可以從http:獲取OGNL的完整文檔。Struts2使用標(biāo)準(zhǔn)的上下文命名來進(jìn)行OGNL表達(dá)式求值。OGNL有一個根對象的概念(在Struts2中,它就是ValueStack)。順著根對象,其他對象被放置在contextmap中(作為上下文引用),包括session、application、request、attr這些map。這些對象與根對象無關(guān),它們只是存在于contextmap的一邊(保存在contextmap中)。所以,訪問這些對象時需要使用#來告訴OGNL不要在根對象中尋找,而是在其他的上下文中進(jìn)行尋找.3.7整合各種View技術(shù)Velocity、Freemarker、JasperReports、xslt這4種result都是為了整合不同的視圖技術(shù)而設(shè)計的。1.Velocity是一個基于java的模板引擎(templateengine)。2.Freemarker也是一個模板引擎,允許JavaServlet保持圖形設(shè)計同應(yīng)用程序邏輯的分離,這是通過在模板中密封HTML完成的。模板用servlet提供的數(shù)據(jù)動態(tài)地生成HTML。3.JasperReports是一個基于Java的開源報表工具,它可以在Java環(huán)境下像其他IDE報表工具一樣來制作報表。4.XSLTResult用XSLT來轉(zhuǎn)換action對象到XML。在Struts中使用FreeMarkerFreeMarker是一個Java模版語言,它是JSP的絕佳替代方案,也是一個開源項目。FreeMarker允許Javaservlet保持圖形設(shè)計同應(yīng)用程序邏輯的分離,這是通過在模板中密封HTML完成的。模板用servlet提供的數(shù)據(jù)動態(tài)地生成HTML,由FreeMarker編寫的文件后綴名為“.ftl”。在struts中對FreeMarker提供了完美的支持,struts-default.xml已經(jīng)配置好了將FreeMarkerResult映射到模版文件。在struts.xml配置FreeMarker類型的result:<actionname=“test”class=“com.TestAction"><resultname="success"type="freemarker">test-success.ftl</result></action>模版加載順序Struts2在兩個位置查找FreeMarker模版:Web應(yīng)用程序目錄(Webapplication)、classpath。這個順序?qū)τ谠谕耆幾g的jar中提供模版很理想,但是也同時支持在Web應(yīng)用程序目錄中定義這些模版來覆蓋jar中的模版文件。事實上,這就是為什么可以覆蓋struts中默認(rèn)的UItags和FormTags的原理。還有可以通過templatePath上下文變量(contextvariable)指定一個路徑(文件系統(tǒng)中的任意一個目錄)。如果指定了該變量,那么這個目錄中的內(nèi)容將會被優(yōu)先尋找。在FTL文件中使用標(biāo)簽注意:Struts2提供標(biāo)簽庫與表現(xiàn)方式是分離的,所以可以在JSP/FreeMarker/Velocity都可以使用這些標(biāo)簽。例如,在JSP中可能這樣創(chuàng)建一個form:<s:formaction="updatePerson"><s:textfieldlabel="Firstname" name="firstName"/><s:submitvalue="Update"/></s:form>Velocity的應(yīng)用開始使用Velocity,首先需要保證所有的依賴都已經(jīng)被加入到工程的classpath。其次,struts-default.xml中要配置好VelocityResult,它將影射action和模版。這里給出的例子功能FreeMarker節(jié)給出的一樣,struts.xml配置如下:<actionname=“test”class=“com.TestAction"><resultname="success"type="velocity">test-success.vm</result></action>變量解析在Velocity中,從幾個不同的位置查找變量,順序如下:(1)值棧(valuestack)(2)action上下文(context)(3)內(nèi)置對象在VM文件中使用標(biāo)簽Velocity標(biāo)簽是WebWork提供的一般Tag的擴(kuò)展.只要簡單的了解這些標(biāo)簽的訪問方式:#sxxx(...)...#end(),就可以馬上開始使用了。注意:“#s”后面是沒空格的,它與標(biāo)簽名稱直接連在一起(雖然不會發(fā)生什么混亂但在閱讀上實在很不舒服,而且Velocity很遺憾的沒有采用主流的xml格式)。在Struts中使用JasperReportsJasperReports(簡稱JR)是目前應(yīng)用廣泛并且技術(shù)領(lǐng)先的java開源報表庫。它將.jrxml(XML源文件)編譯為.jasper(=編譯后版本)文件,它可以被轉(zhuǎn)換為多種格式輸出(PDF、CSV、XLS和HTML)。準(zhǔn)備JasperReports庫在使用JasperReports前,需要將JR庫添加到classpath。需要如下文件:dist/jasperreports-X.jarmons-*.jar(allthecommons-exceptmaybeforcommons-logging)lib/itext-X.jarpiler.jar定義值對象先定義一個簡單的POJO(簡單的Java對象(PlainOldJavaObjects)實際就是普通JavaBeans,使用POJO名稱是為了和EJB區(qū)分,而且簡稱比較直接。有一些屬性及其gettersetter方法的類,可以作為值對象來使用)。編寫action類JasperAction創(chuàng)建了一些人員的列表。pileManager會將jrxml模版編譯為.jasper文件。在實際程序中不要這樣做,不需要在每個請求中都把jrxml文件編譯為jasper文件,只需要執(zhí)行一次就可以了,發(fā)布的時候直接使用jasper文件就可以了,編寫Jasper模版JR使用一種特殊的XML頁面來定義模版,它會被編譯為.jasper文件。這些模版將會被用來設(shè)計結(jié)果報表。對于更加復(fù)雜的模板建議使用Jasper相關(guān)的GUI設(shè)計器(比如ireport)來定義。將文件存儲到工程的目錄下的“WW_WEBAPP/jasper”目錄(此目錄名是固定的不能改變),命名為“our_jasper_template.jrxml”。最重要的:聲明了name和lastName字段(這兩個屬性來自Person.class)。這意味著現(xiàn)在可以在的Jasper模版中使用這些字段。配置struts.xml將action添加到struts.xml,給這個action配置一個類型為jasper的result。Jasper類型的result不是struts2缺省就提供了的,而是作為一個plugin出現(xiàn),所以在配置中要繼承包jasperreports-default。代碼JasperReports:struts.xml<!—JasperReports在struts.xml中的配置--><packagename="jasper"extends="jasperreports-default"><actionname="myJasperTest"class="jasperreports.JasperAction"><resultname="success"type="jasper"> <paramname="location">/jasper/jasper_template.jasper</param> <paramname="dataSource">myList</param> <paramname="format">PDF</param></result></action></package>3.8國際化Struts2提供了廣泛的功能可以處理構(gòu)建一個國際化應(yīng)用程序的技術(shù)方面。Struts的國際化功能也可以用其他領(lǐng)域如格式化日期等數(shù)據(jù)。使用本地的資源文件在Java中用戶語言和地區(qū)的信息被封裝在java.util.Local類中,而action則通過一個定義與com.opensymphony.xwork.LocaleProvider接口的方法判斷使用哪個Locale,這個接口中只定義了一個方法:PublicLocalegetLocale()在ActionSupport中,這個方法的默認(rèn)實現(xiàn)為:通過調(diào)用AcitonContext.getContext().getLocale()方法,利用ActionContext獲得locale的值。Struts2通過查詢HttpServletRequest對象并調(diào)用它的getLocale()方法將Local與action調(diào)用聯(lián)系起來。信息的來源為了給不同的地區(qū)提供不同的字符串信息,需要一個應(yīng)用程序的源文件來為給定的locale找到正確的字符串信息。幸運(yùn)的是,Java以Java.util.ResourceBundle抽象類的方式提供了這些功能。JDK帶來了資源包的實現(xiàn):java.util.PropertyResouceBundle和java.util.ListResouceBundle。這兩個類會自動加載含有國際化信息的屬性文件(*.properties文件)。當(dāng)ResourceBundle.getBundle()被調(diào)用的時候,會查找正確的ResourceBundle名字,如CreateLocalizedCperties(缺省是英文)或CreateLocalizedCategory_perties(簡體中文)。資源包搜索順序資源包按照下面的順序搜索:(1)ActionCperties。(2)BaseCperties。(3)Iperties(每一個接口和子接口)。(4)ModelDriven的model(如果實現(xiàn)了ModelDriven),對于model對象從第一步重復(fù)執(zhí)行。(5)perties(類所在的目錄和每個父目錄直到根目錄)。(6)搜索i18nmessagekey自己的層次關(guān)系。(7)全局資源屬性(struts.custom.i18n.resources),在perties里定義的。添加默認(rèn)的資源包經(jīng)常會有一系列的信息用于應(yīng)用程序中,并且經(jīng)常要在得到一個本地化的信息是讓那個應(yīng)用程序可以得到它們。Struts提供了幾種方法來配置這些本地化信息的:(1)通過配置屬性或者編程的方式注冊默認(rèn)資源包的功能。修改perties文件中的:struts.custom.i18n.resources屬性如:struts.custom.i18n.resources=org.hibernate.auction.i18n(2)資源包可以被添加到一個啟動類中,例如ServletContextListerner,方法是通過對com.LocaclizedTextUtil類做調(diào)用:LocaclizedTextUtil.addDefaultResouceBundle(“org.hibernate.auction.i18n”);(3)<s:i18n>標(biāo)簽除了確定的默認(rèn)資源包搜索之外,可以通過<s:i18n>標(biāo)簽來是一個資源包在JSP頁面里可用。使用國際化信息本節(jié)將介紹如何利用Struts2的幾種技術(shù)配合使用來實現(xiàn)國際化。(1)使用<s:text>標(biāo)簽(2)在標(biāo)簽屬性中使用getText()(3)格式化日期和數(shù)字(4)在校驗里使用國際化信息(5)類型轉(zhuǎn)換中使用國際化信息PartⅣHibernateHibernate是一個免費(fèi)的開源Java包,它使得程序與數(shù)據(jù)庫的交互變得十分容易,更加符合面向?qū)ο蟮脑O(shè)計思想,像數(shù)據(jù)庫中包含普通Java對象一樣,而不必考慮如何把它們從數(shù)據(jù)庫表中取出。使開發(fā)者可以專注于應(yīng)用程序的對象和功能,而不必關(guān)心如何保存它們或查找這些對象。4.1JDBC簡介Java訪問數(shù)據(jù)庫最原始的方法是通過JDBC來完成的。JDBC(JavaDataBaseConnectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC是J2EE標(biāo)準(zhǔn)的一部分,它提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。JDBC提供的工具接口java.sql包提供了JDBCAPI,開發(fā)者可以通過它們編寫數(shù)據(jù)庫的程序代碼。DriverManager類:負(fù)責(zé)管理JDBC驅(qū)動程序。使用JDBC驅(qū)動程序之前,必須先將驅(qū)動程序加載并向DriverManager注冊后才可以使用,并提供方法來建立與數(shù)據(jù)庫的連接。Connection類:負(fù)責(zé)維護(hù)JSP/JAVA數(shù)據(jù)庫程序和數(shù)據(jù)庫之間的聯(lián)機(jī)??梢越⑷齻€非常有用的類對象。JDBC提供的工具接口Statement類:通過Statement類所提供的方法,可以利用標(biāo)準(zhǔn)的SQL命令,對數(shù)據(jù)庫直接新增、刪除或修改操作PreparedStatement類:PreparedStatement類和Statement類的不同之處在于PreparedStatement類對象會將傳入的SQL命令事先編好等待使用,當(dāng)有單一的SQL指令比多次執(zhí)行時,用PreparedStatement類會比Statement類有效率。ResultSet類:負(fù)責(zé)存儲查詢數(shù)據(jù)庫的結(jié)果。并提供一系列的方法對數(shù)據(jù)庫進(jìn)行新增、刪除和修改操作。也負(fù)責(zé)維護(hù)一個記錄指針(Cursor),記錄指針指向數(shù)據(jù)表中的某個記錄,通過適當(dāng)?shù)囊苿佑涗浿羔?,可以隨心所欲的存取數(shù)據(jù)庫,加強(qiáng)程序的效率。

JDBC訪問數(shù)據(jù)庫使用JDBC操作數(shù)據(jù)庫,一般基本都是如下幾個步驟:(1)載入數(shù)據(jù)庫驅(qū)動。不同的數(shù)據(jù)庫驅(qū)動程序是不同的,一般由數(shù)據(jù)庫廠商提供這些驅(qū)動程序。(2)建立數(shù)據(jù)庫連接,獲得Connection對象。(3)根據(jù)SQL語句建立Statement對象或PreparedStatement對象。(4)用Connection對象執(zhí)行SQL語句,獲得結(jié)果集ResultSet對象。(5)然后一條一條讀取結(jié)果集ResultSet對象中的數(shù)據(jù),保存在某個Java對象中。(6)如果是修改或者刪除操作需要對數(shù)據(jù)發(fā)commit命令。(7)最后依次關(guān)閉各個Statement對象和Connection對象。4.2ORM介紹ORM的全稱是Object/RelationMapping,即對象/關(guān)系映射。面向?qū)ο蟪绦蛟O(shè)計語言與關(guān)系數(shù)據(jù)庫發(fā)展不同步時,需要一種中間解決方案,ORM框架就是這樣的解決方案。ORM也可理解是一種規(guī)范,具體的ORM框架可作為應(yīng)用程序和數(shù)據(jù)庫的橋梁。ORM并不是一種具體的產(chǎn)品,而是一類框架的總稱,它概述了這類框架的基本特征:完成面向?qū)ο蟮某绦蛟O(shè)計語言到關(guān)系數(shù)據(jù)庫的映射。目前ORM框架的產(chǎn)品非常多,包括如下產(chǎn)品:EJB,Hibernate,IBATIS,Oracle的TopLink,OJB,JPA(JavaPersistenceAPI)。ORM帶來了什么面向?qū)ο蟮某绦蛟O(shè)計語言,代表了目前程序設(shè)計語言的主流和趨勢,其具備非常多的優(yōu)勢,比如:面向?qū)ο蟮慕?、操作。多態(tài)、繼承。摒棄難以理解的過程。簡單易用,易理解性。4.3Hibernate項目簡介Hibernate是目前最流行的ORM輕量級框架,它是一個面向Java環(huán)境的對象/關(guān)系數(shù)據(jù)庫映射工具。Hibernate具有面向?qū)ο蟮奶卣?,采用低侵入式的設(shè)計,即完全采用普通的Java對象(POJO),而不必繼承Hibernate的某個超類或?qū)崿F(xiàn)Hibernate的某個接口。Hibernate是面向?qū)ο蟮某绦蛟O(shè)計語言和關(guān)系數(shù)據(jù)庫之間的橋梁,真正實現(xiàn)了開發(fā)者采用面向?qū)ο蟮姆绞絹聿僮麝P(guān)系數(shù)據(jù)庫。Hinbernate的傳奇經(jīng)歷為了解決ORM的問題,Sun公司首先推出了EntityEJB的解決方案,這是一種優(yōu)秀的、但備受爭議的解決方案——主要問題是EJB的開發(fā)相當(dāng)繁瑣,而且需要EJB容器支持,影響了EntityEJB的實際應(yīng)用。這一時期,iBATIS和Apache組織下的另一個持久層框架,在許多J2EE應(yīng)用中大展拳腳,但iBATIS并不是真正的O/RMapping,它僅僅停留在SQLMapping映射階段——并未讓開發(fā)者能完全運(yùn)行面向?qū)ο蟮姆N種優(yōu)勢。在這種背景下,Java開發(fā)界在等待一種成熟的O/RMapping解決方案,它應(yīng)該具有簡單易用的特性,最好能開源免費(fèi),而且無須任何容器支持,Hibernate應(yīng)運(yùn)而生,于是Hibernate迅速在J2EE開發(fā)領(lǐng)域流行開來。體系結(jié)構(gòu)(Architecture)Hibernate體系結(jié)構(gòu)的概要圖,從這個圖可以看出,Hibernate使用數(shù)據(jù)庫和配置信息來為應(yīng)用程序提供持久化服務(wù)(以及持久的對象)。持久化層訪問數(shù)據(jù)庫代碼與業(yè)務(wù)邏輯混雜在一起帶來了很多問題,這樣的程序設(shè)計嚴(yán)重顯示了程序的可擴(kuò)展性和適應(yīng)性,所以有必要要把涉及數(shù)據(jù)庫操作的代碼分離出來與業(yè)務(wù)邏輯分離。就形成了所謂“持久化層”的概念。持久化(Persistence),即把數(shù)據(jù)(如內(nèi)存中的對象)保存到可永久保存的存儲設(shè)備中(如磁盤)。持久化的主要應(yīng)用是將內(nèi)存中的數(shù)據(jù)存儲在關(guān)系型的數(shù)據(jù)庫中,當(dāng)然也可以存儲在磁盤文件中、XML數(shù)據(jù)文件中等。持久化類(PersistentClasses)在應(yīng)用程序中,用來實現(xiàn)業(yè)務(wù)問題實體的(如,在電子商務(wù)應(yīng)用程序中的Customer和Order)類就是持久化類。不能認(rèn)為所有的持久化類的實例都是持久的狀態(tài)——一個實例的狀態(tài)也可能是臨時的或脫管的。如果這些持久化類遵循一些簡單的規(guī)則,Hibernate能夠工作得更好,這些規(guī)則也被稱作簡單傳統(tǒng)Java對象(POJO)編程模型。但是這些規(guī)則并不是必需的。實際上,Hibernate3對于的持久化類幾乎不做任何設(shè)想??梢杂闷渌姆椒▉肀磉_(dá)領(lǐng)域模型:比如,使用Map實例的樹型結(jié)構(gòu)。實例的狀態(tài)一個持久化類的實例可能處于三種不同狀態(tài)中的某一種。這三種狀態(tài)的定義則與所謂的持久化上下文(persistencecontext)有關(guān)。Hibernate的Session對象就是這個所謂的持久化上下文:數(shù)據(jù)庫連接配置Hibernate支持兩種數(shù)據(jù)庫連接方式:JDBC和JNDI方式。全局屬性配置Hibernate提供很多方便的全局配置,可以通過調(diào)整這些參數(shù),控制Hibernate的行為。連接池配置Hibernate自帶的連接池算法相當(dāng)不成熟。它只是為了讓使用者快些上手,并不適合用于產(chǎn)品系統(tǒng)或性能測試中。出于最佳性能和穩(wěn)定性考慮應(yīng)該使用第三方的連接池。只需要用特定連接池的設(shè)置替換hibernate.connection.pool_size即可。這將關(guān)閉Hibernate自帶的連接池。在實際應(yīng)用中更多的看到使用Hibernate提供了一個缺省的第三方連接池C3P0,它位于lib目錄下。如果設(shè)置了hibernate.c3p0.*相關(guān)的屬性,Hibernate將使用C3P0ConnectionProvider來緩存JDBC連接。Configuration類Configuration類的作用是對Hibernate進(jìn)行配置,以及對它進(jìn)行啟動,可以完成以下幾方面的工作:(1)加載配置文件。在Hibernate的啟動過程中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,然后創(chuàng)建一個SessionFactory對象,(

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論