webbjsp9周周五-jsp課件第8章_第1頁
webbjsp9周周五-jsp課件第8章_第2頁
webbjsp9周周五-jsp課件第8章_第3頁
webbjsp9周周五-jsp課件第8章_第4頁
webbjsp9周周五-jsp課件第8章_第5頁
已閱讀5頁,還剩127頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

8.1

JavaBean與組件復用8.2

在JSP中使用JavaBean8.3

使用JavaBean

數(shù)據(jù)庫8.4

JSP+JavaBean留言板案例習題8第8章

JSP與JavaBeanJSP頁面程序是由普通的HTML

、JSP

和Java程序片組成的,如果用這種大量交互在一起的技術開發(fā)

,則

開發(fā)周期長,程序混雜,不易

。當前流行的JSP開發(fā)技術是模塊化技術,各模塊負責一項具體的任務。例如,常用方法是將整個程序分為靜態(tài)模塊和動態(tài)模塊。靜態(tài)部分由應用的表達層組成,由網(wǎng)頁設計

對頁面進行

規(guī)劃設計;動態(tài)部分由業(yè)務邏輯層組成,是Java程序員編寫Java程序的部分;最后,通過JSP

指令實現(xiàn)各部分的連接。邏輯層可由JavaBean構成。JavaBean是Sun公司開發(fā)的一個可重復使用的 組件,JSP對于在Web應用中集成JavaBean組件提供了完善的支持。這種支持不僅可以減少JSP中的Java代碼量,縮短開發(fā)時間,也為JSP應用帶來了更多的可伸縮性。開發(fā)者可以生成自己的JavaBean組件,也可以從獨立供應商那里,或者利用與其它流行工具在一起的JavaBean。JSP頁面將數(shù)據(jù)的處理過程指派給一個或幾個Bean來完成,只需在JSP頁面中調(diào)用這個Bean即可。8.1.1隨著復用技術規(guī)模的不斷擴大,如何高效率、高質(zhì)量地生產(chǎn)是所有開發(fā)機構所的用以前開發(fā)的高質(zhì)量的組件來開發(fā)新開發(fā)工作所耗費的時間和成本,提高。顯然,通過利系統(tǒng),可以減少生產(chǎn)率和系統(tǒng)的質(zhì)量。這便是1968年的NATO的思想,此后,重用的基本出發(fā)點。實際上,早在工程會議上就已經(jīng)提出了共享組件庫重用技術越來越受到重視。8.1

JavaBean與組件復用重用(Software

Reuse,又稱 復用或再用)是指利用事先建立好的

稱為構件或組件)來創(chuàng)建新成分(SoftwareComponents,也系統(tǒng)的過程和開發(fā)可重用軟重用所必須包含的兩件組件的技術。這個定義蘊含著個方面:(1)

系統(tǒng)地開發(fā)可重用的部件。這些

部件可以是代碼,也可以是分析,設計,測試數(shù)據(jù),原型,計劃,文檔,模板,框架等等。部件作為構筑模塊來建立新(2)

系統(tǒng)地使用這些的系統(tǒng)。重用會帶來以下好處:提高 生成率??s短開發(fā)周期。降低

開發(fā)和(4)

生產(chǎn)更加標準化的費用。。開發(fā)質(zhì)量。系統(tǒng)的互操作性。開發(fā) 數(shù)量。能比較容易地適應不同性質(zhì)的項目開提高增強減少使開發(fā)發(fā)。重用主要體現(xiàn)在以下方面:源代碼重用、目標代碼重用、類庫、組件。源代碼重用。它是最低級別的重用技術。程序員在實現(xiàn)某些功能時,將已開發(fā)過的類似的源代碼修改后嵌入到新開發(fā)的模塊中。這樣做雖然可以縮短開發(fā)時間,但存在著讀懂源代碼的問題。目標代碼重用。這種技術一般是以函數(shù)庫的方式來體現(xiàn)的,由于程序員不能修改源代碼,所以靈活性低。類庫。它具有繼承、封裝、派生等特性,使得大規(guī)模的重用成為可能,是面

象技術出現(xiàn)后的重用方式。(4)

組件。它是繼過程性模型和面象模型之后的新一代邏輯模型,是最先進的重用技術。通過面象的技術對所開發(fā)的系統(tǒng)進行分析與設計,將特定的對象設計為一個個組件,并建立組件庫。這樣的組件不僅可以重復使用,而且還可以由用戶自行配置。整個系ⅰ

┳τ8.1.2 JavaBean組件模型JavaBean是JavaSoft公司于1995年創(chuàng)建的一個組件模型,旨在為Java定義一個軟組件體系結(jié)構。這一模型允許第供應商創(chuàng)建和銷售基于Java的組件,開發(fā) 可以 這些組件,并把它們應用于自己的

系統(tǒng)中。實際上,JavaBean是一種特殊的Java類(簡稱Bean類)。JavaSoft公司為JavaBean定義的任務是:“Write

once,run

anywhere,reuseeverywhere”。也就是說,JavaBean是一種具有“一次編寫,可以在任何地方運行,可以在任何地方重用”特性的Java組件。由于JavaBean是用Java編寫的,JavaBean建立在Java的優(yōu)勢上,并進一步擴展了Java平臺,所以Java語言環(huán)境所具有的特性將會在JavaBean中得到很好的體現(xiàn),是一個可移植、高度可伸縮、多平臺的、可重用的組件體系結(jié)構。8.1.3 JavaBean的組成特性JavaBean組件模型由屬性、方法和事件三部分組成,并通過封裝屬性和方法使其成為具有某種功能或者處理某個業(yè)務的對象(簡稱Bean)。Bean的組成特性如下。(1)

方法。指在Bean類中定義的、完成各種特定任務的公共方法,這些方法提供給外部調(diào)用。(2)屬性。Bean的屬性是Bean類中的成員變量,它與一般Java程序中所指的屬性是同一概念。Bean的屬性可以是任何Java支持的數(shù)據(jù)類型,包括類和接口類型。在

JavaBean設計中,按照屬性的作用不同又可將Bean屬性細分為四類:Simple(簡單或單值屬性)、Indexed(索引屬性)、Bound(綁定屬性)與Constrained(約束屬性)。①簡單屬性。簡單屬性是最普通的屬性類型,即Java程序中的一個屬性或數(shù)據(jù)成員,且此屬性只能含有單一的數(shù)據(jù)值。此外,簡單屬性還表示有一對get/set方法與此屬性相伴隨,屬性名與和該屬性相關的get/set方法名對應。例如,如果有getXy和setXy方法,則暗指有一個名為xy的屬性;如果有一個方法名為isXy,則通常暗指xy是一個布爾型屬性(即xy的值為true或false)。②索引屬性。索引屬性是以數(shù)組形式存在的一組具有相同數(shù)據(jù)類型的屬性,使用與該屬性對應的set/get方法可設置或獲取數(shù)組中元素的值,也可以一次設置或獲取整個數(shù)組的值。③綁定屬性。綁定屬性是向其它基于該屬性的變化而改變的相關部件提供通知信息的屬性。一個綁定屬性的值發(fā)生變化時,就觸發(fā)一個PropertyChange事件,事件中封裝了屬性名、屬性的原值、屬性變化后的新值。這個事件將屬性值傳遞到其它的Bean,接收事件的Bean將根據(jù)自己對處理該事件的定義做出相應的動作。④約束屬性。約束屬性是在改變它的值之前,必須由

Bean外部的某個相關部件進行有效性確認的屬性。也就是說,一個JavaBean的約束屬性的值要發(fā)生變化時,與這個屬性相連接的其它Java對象可以否決屬性值的改變。(3)

事件。事件用于傳遞有關Bean狀態(tài)變化

,以及用戶與Bean之間的交互信息。Bean與Bean之間相互連接起來并進行互操作是通過事件處理機制實現(xiàn)的。JavaBean直接繼承了JavaAPI中以事件源/收聽者模型為基礎的事件處理機制。Bean既可以產(chǎn)生事件,也可以收聽并處理事件。作為事件源的Bean,既可以產(chǎn)生低層事件,也可以產(chǎn)生語義事件;作為收聽者的Bean,向外部提供了響應并處理事件的公共方法。8.1.4 JavaBean的其它特性JavaBean除了具有一般Java類的特性外,還具有一般

Java類所沒有的一些特性,具體情況如下。(1)

自查(introspection)。自查是指 工具能夠從外部分析Bean是如何工作的。Bean之所以能支持自查是因為在JavaBean中規(guī)定:當定義Bean的屬性、事件和方法時,要么利用標準的Bean信息類進行顯式的定義,要么使用以命名約定為基礎的設計模式來定義,兩者必居其一。這樣無論使用哪種形式,或是混合使用兩種形式,應用程序構造工具都能分析Bean具有哪些屬性、方法和事件,以及使用它們時所必需的信息。自查對于重用代碼組件來講是至關重要的,因為只有代碼組件支持自查,重用者才能真正地以透明的方式重用它們。(2)支持應用程序構造工具。應用程序構造工具可以在Bean類支持自查的基礎上,為 開發(fā) 提供直觀的重用Bean的可視化方式,從而使重用代碼資源的過程變得簡單、靈活和有效。例如,雖然應用程序構造工具在其內(nèi)部同樣只能通過 者方法來

Bean的屬性,但是它可以在此基礎上進一步利用Bean屬性自查和Bean自身的屬性編輯器,為應用程序構造工具的用戶提供利用可視化的屬性列表和編輯Bean屬性 段。(3)

客戶定制(customization)。開發(fā) 可以利用應用程序構造工具設置Bean的屬性值,以定制Bean的外觀和行為。(4)

性 ??梢栽?/p>

性 設備上保存Bean類,以供今后重用。JavaBean支持可視化和非可視化兩種組件。可視化的組件就是有GUI界面的JavaBean,這些組件在運行中能夠顯示出來,例如,按鈕、文本框等。非可視化的組件就是沒有GUI界面的JavaBean,通常用來處理程序中的一些復雜事務。JSP支持非可視化的JavaBean組件技術,用于實現(xiàn)比較復雜的事務處理。8.2

在JSP中使用JavaBean在JSP開發(fā)中,JavaBean用于使用JavaBean可以減少在JSP中業(yè)務邏輯處理。通過代碼的使用,很好地實現(xiàn)業(yè)務邏輯和前臺程序的分離,使得JSP頁面更加容易維護,系統(tǒng)具有更好的健壯性和靈活性。8.2.1 JavaBean編寫規(guī)范在JSP中使用JavaBean可有下述兩個步驟:第一,編寫JavaBean;第二,在JSP頁面中調(diào)用這個JavaBean。雖然編寫JavaBean與編寫Java程序沒有太多區(qū)別,但仍然有以下幾點需要注意。(1)

如果Bean中有構造方法,那么這個構造方法不能帶任何參數(shù),并指定為public。的成員方法的修飾符必Bean中被JSP頁面直接須指定為public。Bean具有的成員變量名的第一個字母必須小寫,如下節(jié)示例程序C8_1.java中的aa1、aa2、bb1等的第一個字母都是小寫的。(4) Bean中的每個成員變量都有相應的get和set方法對其進行讀/寫。而且,對這個get和set方法的方法名有特別的規(guī)定。例如,假設Bean中的成員變量的名字是xy,若要在JSP頁面中獲取xy的值或修改xy的值,則在Bean中定義的get方法的方法名必須是getXy;定義的set方法的方法名必須是setXy。即在get和set后面跟著成員變量的名字,且這個成員變量名的第一個字母必須改為大寫字母。例如,示例程序C8_1.java

中的成員變量名為aa1,若要獲取aa1的值并修改aa1的值,則在Bean中定義了名為getAa1()的方法,用來獲取aa1的值;定義了名為setAa1()的方法,用來修改aa1的值。(5)get方法是只讀方法,不帶任何參數(shù),返回值是一個對象,對象的數(shù)據(jù)類型就是該成員變量的數(shù)據(jù)類型。set方法是只寫方法,帶有一個參數(shù),參數(shù)的數(shù)據(jù)類型為該成員變量的數(shù)據(jù)類型。set方法不能返回值。(6)

如果成員變量的數(shù)據(jù)類型是boolean型的,則可以用isXy方法來代替上述的getXy方法。8.2.2 JavaBean應用示例下面通過一個具體的例子來說明JavaBean的編寫和在

JSP頁面中調(diào)用JavaBean的方法。這個例子由兩個文件組成:一個是名為C8_1.java的JavaBean;另一個是名為C8_1.jsp的調(diào)用這個JavaBean的JSP程序?!臼纠绦駽8_1.java】一個具有簡單屬性的JavaBean。package

ch8Bean;public

class

C8_1{

private

int

aa1,aa2=4;privateboolean

bb1;//aa1,aa4為成員變量名//bb1為成員變量名public

C8_1(){

aa1=1;

bb1=false;

}public

int

getAa1()//該類的構造方法//返回aa1的值{ return

this.aa1;

}public

void

setAa1(int

a){

this.aa1=a;

}public

boolean

isBb1(){ return

this.bb1;

}public

void

setBb1(

boolean

b)//設置aa1的值//返回bb1的值//設置bb1的值{ this.bb1=b;}public

int

add(){ return

2+aa2+aa1;

}//返回計算的值}【示例程序c8_1.jsp】調(diào)用JavaBean(C8_1.java)的JSP頁面程序。<%@

page

contentType="text/html;

charset=GBK"import="ch8Bean.*"

%><html><head><title>JSP中使用Bean</title></head><body><jsp:useBean

id="myBean"scope="page"class="ch8Bean.C8_1"/><h3>

在JSP中使用一個具有簡單屬性的JavaBean的例子</h3><hr>第一次調(diào)用getAa1()和getBb1()的值:<%=myBean.getAa1()%><%=myBean.isBb1()%><p>修改aa1與bb1后getAa1()和getBb1()返回的值是:<jsp:setProperty

name="myBean"

property="aa1"value="5"

/><br>

<jsp:getProperty

name="myBean"property="aa1"

/><jsp:setProperty

name="myBean"

property="bb1"value="true"

/><jsp:getProperty

name="myBean"

property="bb1"

/><p>調(diào)add()方法,返回值是:<%=myBean.add()%></body></html>說明:在JSP頁面中

JavaBean時,必須使用JSP動作標簽<jsp:useBean……>。關于這個動作的用法已在6.2.4節(jié)作了介紹,如果讀者還沒有掌握的話,請再次閱讀該節(jié)。本例中,Bean的id名為myBean,class屬性值為“ch8Bean.C8_1”。JSP引擎在創(chuàng)建Bean對象時將調(diào)用其無參數(shù)的構造方法來初始化Bean屬性。如果需要在Bean對象被創(chuàng)建時設置或讀出Bean的屬性,正如6.2.5和6.2.6節(jié)所述的那樣,可以使用<jsp:setProperty>和<jsp:getProperty>指令來Bean的屬性。當然,也可以使用JSP頁面程序或表達式直接調(diào)用Bean對象的public方法。(3)

在本例中:<%=myBean.getAa1()%>表示

C8_1.java程序中的getAa1()方法,輸出getAa1()方法的返回值;<jsp:setProperty

name="myBean"

property="aa1"value="5"

/>表示

C8_1.java程序中的setAa1()方法,設置aa1的值為“5”;<%=myBean.add()%>表示

C8_1.java程序中的add()方法,輸出add()方法的返回值。8.2.3

用Eclipse建立JSP+JavaBean程序使用的JSP+JavaBean程序是8.2.1節(jié)中的c8_1.java和C8_1.jsp程序。用Eclipse中文加強版建立JSP+JavaBean程序的步驟與第3章中介紹的建立JSP程序的步驟相同。當建立了ch8項目(文件夾)后,先創(chuàng)建和存放C8_1.java程序文件。其操作過程如下(圖8.1所示):在“ch8”文件夾上單擊右鍵,出現(xiàn)快捷菜單。在出現(xiàn)的快捷菜單中依次單擊“新建”/“類”,彈出“新建Java類” 框,如圖8.2所示。圖8.1

建立C8_1.java程序在圖8.2中的“包”處寫入“ch8Bean”,“名稱”處寫入“C8_1”。這兩項數(shù)據(jù)的作用是指明C8_1.java程序存放在F:\xiti\ch8\src\ch8Bean文件夾中。當然,編譯后的

C8_1.class也會自動存放在F:\xiti\ch8\build\classes\ch8Bean文件夾中。單擊“完成”后,出現(xiàn)如圖8.3所示的界面。這個界面的中部即為編寫JavaBean程序的位置,在此處書寫

C8_1.java程序。圖8.2

“新建Java類”框圖8.3

C8_1.java程序的存放位置至于JSP程序的存放位置,已在第3章講過,此處不再贅述。JSP+Bean程序在Eclipse中文加強版的存放位置如圖8.4中的“項目資源管理器”所示。編寫完上述程序后,運行JSP程序就可以得到如圖8.5所示的JSP+Bean的運行結(jié)果。圖8.4

JSP+JavaBean程序的存放位置圖8.5 c8_1.jsp的運行結(jié)果8.2.4 JavaBean在JSP中的生命周期JSP引擎分配給每個客戶的Bean是互不相同的,該

Bean的有效范圍或生命周期是由<jsp:useBean>動作中的

Scope屬性的取值確定的,也就是說Scope屬性的取值決定了Bean的生命周期,即決定了Bean由服務端傳送到客戶端的應用范圍。在JSP中的Bean的生命周期分為四種:Page、Session、Request和Application。1.

scope=pagePage

Scope的Bean的生命周期是本頁面的執(zhí)行期間,表示Bean只能被當前頁面

。2.

scope=sessionSession對象與每個用戶相關聯(lián),Session

Scope的Bean的生命周期是一個

者的會話期間。當一個

者站點時,則產(chǎn)生一個Session對象。一個 者開始

站點時,從他

的起始頁到隨后

的所有頁面的集合,被稱為一個Session。當 者關閉瀏覽器時,屬于SessionScope的Bean對象就被清除,生命周期告終。如果客戶在多個頁面中相互

,而每個頁面都含有一個useBean標簽,并且那么,該中id的值相同,Scope的值都是“session”,者在這些頁面得到的Been是相同的一個。如果

者更改了某個頁面的Bean的屬性,則其它頁面的這個Bean的屬性將會被修改。3.

scope=requestRequest對象是被用來客戶端傳送給服務器的值,Request

Scope的Bean的生命周期是用戶的請求期間。當把Scope設置為request時,只能通過forward給下一個JSP。當一個JSP程序通過forward將Bean傳送將Request對象傳送給下一個JSP程序時,屬于RequestScope的Bean也將會隨著Request對象送出,此時,由forward

所串聯(lián)起來的JSP

程序可以共享相同的Bean。4.

scope=applicationApplication

Scope的Bean的生命周期最長,只有當關閉服務器時,它的生命才告終。如果某個Bean屬于

Application

Scope時,所有在同一個JSP引擎下的JSP程序都可以共享這個Bean,在相同的JSP引擎下的Web應用程序,都可以使用這個Bean來交換信息。下面 通過一個 計數(shù)器的實例來說明這四種JavaBean生命周期的差異。計數(shù)器Bean?!臼纠绦騝8_2.java】package

ch8Bean;public

class

c8_2{ private

int

count=0; //定義一個私有變量

public

int

getCount(){return(this.count);

}public

voidsetCount(int

c){this.count+=c;

}public

voidincrease(){this.count++;

}}【示例程序c8_2.jsp】 計數(shù)器Bean的JSP程序。<%@

page

contentType="text/html;

charset=GBK"import="ch8Bean.*"

%><html><body><h3>

使用Page

Scope</h3><hr><!--以下三句實例化ch8_2對象--><jsp:useBean

id="cn"

scope="page"class="ch8Bean.c8_2"/><jsp:setProperty

name="cn"

property="count"value="4"

/><!--該語句只有創(chuàng)建新對象時才執(zhí)行--><%

cn.increase();%><!--在網(wǎng)頁上顯示計數(shù)器結(jié)果--><br>

<jsp:getProperty

name="cn"

property="count"/></body></html>圖8.6

瀏覽器刷新后執(zhí)行的結(jié)果運行c8_2.jsp的結(jié)果如下:(1)將c8_2.jsp程序中的Scope設為scope=“page”,每當運行或重新刷新JSP程序時,如圖8.6所示,計數(shù)器值始終保持不變。這是因為當JSP程序執(zhí)行完成,把結(jié)果頁面送給客戶端后,屬于PageScope的Bean對象就被清除,生命周期告終。當有新的請求產(chǎn)生時,c8_2對象又產(chǎn)生一個新的Bean實例對象傳送到客戶端,計數(shù)器重新計數(shù),所以,計數(shù)器值保持不變。(2)將c8_2.jsp程序中的Scope設為scope=“session”,當刷新瀏覽器產(chǎn)生新的請求時,不會再產(chǎn)生新的對象來處理這個請求,如圖8.7所示,而是將原來的計數(shù)器對象的計數(shù)值增1。如果再打開一個新的瀏覽器窗口,在兩個瀏覽器窗口分別執(zhí)行這個程序。此時建立了兩個客戶端應用,將會看到兩個窗口的計數(shù)器是各自獨立計數(shù)的。圖8.7顯示的是打開第一個瀏覽器窗口并刷新后的結(jié)果;圖8.8顯示的是新打開一個瀏覽器窗口時的執(zhí)行結(jié)果。圖8.7

第一個瀏覽器執(zhí)行的結(jié)果圖8.8

第二個瀏覽器執(zhí)行的結(jié)果圖8.9

設置為request時的運行結(jié)果(3)將示例程序c8_2.jsp的Scope設置為scope=“request”時,Bean

的生命周期是用戶的請求期間,其運行結(jié)果如圖8.9所示。當把Scope設置為request時,只能通過forward標簽將Bean傳送給下一個JSP。當一個JSP程序通過forward標簽將Request對象傳送給下一個JSP程序時,屬于RequestScope的Bean也將會隨著Request對象送出。此時,由forward

所串聯(lián)起來的JSP

程序可以共享相同的Bean。(4)將c8_2.jsp程序中的Scope設為scope=“application”,如果打開兩個新的瀏覽器窗口,在兩個瀏覽器窗口中分別

執(zhí)行c8_2.jsp程序。此時,將會看到兩個客戶端共用一個cn對象,兩個窗口內(nèi)的計數(shù)器的值是相互連續(xù)的,就如同在

一個瀏覽器窗口中執(zhí)行了c8_2.jsp程序一樣,如圖8.10所示。然后再刷新它一次,如圖8.11所示。當關閉瀏覽器后再打

開瀏覽器并執(zhí)行c8_2.jsp程序時,Bean的count值再次發(fā)生

變化,就如同對此程序再刷新一次的效果是一樣的,直到

關閉服務器。圖8.10

第一個瀏覽器執(zhí)行的結(jié)果圖8.11

第二個瀏覽器執(zhí)行的結(jié)果8.2.5

一個具有索引屬性的JavaBean索引屬性是一種代表一組數(shù)值的Bean屬性。使用與該屬性對應的set/get方法可取得數(shù)組中的數(shù)值。該屬性也可一次設置或取得整個數(shù)組的值。【示例程序c8_3.java】具有索引屬性的JavaBean。package

ch8Bean;public

class

c8_3{private

int[]

cc1={11,22,33,44};public

void

setCc1(int[]c) //設置整個數(shù)組的值{

cc1=c;

}public

void

setCc1(int

index,int

x)個元素的值{

cc1[index]=x;

}public

int[]getCc1()個數(shù)組的值{ returncc1;

}public

intgetCc1(intx)組中單個元素的值{ return

cc1[x];

}}//設置單//返回整//返回數(shù)【示例程序c8_3.jsp】 具有索引屬性JavaBean的JSP程序。<%@

page

contentType="text/html;

charset=GBK"import="ch8Bean.*"

%><html><body><h3>

在JSP中使用一個具有索引屬性的JavaBean的例子</h3><hr><jsp:useBean

id="myBean"

scope="page"class="ch8Bean.c8_3"/>cc1數(shù)組初始化的值為:11,22,33,44:<br>取cc1數(shù)組下標為2的值<%=myBean.getCc1(2)%><br>取cc1數(shù)組的值:<%int[]mm=myBean.getCc1(); //將cc1數(shù)組的值賦給mm數(shù)組out.println("<br>"+mm[0]+","+mm[1]+","+mm[2]+","+mm[3]+"<br>");%><%int

c[]={1,2,3,4};%><br>

修改cc1數(shù)組的值為1,2,66,4<%

myBean.setCc1(c);

%><%

myBean.setCc1(2,66);

%><br>取cc1數(shù)組下標為2的值:<%=myBean.getCc1(2)%><br>取cc1數(shù)組的值:<%mm=myBean.getCc1();//將cc1數(shù)組的值賦給

mm數(shù)組

out.println("<br>"+mm[0]+","+mm[1]+","+mm[2]+","+mm[3]+"<br>");%></body></html>運行C8_3.jsp的結(jié)果如圖8.12。圖8.12 c8_3.jsp的運行結(jié)果在第7章介紹通過JSP頁面數(shù)據(jù) 代碼都寫入了JSP頁面程序中。對于少量的數(shù)據(jù)庫事務來說這樣做是可行的,但是,對于大量的數(shù)據(jù)庫訪問事務來說,這樣的代碼可能要在許多頁面中重復書寫,程序可性和代碼的重用性都很低。事實上,在的JSP開發(fā)中,已經(jīng)很少直接在JSP頁面中寫入大量的邏輯代碼,而是把 數(shù)據(jù)庫的代碼寫在一個JavaBean或者Servlet中,而在需要書寫類似代碼的JSP頁面中通過<jsp:useBean>動作將這個JavaBean引入即可。這樣,不僅頁面容易 ,而且代碼也能得到很好的重用。本節(jié)以解怎樣在JSP中使用JavaBeanAccess數(shù)據(jù)庫為例,講數(shù)據(jù)庫。8.3

使用JavaBean數(shù)據(jù)庫數(shù)據(jù)庫時,把所有的通過JavaBean

數(shù)據(jù)庫的過程與第7章講述的通過JSP頁面 數(shù)據(jù)庫的過程相同,都需要五個步驟,即:導入JDBC標準庫;的連接;執(zhí)行數(shù)據(jù)

實現(xiàn)功能分離,下面數(shù)據(jù)庫驅(qū)動程序;建立與數(shù)據(jù)庫操作;關閉所有連接。為了更好地編寫兩個JavaBean:一個負責建立與數(shù)據(jù)庫的連接;另一個則負責執(zhí)行數(shù)據(jù)

操作。8.3.1

連接數(shù)據(jù)庫的JavaBean【示例程序DataBaseConn.java】這個JavaBean的主要數(shù)據(jù)庫驅(qū)動程序;建立功能是:導入JDBC標準庫;與數(shù)據(jù)庫的連接。程序如下。package

ch8Bean;import

java.sql.*;public

class

DataBaseConn{public

static

Connection

getConnection(){Connection

con=null;String

JDriver

=“sun.jdbc.odbc.JdbcOdbcDriver”;//聲JDBC驅(qū)動程序?qū)ο骃tring

conURL=“jdbc:odbc:TestDB”;//定義JDBC的URL對象,數(shù)據(jù)庫為TestDBtry

{Class.forName(JDriver);//加載JDBC-ODBC橋驅(qū)動程序con=DriverManager.getConnection(conURL);//連接數(shù)據(jù)庫的URL}catch(Exception

e){

System.err.println(e.getMessage());

}return

con;}}在這個JavaBean中, 把需要建立連接的數(shù)據(jù)庫以conURL參數(shù)對象的形式傳遞給getConnection()方法,從而實現(xiàn)與數(shù)據(jù)庫的連接。當然,這個例子中的conURL參數(shù)值仍然是固定的“jdbc:odbc:TestDB”,即實際上建立的是與TestDB數(shù)據(jù)庫的連接。這樣做的原因主要是為了降低讀者對程序的理解難度。當

具備了一定的基礎后,也可以將這個參數(shù)的值做成可變的,只有如此,才可以大大提高代碼的重用度。8.3.2

操作數(shù)據(jù)庫中數(shù)據(jù)的JavaBean【示例程序QueryUpdate.java】這個JavaBean的主要功能是:操作(查詢、 、更新和刪除)數(shù)據(jù)庫中的數(shù)據(jù);完成了所要執(zhí)行的操作后,關閉各種連接。程序如下。package

ch8Bean;import

java.sql.*; //引入java.sql包public

class

QueryUpdate{Statement

stmt=null;Connection

con=null;public

QueryUpdate

()參數(shù){ //建立與數(shù)據(jù)庫的連接

this.con=DataBaseConn.getConnection();}public

void

executeUpdate(String

sql){//用于進行記錄的增刪改等操作的方法,為sql語句try{stmt=con.createStatement();類對象stmt.executeUpdate(sql);//建立Statement//執(zhí)行SQL命令}catch(SQLException

ex){System.err.println(ex.getMessage());}}/*

executeQuery方法用于進行記錄的查詢操作,數(shù)為sql語句,返回含查詢結(jié)果信息的ResultSet對象*/public

ResultSet

executeQuery(String

sql)參{ResultSet

rs

=

null;try{stmt=con.createStatement();類對象rs=stmt.executeQuery(sql);據(jù)庫查詢操作}catch(SQLException

ex){//建立Statement//執(zhí)行數(shù)System.err.println("executeQuery:"+ex.getMessage());}return

rs;}//關閉各種連接

public

void

close(){try{stmt.close();

//Statement所連接的數(shù)據(jù)庫及JDBC資源con.close();數(shù)據(jù)庫的連線}catch(SQLException

ex){System.err.println(ex.getMessage());}}}//關閉與在這個JavaBean中, 首先在構造方法中使用上一節(jié)創(chuàng)建的數(shù)據(jù)庫連接對象DataBaseConn的getConnection()

方法建立了與數(shù)據(jù)庫的連接;然后,定義了executeUpdate()和executeQuery()兩個方法,并通過 參數(shù)“sql”語句將要執(zhí)行的操作代入,實現(xiàn)所要執(zhí)行的對數(shù)據(jù)庫的操作。8.3.3

使用JSP+JavaBean創(chuàng)建表、

記錄和顯示記錄使用JSP+JavaBean模式創(chuàng)建TestDB數(shù)據(jù)庫中的student表,

三條記錄,最后,顯示student表的所有記錄。student表的定義如表8.1所示。表8.1 student表字

名類

型描

述idVarchar(10)學號nameVarchar(15)名字scoreinteger成績【示例程序c8_4.jsp】使用上節(jié)創(chuàng)建的JavaBean來操作數(shù)據(jù)庫。<%@

page

contentType="text/html;

charset=GBK"

%><%@

page

language="java"

import="java.sql.*"import="ch8Bean.*"

%><html>顯示記錄<head><title>JSP+JavaBean建表和</title></head><body><jsp:useBean

id="myBean"scope="page"class="ch8Bean.

QueryUpdate"/><h3>利用JSP+JavaBean模式創(chuàng)建數(shù)據(jù)庫中的student表的例子</h3><hr><%//創(chuàng)建數(shù)據(jù)庫中的student空表String

sql="create

table

student("+

"id

char(10),"+"name

char(15),"+"score

integer"+")";myBean.executeUpdate(sql); //執(zhí)行建表操作',80)";//

三條記錄sql="insert

into

student

values("+"'0001','myBean.executeUpdate(sql);sql="insertinto

student

values("+"'0002','高強',94)";myBean.executeUpdate(sql);',82)";記錄操作sql="insert

into

student

values("+"'0003','myBean.executeUpdate(sql); //執(zhí)行%><h4>

記錄并顯示表記錄</h4><p></td><td>分數(shù)</td><table

Border=1><tr><td>學號</td><td></tr><%//使用SQL命令顯示sudent表的所有記錄

sql="select

*

from

student";ResultSet

rs=myBean.executeQuery(sql);while(rs.next()){out.print(“<tr><td>”+rs.getString(“id”)+“</td>”);out.print(“<td>”+rs.getString(“name”)+“</td>”);out.print("<td>"+rs.getString("score")+"</td></tr>");out.print("<p>");}rs.close();myBean.close();%></table></body></html>圖8.13 c8_4.jsp的運行結(jié)果在這個例子中, 首先通過<%@

pageimport="ch8Bean.*"

%>指令將ch8Bean包引入JSP程序,接下來再通過<jsp:useBean

class="ch8Bean.QueryUpdate"/>將 在上一節(jié)創(chuàng)建的QueryUpdate這個JavaBean引入。這樣,只要在JSP程序中給出JavaBean中所要求的參數(shù)“sql”,就可以調(diào)用相應的方法執(zhí)行相關的數(shù)據(jù)庫操作。c8_4.jsp的運行結(jié)果如圖8.13所示。8.3.4

使用JSP+JavaBean修改記錄和刪除記錄【示例程序c8_5.jsp】用JSP+JavaBean模式,將TestDB數(shù)據(jù)庫student表中的 的成績改為86,并刪除學號為0002的記錄。<%@

page

contentType="text/html;

charset=GBK"

%><%@

page

language="java"

import="java.sql.*"import="ch8Bean.*"

%><%!

ResultSet

rs=null;int

result;String

sql;%><html><head><title>JSP+JavaBean表的查詢和更改</title></head><body><jsp:useBean

id="myBean"scope="page"class="ch8Bean.

QueryUpdate"/><h3>利用JSP+JavaBean模式在數(shù)據(jù)庫中更改和刪除表記錄的例子</h3><hr><h4>顯示原始sudent表的內(nèi)容</h4><table

Border=1><tr><td>學號</td><td>

</td><td>分數(shù)</td></tr><%sql="select

*

from

student";ResultSet

rs=myBean.executeQuery(sql);while(rs.next()){out.print("<tr><td>"+rs.getString("id")+"</td>");out.print("<td>"+rs.getString("name")+"</td>");out.print("<td>"+rs.getString("score")+"</td></tr>");out.print("<p>");}rs.close();%></table><%//使用SQL命令修改表中的記錄,將 的成績改為86'";sql="update

student

set

score=86

where

name='myBean.executeUpdate(sql); //執(zhí)行更改操作%><h4>顯示更改后的sudent表的內(nèi)容</h4><p><table

Border=1><tr></td><td>分數(shù)</td><td>學號</td><td></tr><%sql="select

*

from

student";rs=myBean.executeQuery(sql);while(rs.next()){out.print("<tr><td>"+rs.getString("id")+"</td>");out.print("<td>"+rs.getString("name")+"</td>");out.print("<td>"+rs.getString("score")+"</td></tr>");out.print(“<p>”);}rs.close();%></table><%//使用SQL命令刪除表中的記錄,刪除學號為0002的記錄sql=“delete

from

student

where

id=‘0002’”;myBean.executeUpdate(sql); //執(zhí)行刪除操作%><h4>顯示刪除一條記錄后的sudent表的內(nèi)容</h4><p></td><td>分數(shù)</td><table

Border=1><tr><td>學號</td><td></tr><%sql="select

*

from

student";rs=myBean.executeQuery(sql);while(rs.next()){out.print("<tr><td>"+rs.getString("id")+"</td>");out.print("<td>"+rs.getString("name")+"</td>");圖8.14 c8_5.jsp的運行結(jié)果out.print("<td>"+rs.getString("score")+"</td></tr>");out.print("<p>");}rs.close();myBean.close();%></table></body></html>c8_5.jsp的運行結(jié)果如圖8.14所示。通過8.3.2和8.3.3節(jié)的示例程序可以看出,在JavaBean中操作數(shù)據(jù)庫和在JSP中操作數(shù)據(jù)庫基本上一樣,不同的是JavaBean只負責執(zhí)行數(shù)據(jù)庫的操作,不關心顯示方面的邏輯。這樣就有效地實現(xiàn)了靜態(tài)模塊(表示層)和動態(tài)模塊

(邏輯層)的分離,實現(xiàn)了組件JavaBean重用的目標。大部分 都提供留言板,它是一個典型的JSP開發(fā)案例。它的基本功能是讓使用者撰寫留言或查看別人的留言。最簡單的留言界面如圖8.15所示。在留言板中,用戶需要輸入留言的標題、留言人的 、留言人的

和留言內(nèi)容。這里

所關心的是當用戶輸入內(nèi)容、點擊提交留言按鈕后,需要將這些信息保存到數(shù)據(jù)庫。因此,我們可以建立一個名為Message的數(shù)據(jù)庫,在這個庫中建立一個MessageTable表來存放留言人輸入的信息。MessageTable表的結(jié)構如表8.2所示。8.4

JSP+JavaBean留言板案例表8.2

MessageTable表字段名類

型描

述是否可以為空titleVarchar(100)留言的標題否nameVarchar(20)留言人的名字否Varchar(50)留言人的是contentVarchar(100)留言內(nèi)容否本留言板案例由五個模塊組成。其中,一個HTML文件提供用戶交互界面;兩個JavaBean文件用來封裝與數(shù)據(jù)庫有關的操作;兩個JSP文件執(zhí)行與顯示相關的操作。下面分別 這五個文件的功能以及它們之間的關系。8.4.1

填寫留言的界面填寫留言的界面示例程序為Messgages.html。它的執(zhí)行效果如圖8.15所示。留言界面程序中包含一個表單,點擊這個表單上的“提交留言”按鈕,則

addMessage.jsp頁面。圖8.15

Messgages.html的運行結(jié)果【示例程序Messgages.html】填寫留言的界面。<!--

Messgages.html

--><HTML><HEAD><TITLE>

messag</TITLE></HEAD><BODY><center>留言板</center><FORM

action="addMessage.jsp"

><TABLE border=1align="center"><TR><TD>

:</TD><TD><input

type="text"name="name"

size=25></TD></TR><TR><TD>

:</TD><TD><input

type="text"name=" "

size=25></TD></TR><TR><TD>

:</TD><TD><input

type="text"name="title"

size=25></TD></TR><TR><TD>留言:</TD><TD><textareaname="content"

rows=7

cols=25></textarea></TD></TR><TR><TD

colspan=3><TABLE

align="center"width="100%"

cellspacing="0"

cellpadding="0"><TR><TD

align="center"><input

type="submit"value="提交留言"></TD><TDalign="center"><ahref="viewMessages.jsp"><fontsize=2>查看留言</font></a></TD><TD

align="center"><input

type="reset"

value="重新填寫"></TD></TR></TABLE></TD></TR></TABLE></FORM></BODY></HTML>8.4.2

表示留言數(shù)據(jù)的JavaBean為了使addMessage.jsp程序更好地用JavaBean模式數(shù)據(jù)庫的數(shù)據(jù),獲取數(shù)據(jù)庫中的xy數(shù)據(jù)和修改xy數(shù)據(jù),我們建立一個表示留言數(shù)據(jù)的JavaBean(MessageData.java),主要表示用戶留言信息的屬性,每個屬性對應

MessageTable表中的一個字段,它們的類型也是對應的,每個屬性都定義了getXy()和setXy()方法,這樣就為JSP和JavaBean傳遞數(shù)據(jù)提供了方便?!臼纠绦騇essageData.java】建立一個表示留言數(shù)據(jù)的JavaBean。package

Message;public

class

MessageData{

private

String

name,

,title,content;//setter或者getter方法public

void

setName(String

name){

=name;})public

voidset{

this.

=(String;

}public

void

setTitle(String

title){

this.title=title;

}public

voidsetContent(String

content){

this.content=content;

}public

String

getName(){ return

;

}public

String

getContent(){ returnthis.content;

}public

String

getTitle(){ returnthis.title;

}public

String

get{ return

this.();

}}8.4.3

執(zhí)行數(shù)據(jù)庫操作的JavaBean該MessageBean主要用于連接數(shù)據(jù)庫,執(zhí)行數(shù)據(jù)庫操作,并且把結(jié)果返回到JSP頁面進行顯示?!臼纠绦騇essageBean.java】執(zhí)行數(shù)據(jù)庫操作的JavaBean。package

Message;import

java.sql.*;import

java.util.*;public

class

MessageBean{private

Connection

con;MessageData

msg;//獲得數(shù)據(jù)庫連接

public

MessageBean(){String

JDriver

="sun.jdbc.odbc.JdbcOdbcDriver";

//JDBC驅(qū)動程序?qū)ο骃tring

conURL="jdbc:odbc:message";//定義

JDBC的URL對象try

{Class.forName(JDriver);//加載JDBC-ODBC橋驅(qū)動程序con=DriverManager.getConnection(conURL);//連接數(shù)據(jù)庫URL}catch(Exception

e){

System.err.println(e.getMessage());

}}//設置成員變量的值public

void setMessage(MessageData

msg){ this.msg=msg;

}//添加一條留言消息public

void

addMessage()throws

Exception{1”);1");1");try{byte

b1[]=msg.getTitle().getBytes(“ISO-8859-String

ti=new

String(b1);byte

b2[]=msg.getName().getBytes("ISO-8859-String

na=new

String(b2);byte

b3[]=msg.get

().getBytes("ISO-8859-String

em=new

String(b3);byteb4[]=msg.getContent().getBytes("ISO-8859-1");String

c=newString(b4);PreparedStatementstm=con.prepareStatement("insert

into

MessageTablevalues(?,?,?,?)");stm.setString(1,ti);stm.setString(2,na);if((msg.get()).length()==0)stm.setString(3,null);elsestm.setString(3,em);stm.setString(4,c);try{

stm.executeQuery();

}catch(Exception

e){}

con.close(); //關閉數(shù)據(jù)庫連接}catch(Exception

e){

e.printStackTrace(); throw

e;}//獲得所有留言消息,并返回結(jié)果到JSP頁面

public

Collection

getAllMessage()throws

Exception{Collection

ret=new

ArrayList();try}{Statement

stm=con.createStatement();ResultSetresult=stm.executeQuery("select

count(*)

fromMessageTable");int

message_count=0;if(result.next()){

message_count=result.getInt(1);result.close();

}if(message_count>0){

result=stm.executeQuery("select*

from

MessageTable

");while(result.next()){

Stringtitle=result.getString("title");Stringname=result.getString("name");String=result.getString("");Stringcontent=result.getString("content");MessageDatamessage=new

MessageData();message.setTitle(title);message.setName(name);message.set

();message.setContent(content);ret.add(message);//填加message對象到ret容器中}result.close();

stm.close();}con.close();}catch(Exception

e){

e.printStackTrace();return

ret;throw

e;

}}}MessageBean類包含一個類為MessageData的msg對象。

addMessage.jsp頁面將表單提交的留言數(shù)據(jù)通過

MessageBean.setMessage(MessageData

msg)方法傳遞給msg。在MessageBean中建立了兩個執(zhí)行數(shù)據(jù)庫操作的方法:

addMessage()方法的主要功能是把對象msg中的信息添加到數(shù)據(jù)庫中;getAllMessage()方法的主要功能是獲得所有留

言,然后通過setXy()方法寫入MessageData的message對象

中,最后再通過Java類庫中Collection(集合)類的ret對象返

回結(jié)果到JSP頁面。程序中的Collection

類是可以 不同類型數(shù)據(jù)的集合,集合的長度可以動態(tài)變化。Collection

ret=newArrayList();語句表示創(chuàng)建一個空的Collection類的對象ret,其緩沖區(qū)長度為10。ret對象是一個序列容器對象,它的每個元素都可以存放一個對象,可以通過下標 或得到元素的值。程序中ret.add(message);語句表示填加message對象到ret容器中。8.4.4

添加留言的JSP頁面這個JSP頁面程序的主要功能是調(diào)用JavaBean,實現(xiàn)向數(shù)據(jù)庫中添加留言的操作。【示例程序addMessage.jsp】添加留言的JSP程序。<%@

page

language="java"

contentType="text/html;charset=GBK"

pageEncoding="GBK"%><jsp:useBean

id="Mdata"

class="Message.MessageData"scope="page"><jsp:setProperty

name="Mdata"property="*"/></jsp:useBean><jsp:useBean

id="myBean"class="Message.MessageBean"

scope="page"/><HTML><HEAD><meta

http-equiv="Content-Type"

content="text/html;charset=GBK"><TITLE>

add

message

into

table

</TITLE></HEAD><BODY><%try{

myBean.setMessage(Mdata);myBean.addMessage();}catch(Exception

e)

{

e.printStackTrace();}%><jsp:forward

page="viewMessages.jsp"

/></BODY></HTML>在這個程序中,通過下列語句:<jsp:useBean

id="Mdata"

class="Message.MessageData"scope="page"><jsp:setPr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論