web bjsp19周五-課件太原理工第8章和javabean_第1頁
web bjsp19周五-課件太原理工第8章和javabean_第2頁
web bjsp19周五-課件太原理工第8章和javabean_第3頁
web bjsp19周五-課件太原理工第8章和javabean_第4頁
web bjsp19周五-課件太原理工第8章和javabean_第5頁
已閱讀5頁,還剩144頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第八章JSP與JavaBean2JavaBeanJavaBean是可重用組件可重用組件可在多個(gè)應(yīng)用程序中使用

可以跨平臺(tái)JavaBean的優(yōu)點(diǎn)3JavaBean應(yīng)用示例下面通過一個(gè)具體的例子來說明JavaBean的編寫。這個(gè)例子由兩個(gè)文件組成:一個(gè)是名為C8_1.java的JavaBean;另一個(gè)是名為C8_1.jsp的調(diào)用這個(gè)JavaBean的JSP程序。示例程序C8_1.java:一個(gè)具有簡單屬性的JavaBeanpackagech8Bean;

publicclassC8_1

{privateintaa1,aa2=4;//aa1,aa2為成員變量名

privatebooleanbb1;//bb1為成員變量名

publicC8_1() //該類的構(gòu)造方法

{aa1=1;bb1=false;}

publicintgetAa1()//返回aa1的值

{returnthis.aa1;}

publicvoidsetAa1(inta) //設(shè)置aa1的值

{this.aa1=a;}

返回5示例程序C8_1.java

publicbooleanisBb1() //返回bb1的值

{returnthis.bb1;}

publicvoidsetBb1(booleanb)//設(shè)置bb1的值

{this.bb1=b;}publicintadd()//返回計(jì)算的值

{return2+aa2+aa1;}

}//類C8_1()的結(jié)束

返回6示例程序C8_1.jsp,調(diào)用JavaBean

<%@pagecontentType=“text/html;charset=UTF-8”import=“ch8Bean.*”%>

<html>

<head><title>JSP中使用Bean</title></head><body>

<jsp:useBeanid="myBean"scope="page"class="ch8Bean.C8_1"/>

<h3>在JSP中使用一個(gè)具有簡單屬性的JavaBean的例子</h3><hr>

第一次調(diào)用getAa1()和getBb1()的值:

<%=myBean.getAa1()%>

<%=myBean.isBb1()%>7示例程序C8_1.jsp,調(diào)用JavaBean

<p>修改aa1與bb1后getAa1()和getBb1()返回的值是:

<jsp:setPropertyname="myBean"property="aa1"value="5"/>

<br><jsp:getPropertyname="myBean"property="aa1"/>

<jsp:setPropertyname="myBean"property="bb1"value="true"/>

<jsp:getPropertyname="myBean"property="bb1"/>8示例程序C8_1.jsp,調(diào)用JavaBean

<p>調(diào)add()方法,返回值是:

<%=myBean.add()%>

</body>

</html>運(yùn)行結(jié)果如下頁圖。9圖4c8_1.jsp的運(yùn)行結(jié)果10用MyEclipse建立JavaBean當(dāng)建立了ch8項(xiàng)目后,應(yīng)先創(chuàng)建和存放C8_1.java文件。方法:在“ch8”文件夾上單擊右鍵,出現(xiàn)快捷菜單。在出現(xiàn)的快捷菜單中依次單擊“New”/“Class”,彈出“新建Java類”對(duì)話框,如圖2所示。11圖8.1建立C8_1.java程序12圖2“新建Java類”對(duì)話框13用MyEclipse建立JavaBean在圖2中的“包”處寫入“ch8Bean”,“名稱”處寫入“C8_1”。這兩項(xiàng)數(shù)據(jù)的作用是指明C8_1.java程序存放在E:\Myeclipse10\ch8\src\ch8Bean文件夾中。(注意:E:\Myeclipse10是workspace的位置)當(dāng)然,編譯后的C8_1.class也會(huì)自動(dòng)存放在E:\Myeclipse10\ch8\WebRoot\WEB-INF\classes\ch8Bean文件夾中。14單擊“完成”后,出現(xiàn)如圖3所示的界面。這個(gè)界面的中部即為編寫JavaBean程序的位置,在此處書寫C8_1.java程序。15圖3C8_1.java程序的存放位置16

用MyEclipse建立JavaBean編寫完上述程序后,就可以運(yùn)行JSP程序了。17JavaBean的創(chuàng)建創(chuàng)建一個(gè)標(biāo)準(zhǔn)JavaBean的基本過程如下:定義包名稱定義JavaBean類定義JavaBean類的構(gòu)造函數(shù)定義JavaBean屬性設(shè)定JavaBean屬性值的方法讀取JavaBean屬性值的方法18定義JavaBean類JavaBean類定義的語法結(jié)構(gòu)如下:

publicclass類名稱

{//類成員的定義

//類方法的定義。

//類屬性的定義。

}19定義JavaBean類編寫JavaBean就是編寫一個(gè)java的類。類的方法命名上遵守以下規(guī)則:類名稱與保存的文件名稱必須一致,否則就會(huì)出現(xiàn)編譯錯(cuò)誤。類中方法的訪問屬性都必須是公有類。類中如果有構(gòu)造方法,那么這個(gè)構(gòu)造方法也是public的并且是無參數(shù)的。20定義構(gòu)造函數(shù)JavaBean是Java類,它有自己的構(gòu)造函數(shù),并且構(gòu)造函數(shù)的名稱必須與JavaBean類的名稱一致。構(gòu)造函數(shù)的主要作用是用來初始化,而且構(gòu)造函數(shù)無參數(shù)輸入。21定義構(gòu)造函數(shù)構(gòu)造函數(shù)的語法結(jié)構(gòu)如下:

publicJavaBean類名稱

{//初始化

……..}22定義JavaBean屬性JavaBean是Java類,那么它不但有自己的構(gòu)造函數(shù),還有自己的屬性。JavaBean屬性的定義的語法結(jié)構(gòu)如下:

private數(shù)據(jù)類型屬性名稱;例如:privateintaa1;23設(shè)定屬性值的方法定義了JavaBean屬性之后,還要對(duì)其屬性值進(jìn)行設(shè)定,其屬性值設(shè)定的語法結(jié)構(gòu)如下:

publicvoidset設(shè)定方法名稱(數(shù)據(jù)類型參數(shù)){this.變量=參數(shù);}24設(shè)定屬性值的方法例如:

publicvoidsetAa1(inta){this.aa1=a;}值得注意的是:JavaBean屬性值的設(shè)定方法名稱一般以set三個(gè)字母開頭,后面跟上屬性設(shè)定方法名稱。25讀取屬性值的方法JavaBean屬性值讀取的語法結(jié)構(gòu)如下:

publicvoidget讀取方法名稱(){returnthis.變量;}例如:

publicvoidgetAa1(){returnthis.aa1;}26Get()和Set()方法JavaBean的屬性Get()方法Set()方法定義了公有方法Get()方法返回值定義了公有方法Set()方法給屬性賦值訪問JavaBean的屬性27Get()和Set()方法importjava.io.*;publicclassMyBean{ privateStringname; publicMyBean(){ }publicStringgetName(){ returnname;}publicvoidsetName(Stringmyname){ name=myname;}}將name屬性聲明為私有屬性不帶參數(shù)的默認(rèn)構(gòu)造函數(shù)get()方法返回一個(gè)值Set()方法設(shè)置一個(gè)值28導(dǎo)入JavaBean類通過<%@pageimport>指令導(dǎo)入JavaBean類,例如:

<%@pageimport="mypack.CounterBean"%>29標(biāo)準(zhǔn)動(dòng)作用于:將JavaBean嵌入JSP頁面設(shè)置和獲取JavaBean的屬性將用戶請(qǐng)求轉(zhuǎn)發(fā)給其他頁面將其他頁面的內(nèi)容嵌入當(dāng)前頁面JSP中的標(biāo)準(zhǔn)動(dòng)作使用<jsp>作為前綴JSP使用JavaBeanJavaBeanJSP可使用JSP標(biāo)準(zhǔn)動(dòng)作調(diào)用JavaBean組件并訪問屬性JSP頁面30useBean動(dòng)作<jsp:useBean>標(biāo)簽用來聲明JavaBean對(duì)象,其格式如下:<jsp:useBeanid=“名稱”scope=“范圍”class=“類名稱”type=“類的類型”>31useBean動(dòng)作...<head><jsp:useBeanid="MyBean"class=“ch8Bean.C8_1"scope="page"/></head>...創(chuàng)建引用并嵌入現(xiàn)有的Beanid屬性創(chuàng)建對(duì)class屬性中所述類的引用,相當(dāng)于一個(gè)指針例如:JSP引擎在創(chuàng)建Bean對(duì)象時(shí)將調(diào)用其無參數(shù)的構(gòu)造方法來初始化Bean屬性32useBean動(dòng)作范圍指定JavaBean在JSP頁面中的可用性。各種范圍選項(xiàng)如下:范圍描述pageBean只能在使用頁面時(shí)使用。當(dāng)加載新頁面時(shí),就會(huì)將其銷毀requestBean在用戶對(duì)其發(fā)出請(qǐng)求時(shí)存在sessionBean一直存在于會(huì)話中,直至其終止或被刪除為止applicationBean在整個(gè)應(yīng)用程序中均可使用33scope取值pageJSP引擎分配給每個(gè)客戶的beans是互不相同的,也就是說,盡管每個(gè)客戶的beans的功能相同,但它們占有不同的內(nèi)存空間。34scope取值page此時(shí)beans的有效范圍是當(dāng)前頁面,當(dāng)客戶離開這個(gè)頁面時(shí),JSP引擎取消分配給該客戶的beans:當(dāng)前頁面結(jié)束的情況:當(dāng)客戶請(qǐng)求訪問的當(dāng)前JSP網(wǎng)頁通過<forward>標(biāo)記將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)文件時(shí);當(dāng)客戶請(qǐng)求訪問的當(dāng)前JSP頁面執(zhí)行完畢并向客戶端發(fā)回響應(yīng)時(shí)。35scope取值pagepackagech8Bean;

publicclassC8_2

{privateintcount=0;//定義一個(gè)私有變量

publicintgetCount()

{return(this.count);}

publicvoidsetCount(intc)

{this.count+=c;}

publicvoidincrease()

{this.count++;}

}C8_2.java訪問計(jì)數(shù)器的Bean返回36scope取值page<%@pagecontentType="text/html;charset=GBK"import="ch8Bean.*"%>

<html><body>

<h3>使用PageScope</h3><hr><!--以下三句實(shí)例化cn對(duì)象-->

<jsp:useBeanid="cn"scope="page"class="ch8Bean.C8_2"/>

<jsp:setPropertyname="cn"property="count"value="4"/>C8-2.jsp訪問計(jì)數(shù)器Bean的JSP程序37scope取值page<!--該語句只有創(chuàng)建新對(duì)象時(shí)才執(zhí)行-->

<%cn.increase();%>

<!--在網(wǎng)頁上顯示計(jì)數(shù)器結(jié)果-->

<br><jsp:getPropertyname="cn"property="count"/>

</body>

</html>C8-2.jsp38

圖8.6瀏覽器刷新后執(zhí)行的結(jié)果解釋:以上程序中,scope=“page”,每當(dāng)運(yùn)行或重新刷新JSP程序時(shí),計(jì)數(shù)器值始終保持不變。這是因?yàn)楫?dāng)JSP程序執(zhí)行完成,屬于PageScope的Bean對(duì)象就被清除,生命周期結(jié)束。當(dāng)刷新時(shí)(相當(dāng)于重新執(zhí)行一遍JSP程序),執(zhí)行JSP的useBean動(dòng)作,又產(chǎn)生一個(gè)新的Bean對(duì)象傳送到客戶端,計(jì)數(shù)器重新計(jì)數(shù),所以刷新后計(jì)數(shù)器值仍是5。3940scope取值session如果客戶在多個(gè)頁面中相互連接,每個(gè)頁面都含有一個(gè)useBean標(biāo)簽,這些useBean標(biāo)簽中id的值相同,并且scope的值都是session,那么,該客戶在這些頁面得到的beans是相同的一個(gè)。41如果客戶在某個(gè)頁面更改了這個(gè)beans的屬性,其它頁面的這個(gè)beans的屬性也將發(fā)生同樣的變化。當(dāng)客戶關(guān)閉瀏覽器時(shí),JSP引擎取消分配給客戶的beans。以下例子,我們將beans的scope的值設(shè)為session。42scope取值session<%@pagecontentType="text/html;charset=GBK"import="ch8Bean.*"%>

<html><body>

<h3>使用SessionScope</h3><hr>

<jsp:useBeanid="cn"scope=“session"class="ch8Bean.C8_2"/>

<jsp:setPropertyname="cn"property="count"value="4"/>

<%cn.increase();%>

<br><jsp:getPropertyname="cn"property="count"/></body></html>演示:示例2C8-2.jsp返回43

圖8.7第一個(gè)瀏覽器執(zhí)行的結(jié)果圖8.5第一個(gè)瀏覽器執(zhí)行的結(jié)果44

圖8.8第二個(gè)瀏覽器執(zhí)行的結(jié)果圖8.6第二個(gè)瀏覽器執(zhí)行的結(jié)果45scope取值session當(dāng)刷新瀏覽器產(chǎn)生新的請(qǐng)求時(shí),不會(huì)再產(chǎn)生新的Bean對(duì)象來處理這個(gè)請(qǐng)求,如圖8.5所示,而是將原來的計(jì)數(shù)器對(duì)象的計(jì)數(shù)值繼續(xù)增加,即5+4。

如果再打開一個(gè)新的瀏覽器窗口,在兩個(gè)瀏覽器窗口分別執(zhí)行這個(gè)程序。此時(shí)建立了兩個(gè)客戶端應(yīng)用,將會(huì)看到兩個(gè)窗口的計(jì)數(shù)器是各自獨(dú)立計(jì)數(shù)的。因?yàn)橛袃蓚€(gè)session。

原來的值新的值46scope取值sessionsetCount(intc){count=count+c}increase(){count=count+1}session頁面每次增加5的原因:第1次創(chuàng)建新的Bean對(duì)象(即cn對(duì)象),然后執(zhí)行<jsp:setProperty>動(dòng)作(此時(shí)的count為4),即調(diào)用C8_2類中的setCount(intc)方法,setCount方法的count=c+count=4+0,調(diào)用increase()變5。此時(shí)顯示count的值為5。解釋:然后刷新(相當(dāng)于再執(zhí)行1次C8_2.jsp)。此時(shí)不創(chuàng)建新的cn對(duì)象,直接取出cn對(duì)象,cn對(duì)象的屬性count值仍為5。然后執(zhí)行<jsp:setProperty>動(dòng)作(此時(shí)的count為4),即調(diào)用C8_2類中的setCount(intc)方法,即setCount(intc)c為4,count為5。調(diào)用setCount方法,count=count+c=5+4=9;然后再調(diào)用increase(),count=count+1=9+1=10,此時(shí)顯示count的值為10。所以每次都是+5。47scope取值request客戶每次請(qǐng)求訪問JSP頁面時(shí),都會(huì)創(chuàng)建新的JavaBean對(duì)象。JavaBean對(duì)象的有效范圍為:客戶請(qǐng)求訪問的當(dāng)前JSP網(wǎng)頁;和當(dāng)前JSP網(wǎng)頁共享同一個(gè)客戶請(qǐng)求的網(wǎng)頁,即當(dāng)前網(wǎng)頁中<forward>標(biāo)記包含的其他JSP文件;當(dāng)所有共享同一個(gè)客戶請(qǐng)求的JSP頁面執(zhí)行完畢并向客戶端發(fā)回響應(yīng)時(shí),JavaBean對(duì)象結(jié)束生命周期。48scope取值request<%@pagecontentType="text/html;charset=GBK"import="ch8Bean.*"%>

<html><body>

<h3>使用RequestScope</h3><hr>

<jsp:useBeanid="cn"scope=“request"class="ch8Bean.c8_2"/>

<jsp:setPropertyname="cn"property="count"value="4"/>

<%cn.increase();%>

<br><jsp:getPropertyname="cn"property="count"/></body></html>演示:示例2C8-2.jsp49

圖8.9設(shè)置為request時(shí)的運(yùn)行結(jié)果50■當(dāng)把Scope設(shè)置為request時(shí),只能通過forward標(biāo)簽將Bean傳送給下一個(gè)JSP。

■當(dāng)一個(gè)JSP程序通過forward標(biāo)簽將request對(duì)象傳送給下一個(gè)JSP程序時(shí),屬于requestScope的Bean也將會(huì)隨著request對(duì)象送出。此時(shí),由forward標(biāo)簽所串聯(lián)起來的JSP程序可以共享相同的Bean。51scope取值applicationJSP引擎為每個(gè)客戶分配一個(gè)共享的beans,也就是說,所有客戶共享這個(gè)beans,如果一個(gè)客戶改變這個(gè)beans的某個(gè)屬性的值,那么所有客戶的這個(gè)beans的屬性值都發(fā)生了變化。這個(gè)beans直到服務(wù)器關(guān)閉才被取消。52scope取值application以下例子將beans的scope的值設(shè)為application。如果打開兩個(gè)瀏覽器窗口,在兩個(gè)瀏覽器窗口中分別執(zhí)行C8_2.jsp程序。此時(shí),將會(huì)看到兩個(gè)客戶端共用一個(gè)cn對(duì)象,兩個(gè)窗口內(nèi)的計(jì)數(shù)器的值是相互連續(xù)的,就如同在一個(gè)瀏覽器窗口中執(zhí)行了C8_2.jsp程序一樣,如圖8.8所示。然后再刷新它一次,如圖8.9所示。當(dāng)關(guān)閉瀏覽器后再打開瀏覽器并執(zhí)行C8_2.jsp程序時(shí),Bean的count值再次發(fā)生變化,就如同對(duì)此程序再刷新一次的效果是一樣的,直到關(guān)閉服務(wù)器。53<%@pagecontentType="text/html;charset=GBK"import="ch8Bean.*"%>

<html><body>

<h3>使用PageScope</h3><hr>

<jsp:useBeanid="cn"scope=“application"class="ch8Bean.C8_2"/>

<jsp:setPropertyname="cn"property="count"value="4"/>

<%cn.increase();%>

<br><jsp:getPropertyname="cn"property="count"/></body></html>scope取值applicationC8-2.jsp54

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

圖8.9第二個(gè)瀏覽器執(zhí)行的結(jié)果56scope取值pagepackagech8Bean;

publicclassc8_2

{privateintcount;//定義一個(gè)私有變量

publicintgetCount()

{return(this.count);}

publicvoidsetCount(intc)

{count=c+10;}

publicvoidincrease()

{this.count++;}

}c8_2.java訪問計(jì)數(shù)器的Bean(改一下程序)返回57scope取值page<%@pagecontentType="text/html;charset=GBK"import="ch8Bean.*"%>

<html><body>

<h3>使用PageScope</h3><hr>

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

<jsp:setPropertyname="cn"property="count"value="4"/><%cn.increase();%>

<br><jsp:getPropertyname=“cn”property=“count”/>

</body></html>c8-2.jsp訪問計(jì)數(shù)器Bean的JSP程序58程序運(yùn)行結(jié)果為15。解釋:實(shí)際上<jsp:setPropertyname=“cn”property=“count”value=“4”/>將參數(shù)置為4,即將JavaBean(c8_2.java)中的setCount(intc)中的參數(shù)設(shè)為4,count=10+4=14,increase()后則count=count+1=14+1=15。59JSP標(biāo)準(zhǔn)動(dòng)作JSP標(biāo)準(zhǔn)動(dòng)作包括:JSP標(biāo)準(zhǔn)動(dòng)作<jsp:useBean><jsp:setProperty><jsp:getProperty><jsp:include><jsp:forward>60setProperty動(dòng)作...<head><jsp:useBeanid="BeanID"class="MyBean"scope="session"/><jsp:setPropertyname=“BeanID”property=“name”value=“示例"/></head>...設(shè)置JavaBean在JSP頁面中的屬性name屬性指定對(duì)JavaBean類的引用指定JavaBean的屬性名稱61getProperty動(dòng)作...<head><jsp:useBeanid="BeanID"class="MyBean"scope="page"/><jsp:setPropertyname="BeanID"property=“name”value=“示例"/></head><body><jsp:getPropertyname="BeanID"property="name"/></body>...獲取JavaBean中指定的屬性的值name屬性指定對(duì)JavaBean類的引用property屬性指定JavaBean的屬性名稱62使用JavaBean訪問數(shù)據(jù)庫把所有的訪問數(shù)據(jù)庫的代碼全部寫入JSP頁面中,不利于程序的維護(hù)。為了使代碼能得到很好的重用,可以把訪問數(shù)據(jù)庫的代碼寫在一個(gè)JavaBean中,而在需要書寫類似代碼的JSP頁面中通過<jsp:useBean>動(dòng)作將這個(gè)JavaBean引入即可。8.3.1使用JSP+JavaBean查詢數(shù)據(jù)庫下面的程序,有兩個(gè)文件。CoQury.java是一個(gè)JavaBean,負(fù)責(zé)連接與查詢數(shù)據(jù)庫操作;CoQue.jsp調(diào)用JavaBean,實(shí)現(xiàn)頁面的顯示功能。63程序運(yùn)行界面:6465連接和查詢數(shù)據(jù)庫的JavaBeanpackagech8Bean;importjava.sql.*;publicclassCoQury{privateConnectioncon=null;privateStatementstmt=null;privateResultSetrst=null;CoQury.java內(nèi)容如下:66publicCoQury(){StringdriverName="com.mysql.jdbc.Driver";StringuserName="root";//數(shù)據(jù)庫用戶名StringuserPasswd="";//數(shù)據(jù)庫存取密碼StringdbName="test";//數(shù)據(jù)庫名StringtableName="userinfo";//數(shù)據(jù)庫中的表名Stringurl="jdbc:mysql://localhost:3306/"+dbName;//連接數(shù)據(jù)庫的URL連接和查詢數(shù)據(jù)庫的JavaBean67try{Class.forName(driverName);//加載JDBC驅(qū)動(dòng)程序}catch(ClassNotFoundExceptione){System.out.println("不能加載驅(qū)動(dòng)程序!");}try{con=DriverManager.getConnection(url,userName,userPasswd);//連接數(shù)據(jù)庫}catch(SQLExceptioner){System.out.println("不能連接數(shù)據(jù)庫");}}//構(gòu)造函數(shù)CoQury()結(jié)束連接和查詢數(shù)據(jù)庫的JavaBean返回68//execQuery方法用于記錄的查詢,入口參數(shù)為sql語句,返回ResultSet對(duì)象publicResultSetexecQuery(Stringsql){try{stmt=con.createStatement();//創(chuàng)建Statement類的對(duì)象rst=stmt.executeQuery(sql);//執(zhí)行查詢,得到查詢結(jié)果集}catch(SQLExceptioner){System.out.println("ErrorexecuteQuery,不能執(zhí)行查詢!");}returnrst;}//execQuery()結(jié)束連接和查詢數(shù)據(jù)庫的JavaBean返回69publicvoidclose(){try{stmt.close();con.close();}catch(SQLExceptionex){System.err.println(ex.getMessage());}}//close()結(jié)束}//類CoQury結(jié)束連接和查詢數(shù)據(jù)庫的JavaBean70<%@pagecontentType="text/html;charset=UTF-8"import="java.sql.*"%><%@pageimport="ch8Bean.*"%><html><head><title>JSP+JavaBean顯示記錄</title></head><body><jsp:useBeanid="myBean"scope="page"class="ch8Bean.CoQury"/><h3>JSP+JavaBean模式訪問數(shù)據(jù)庫的例子</h3>調(diào)用JavaBean的JSP程序調(diào)用JavaBean,實(shí)現(xiàn)頁面顯示功能的JSP程序CoQue.jsp內(nèi)容如下:解釋:<jsp:useBeanid="myBean"scope="page"class="ch8Bean.CoQury"/>執(zhí)行useBean動(dòng)作,將創(chuàng)建一個(gè)Bean對(duì)象,id是myBean。而Bean對(duì)象表示CoQury.java,創(chuàng)建對(duì)象那么會(huì)調(diào)用構(gòu)造函數(shù)CoQury(),這個(gè)構(gòu)造函數(shù)的作用是連接數(shù)據(jù)庫。7172從MYSQL數(shù)據(jù)庫中讀出的數(shù)據(jù)如下:<hr><tableborder=1><tr><th>用戶登錄號(hào)</th><th>姓名</th><th>性別</th><th>出生日期</th><th>興趣愛好</th></tr><%//使用SQL命令顯示所有記錄Stringsql="SELECT*FROMuserinfo";ResultSetrst=myBean.execQuery(sql);調(diào)用JavaBean的JSP程序73while(rst.next()){out.println("<tr>");out.println("<td>"+rst.getString("userId")+"</td>");out.println("<td>"+rst.getString("Name")+"</td>");out.println("<td>"+rst.getString("Sex")+"</td>");out.println("<td>"+rst.getString("BirthDate")+"</td>");out.println("<td>"+rst.getString("Interest")+"</td>");out.println("</tr>");}調(diào)用JavaBean的JSP程序74rst.close();myBean.close();%></table></body></html>調(diào)用JavaBean的JSP程序程序運(yùn)行界面:7576

使用JSP+JavaBean模式查詢userinfo表,插入一條記錄,最后,顯示userinfo表的所有記錄。

8.3.3執(zhí)行各種數(shù)據(jù)庫操作的JavaBean程序運(yùn)行界面:7778查詢和操作數(shù)據(jù)庫的JavaBeanpackagech8Bean;importjava.sql.*;publicclassQueryUpdate{privateConnectioncon=null;privateStatementstmt=null;privateResultSetrs=null;QueryUpdate.java內(nèi)容如下:79查詢和操作數(shù)據(jù)庫的JavaBeanpublicQueryUpdate(){StringdriverName="com.mysql.jdbc.Driver";StringuserName="root";//數(shù)據(jù)庫用戶名StringuserPasswd="";//數(shù)據(jù)庫存取密碼StringdbName="test";//數(shù)據(jù)庫名StringtableName="userinfo";//數(shù)據(jù)庫中的表名Stringurl="jdbc:mysql://localhost:3306/"+dbName;//連接數(shù)據(jù)庫的URL80查詢和操作數(shù)據(jù)庫的JavaBeantry{Class.forName(driverName);//加載JDBC驅(qū)動(dòng)}catch(ClassNotFoundExceptione){System.out.println("不能加載驅(qū)動(dòng)程序!");}try{con=DriverManager.getConnection(url,userName,userPasswd);//連接數(shù)據(jù)庫}catch(SQLExceptioner){System.out.println("不能連接數(shù)據(jù)庫");}}//構(gòu)造函數(shù)QueryUpdate()結(jié)束返回81查詢和操作數(shù)據(jù)庫的JavaBeanpublicvoidexecute(Stringsql){try{stmt=con.createStatement();//創(chuàng)建Statement類的對(duì)象stmt.execute(sql);//執(zhí)行SQL命令}catch(SQLExceptionex){System.err.println("execute:"+ex.getMessage());}}//execute()函數(shù)結(jié)束返回82查詢和操作數(shù)據(jù)庫的JavaBeanpublicvoidexecuteUpdate(Stringsql){try{stmt=con.createStatement();//創(chuàng)建Statement類的對(duì)象stmt.executeUpdate(sql);//執(zhí)行SQL命令}catch(SQLExceptionex){System.err.println("execute:"+ex.getMessage());}}//函數(shù)executeUpdate結(jié)束83查詢和操作數(shù)據(jù)庫的JavaBeanpublicResultSetexecuteQuery(Stringsql){try{stmt=con.createStatement();//創(chuàng)建Statement類的對(duì)象rs=stmt.executeQuery(sql);//執(zhí)行查詢,得到查詢結(jié)果集}catch(SQLExceptioner){System.out.println("不能執(zhí)行查詢!");}returnrs;}//函數(shù)executeQuery結(jié)束返回84查詢和操作數(shù)據(jù)庫的JavaBeanpublicvoidclose(){try{stmt.close();con.close();}catch(SQLExceptionex){System.err.println(ex.getMessage());}}//close()結(jié)束}//類QueryUpdate結(jié)束返回85調(diào)用JavaBean實(shí)現(xiàn)向數(shù)據(jù)庫添加數(shù)據(jù)的JSP程序<%@pagecontentType="text/html;charset=UTF-8"import="java.sql.*"%><%@pageimport="ch8Bean.*"%><jsp:useBeanid="myBean"scope="page"class="ch8Bean.QueryUpdate"/><html><body><DIVALIGN="center">解釋:塊標(biāo)記,將位于該標(biāo)記間的文本作為一節(jié),進(jìn)行格式設(shè)置。DIV:division分割JSP程序C8_4m.jsp如下所示:解釋:<jsp:useBeanid="myBean"scope="page"class="ch8Bean.QueryUpdate"/>執(zhí)行useBean動(dòng)作,將創(chuàng)建一個(gè)Bean對(duì)象,id是myBean。而Bean對(duì)象表示QueryUpdate.java,創(chuàng)建對(duì)象那么會(huì)調(diào)用構(gòu)造函數(shù)QueryUpdate(),這個(gè)構(gòu)造函數(shù)的作用是連接數(shù)據(jù)庫。8687調(diào)用JavaBean實(shí)現(xiàn)向數(shù)據(jù)庫添加數(shù)據(jù)的JSP程序<h3>JSP+JavaBean模式向數(shù)據(jù)庫中插入數(shù)據(jù)</h3><hr>插入前先查詢輸出,瀏覽已有數(shù)據(jù)<hr></DIV><tableALIGN="center"border=1><tr><th>用戶登錄號(hào)</th><th>姓名</th><th>性別</th><th>出生日期</th><th>興趣愛好</th></tr><%//使用SQL命令顯示所有記錄Stringsql="SELECT*FROMuserinfo";ResultSetrst=myBean.executeQuery(sql);while(rst.next())88調(diào)用JavaBean實(shí)現(xiàn)向數(shù)據(jù)庫添加數(shù)據(jù)的JSP程序{out.println("<tr>");out.println("<td>"+rst.getString("userId")+"</td>");out.println("<td>"+rst.getString("Name")+"</td>");out.println("<td>"+rst.getString("Sex")+"</td>");out.println("<td>"+rst.getString("BirthDate")+"</td>");out.println("<td>"+rst.getString("Interest")+"</td>");out.println("</tr>");}rst.close();%></table>89調(diào)用JavaBean實(shí)現(xiàn)向數(shù)據(jù)庫添加數(shù)據(jù)的JSP程序<DIVALIGN="center"><BR>插入數(shù)據(jù)后改變表格屬性再瀏覽<hr></DIV><tableALIGN="center"border=1><tr><th>用戶登錄號(hào)</th><th>姓名</th><th>性別</th><th>出生日期</th><th>興趣愛好</th></tr><%Stringstr="'1008'"+","+"'曹玉和'"+","+"'男'"+","+"'1931-03-18'"+","+"'讀報(bào)'";//相當(dāng)于str=‘1008’,’曹玉和’,’男’,’1931-03-18’,’讀報(bào)’Stringsql1="insertintouserinfovalues("+str+")";//相當(dāng)于insertintouserinfovalues(‘1008’,’曹玉和’,’男’,’1931-03-18’,’讀報(bào)’)myBean.execute(sql1);90調(diào)用JavaBean實(shí)現(xiàn)向數(shù)據(jù)庫添加數(shù)據(jù)的JSP程序Stringsql2="SELECT*FROMuserinfo";ResultSetrs=myBean.executeQuery(sql2);while(rs.next()){out.println("<tr>");out.println("<td>"+rs.getString("userId")+"</td>");out.println("<td>"+rs.getString("Name")+"</td>");out.println("<td>"+rs.getString("Sex")+"</td>");out.println("<td>"+rs.getString("BirthDate")+"</td>");out.println("<td>"+rs.getString("Interest")+"</td>");out.println("</tr>");}91調(diào)用JavaBean實(shí)現(xiàn)向數(shù)據(jù)庫添加數(shù)據(jù)的JSP程序rs.close();myBean.close();

%></table></body></html>程序運(yùn)行界面:9293留言板案例現(xiàn)在有很多網(wǎng)站都提供留言板,它的基本功能是讓使用者撰寫留言或查看別人的留言??梢杂肑SP來進(jìn)行開發(fā)。94留言板案例我們可以建立一個(gè)名為Message的數(shù)據(jù)庫,在這個(gè)庫中建立一個(gè)MessageTable表來存放留言人輸入的信息。字段名類型描述是否可以為空titlevarchar(100)留言的標(biāo)題否namevarchar(20)留言人的名字否emailvarchar(50)留言人的email是contentvarchar(100)留言內(nèi)容否95留言板案例本留言板案例由五個(gè)模塊組成。其中:一個(gè)HTML文件提供用戶交互界面兩個(gè)JavaBean文件用來封裝與數(shù)據(jù)庫有關(guān)的操作兩個(gè)JSP文件執(zhí)行與顯示相關(guān)的操作下面分別討論這五個(gè)文件的功能以及它們之間的關(guān)系。96留言板案例

<HTML><HEAD><TITLE>messageboard</TITLE></HEAD>

<BODY><center>留言板</center>

<FORMaction="addMessage.jsp">

<TABLEborder=1align="center">

<TR><TD>姓名:</TD><TD><inputtype="text"name="name"size=25></TD></TR>

填寫留言的界面示例程序Messages.html運(yùn)行結(jié)果97填寫留言的界面示例程序Messages.html<TR><TD>E-mail:</TD><TD><inputtype="text"name="email"size=25></TD></TR>

<TR><TD>主題:</TD><TD><inputtype="text"name="title"size=25></TD></TR><TR><TD>留言:</TD><TD><textareaname="content"rows=7cols=25></textarea></TD></TR>

運(yùn)行結(jié)果98留言板案例

<TR><TDcolspan=3><TABLEalign="center"width="100%"cellspacing="0"cellpadding="0">

<TR>

<TDalign=“center”><inputtype=“submit”value=“寫好了"></TD><TDalign="center"><ahref="viewMessages.jsp"><fontsize=2>查看留言</font></a></TD>

運(yùn)行結(jié)果99解釋:cellspacing(間距)表示單元格之間的空白距離,cellpadding(邊距)表示單元格內(nèi)容距離邊框的距離。XXXXcellspacingcellpadding100<TDalign="center"><inputtype="reset"value="重寫"></TD>

</TR>

</TABLE></TD>

</TR></TABLE>

</FORM>

</BODY></HTML>101返回1返回2返回3102留言板案例

packageMessage;

publicclassMessageData

{privateStringname,email,title,content;

//setter或者getter方法

publicvoidsetName(Stringname)

{ =name; }

publicvoidsetEmail(Stringemail)

{ this.email=email; }

表示留言數(shù)據(jù)的JavaBean:MessageData.java返回返回2返回3103留言板案例

publicvoidsetTitle(Stringtitle)

{ this.title=title; }

publicvoidsetContent(Stringcontent)

{ this.content=content; }

publicStringgetName()

{ ; }

publicStringgetContent()

{ returnthis.content; }

publicStringgetTitle()

{ returnthis.title; }

publicStringgetEmail()

{ returnthis.email; }

}返回返回2104留言板案例

packageMessage;

importjava.sql.*;

importjava.util.*;

publicclassMessageBean

{privateConnectioncon;

MessageDatamsg;

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

publicMessageBean()

{StringJDriver=“com.mysql.jdbc.Driver”;//定義JDBC驅(qū)動(dòng)程序?qū)ο?/p>

執(zhí)行數(shù)據(jù)庫操作的JavaBean:MessageBean.java返回返回2105StringuserName=“root”;StringuserPasswd=“”;StringdbName=“message”;StringconURL=“jdbc:mysql://localhost:3306/”+dbName;//定義JDBC的URL對(duì)象

try{

Class.forName(JDriver);//加載JDBC驅(qū)動(dòng)程序con=DriverManager.getConnection(conURL,userName,usePasswd);}

106留言板案例

catch(Exceptione)

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

}//MessageBean()的結(jié)束

//設(shè)置成員變量的值

publicvoidsetMessage(MessageDatamsg)

{ this.msg=msg; }

//添加一條留言到數(shù)據(jù)庫

publicvoidaddMessage()throwsException

{try

{byteb1[]=msg.getTitle().getBytes(“ISO-8859-1”); 返回107解釋:{byteb1[]=msg.getTitle().getBytes(“ISO-8859-1”)msg是MessageData類,所以可以用MessageData類的方法getTitle()得到變量title的值。getTitle()返回類型為String。getBytes(“ISO-8859-1”)表示將獲取的字符串用ISO-8859-1進(jìn)行編碼,并將編碼存到1個(gè)字節(jié)數(shù)組中。見P146下面,如下面所示。如果請(qǐng)求的表單中可能會(huì)有中文數(shù)據(jù)時(shí),首先將獲取的字符串用ISO-8859-1進(jìn)行編碼,并將編碼存放到一個(gè)字節(jié)數(shù)組中,然后再將這個(gè)數(shù)組轉(zhuǎn)化為字符串對(duì)象進(jìn)行傳送。108109Stringti=newString(b1);

byteb2[]=msg.getName().getBytes("ISO-8859-1"); Stringna=newString(b2);

byteb3[]=msg.getEmail().getBytes("ISO-8859-1"); Stringem=newString(b3);

byteb4[]=msg.getContent().getBytes("ISO-8859-1");Stringco=newString(b4);110

PreparedStatementstm=con.prepareStatement(“insertintoMessageTablevalues(?,?,?,?)”);

stm.setString(1,ti); stm.setString(2,na);

if((msg.getEmail()).length()==0)stm.setString(3,””);

elsestm.setString(3,em);

stm.setString(4,co);

try{ stm.execute();stm.close(); }

catch(Exceptione){}

con.close();//關(guān)閉數(shù)據(jù)庫連接

}catch(Exceptione)

{e.printStackTrace();throwe; }

}

//addMessage()結(jié)束

111PreparedStatement接口是Statement接口的子接口。Prepared表示預(yù)編譯。PreparedStatement對(duì)象由方法prepareStatement所創(chuàng)建。

prepareStatement方法用于:帶一個(gè)或多個(gè)輸入?yún)?shù)的SQL語句。PreparedStatementps=con.prepareStatement("insertintostudentvalues(?,?,?)");解釋112執(zhí)行語句使用Statement類和PreparedStatement類提供的execute()方法可以執(zhí)行語句。區(qū)別:PreparedStatement類的execute()方法無參數(shù),而Statement類的execute()方法有參數(shù),格式為execute(Stringsql)解釋113例句插入操作:PreparedStatementps=con.prepareStatement("insertintostudentvalues(?,?,?)");ps.execute();114解釋:PreparedStatementstm=con.prepareStatement(“insertintomessagetablevalues(?,?,?,?)”);Stm.setString(1,ti);setString見P189上面(8)。它是PreparedStatement類的方法,用來給第1個(gè)位置設(shè)定字符串值為ti。返回115//獲得所有留言消息,并返回結(jié)果到JSP頁面

publicCollectiongetAllMessage()throwsException

{

Collectionret=newArrayList();

try {Statementstm=con.createStatement();

ResultSetresult=stm.executeQuery("selectcount(*)fromMessageTable");

intmessage_count=0;返回2返回1返回3返回4返回5類集的作用類集實(shí)際上就是一個(gè)動(dòng)態(tài)的對(duì)象數(shù)組,與一般的對(duì)象數(shù)組不同,類集中的對(duì)象內(nèi)容可以任意擴(kuò)充。類集框架主要接口接口描述1Collection是存放一組單值的最大接口,所謂的單值是指集合中的每個(gè)元素都是一個(gè)對(duì)象。一般很少會(huì)直接使用此接口直接操作。2List是Collection接口的子接口。3Iterator集合的輸出接口,用于輸出集合中的內(nèi)容,只能進(jìn)行從前到后的單向輸出。接口的繼承關(guān)系Collection接口:ArrayList說明:Collection接口是最大的父接口,List是它的子接口,而ArrayList是List接口的常用子類,它實(shí)現(xiàn)了List接口的所有方法。119解釋:ArrayList()是一個(gè)不限容的大倉庫,相當(dāng)于對(duì)象數(shù)組。但與對(duì)象數(shù)組比較,它的容量不受限制,會(huì)自動(dòng)擴(kuò)容。count(*)可以統(tǒng)計(jì)表中的所有記錄個(gè)數(shù)ResultSetresult=stm.executeQuery("selectcount(*)fromMessageTable");得到的result只有1行1列,即表MessageTable的記錄數(shù),也即留言數(shù)?,F(xiàn)在有2個(gè)留言,則為2。120留言板案例

if(result.next())

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

if(message_count>0)

{ result=stm.executeQuery("select*fromMessageTable");

while(result.next())

{ Stringtitle=result.getString("title");

121解釋:result.getInt(1)。result是ResultSet類,getInt(1)是ResultSet類的方法,表示讀查詢結(jié)果集第1列的數(shù)據(jù)。見P189表格,如下所示。即getXy(數(shù)字n)表示取得數(shù)據(jù)表中第n列字段的值,此字段的數(shù)據(jù)類型必須是Xy類型。122

Stringname=result.getString("name");

Stringemail=result.getString("email");

Stringcontent=result.getString("content");

MessageDatamessage=newMessageData();

message.setTitle(title); message.setName(name);123留言板案例

message.setEmail(email); message.setContent(content);

ret.add(message); //添加message對(duì)象到ret容器中

}//while結(jié)束

result.close();stm.close();

}//if結(jié)束

con.close();}//try結(jié)束

catch(Exceptione)

{e.printStackTrace(); throwe;}

returnret;

}//getAllMessage()結(jié)束

}//類MessageBean結(jié)束124解釋:ret.add(message);把對(duì)象放到ArrayList中用的是add()方法。125留言板案例

<%@pagelanguage="java"contentType="text/html;charset=GBK“import=“message.*”%>

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

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

<jsp:useBeanid="myBean"class="Message.MessageBean"scope="page"/>

添加留言的JSP程序:addMessage.jsp,它的主要功能是調(diào)用JavaBean,實(shí)現(xiàn)向數(shù)據(jù)庫中添加留言。126解釋:<jsp:useBeanid=“Mdata”class=“Message.MessageData”scope=“page”>指的是創(chuàng)建一個(gè)Bean對(duì)象,

代表MessageData.java這個(gè)類文件,Bean對(duì)象名字叫Mdata。

<jsp:setPropertyname=“Mdata”property=“*”/>表示設(shè)置JavaBean中的所有成員變量,而且可以自動(dòng)匹配數(shù)據(jù)類型。它會(huì)自動(dòng)調(diào)用MessageData類的setName、setEmail、setTitle、setContent這4種方法,把表單文本框中的參數(shù)傳給MessageData類的4個(gè)屬性。這條語句可以獲得表單中提交的數(shù)據(jù),這樣就可以省去許多request.getParameter()的操作。127解釋:<jsp:useBeanid="myBean"class="Message.MessageBean"scope="page"/>表示創(chuàng)建一個(gè)Bean對(duì)象,即調(diào)用了構(gòu)造函數(shù)MessageBean()(P238中間)。此構(gòu)造函數(shù)的作用是連接數(shù)據(jù)庫。128留言板案例

<HTML><HEAD><TITLE>addmessageintotable</TITLE></HEAD>

<BODY>

<%

try

{myBean.setMessage(Mdata);

myBean.addMessage();

}

catch(Exceptione){e.printStackTrace();}

%>

<jsp:forwardpage="viewMessages.jsp"/>

</BODY></HTML>分析一下程序流程:1、先是<jsp:useBeanid=“Mdata”class=“Message.MessageData”>創(chuàng)建一個(gè)Bean對(duì)象Mdata,然后通過<jsp:setPropertyname=“Mdata”property=“*”/>從表單文本框里獲取屬性。讓Bean對(duì)象Mdata的4個(gè)屬性有了值。2、通過myBean.setMessage(Mdata)把長有4個(gè)屬性的Bean對(duì)象Mdata傳給Bean對(duì)象myBean的屬性msg(它是屬于MessageData類)。3、調(diào)用myBean.addMessage()添加留言。129addMessage()的第1條語句:byteb1[]=msg.getTitle().getBytes("ISO-8859-1"); Stringti=newString(b1);就是調(diào)用msg對(duì)象的getTitle()方法獲取主題值。130131留言板案例

<%@pagecontentType="text/html;charset=GBK"import="Message.MessageData"%>

<%@pageimport="java.util.*"%>

<jsp:useBeanid="myBean"

class="Message.MessageBean"scope="page"/>

<HTML><HEAD><TITLE>showthemessageinthetable</TITLE></HEAD>

<BODY>

查看留言的JSP程序:viewMessages.jsp132

<palign="center">所有留言</p>

<TABLEalign="center"border=1>

<%

intmessage_count=0;

Collectionmessages=myBean.getAllMessage();//JavaBean返回結(jié)果集到JSP頁面

Iteratorit=messages.iterator();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論