版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
8.1
JavaBean与组件复用8.2
在JSP中使用JavaBean8.3
使用JavaBean
数据库8.4
JSP+JavaBean留言板案例习题8第8章
JSP与JavaBeanJSP页面程序是由普通的HTML
、JSP
和Java程序片组成的,如果用这种大量交互在一起的技术开发
,则
开发周期长,程序混杂,不易
。当前流行的JSP开发技术是模块化技术,各模块负责一项具体的任务。例如,常用方法是将整个程序分为静态模块和动态模块。静态部分由应用的表达层组成,由网页设计
对页面进行
规划设计;动态部分由业务逻辑层组成,是Java程序员编写Java程序的部分;最后,通过JSP
指令实现各部分的连接。逻辑层可由JavaBean构成。JavaBean是Sun公司开发的一个可重复使用的 组件,JSP对于在Web应用中集成JavaBean组件提供了完善的支持。这种支持不仅可以减少JSP中的Java代码量,缩短开发时间,也为JSP应用带来了更多的可伸缩性。开发者可以生成自己的JavaBean组件,也可以从独立供应商那里,或者利用与其它流行工具在一起的JavaBean。JSP页面将数据的处理过程指派给一个或几个Bean来完成,只需在JSP页面中调用这个Bean即可。8.1.1随着复用技术规模的不断扩大,如何高效率、高质量地生产是所有开发机构所的用以前开发的高质量的组件来开发新开发工作所耗费的时间和成本,提高。显然,通过利系统,可以减少生产率和系统的质量。这便是1968年的NATO的思想,此后,重用的基本出发点。实际上,早在工程会议上就已经提出了共享组件库重用技术越来越受到重视。8.1
JavaBean与组件复用重用(Software
Reuse,又称 复用或再用)是指利用事先建立好的
称为构件或组件)来创建新成分(SoftwareComponents,也系统的过程和开发可重用软重用所必须包含的两件组件的技术。这个定义蕴含着个方面:(1)
系统地开发可重用的部件。这些
部件可以是代码,也可以是分析,设计,测试数据,原型,计划,文档,模板,框架等等。部件作为构筑模块来建立新(2)
系统地使用这些的系统。重用会带来以下好处:提高 生成率。缩短开发周期。降低
开发和(4)
生产更加标准化的费用。。开发质量。系统的互操作性。开发 数量。能比较容易地适应不同性质的项目开提高增强减少使开发发。重用主要体现在以下方面:源代码重用、目标代码重用、类库、组件。源代码重用。它是最低级别的重用技术。程序员在实现某些功能时,将已开发过的类似的源代码修改后嵌入到新开发的模块中。这样做虽然可以缩短开发时间,但存在着读懂源代码的问题。目标代码重用。这种技术一般是以函数库的方式来体现的,由于程序员不能修改源代码,所以灵活性低。类库。它具有继承、封装、派生等特性,使得大规模的重用成为可能,是面
象技术出现后的重用方式。(4)
组件。它是继过程性模型和面象模型之后的新一代逻辑模型,是最先进的重用技术。通过面象的技术对所开发的系统进行分析与设计,将特定的对象设计为一个个组件,并建立组件库。这样的组件不仅可以重复使用,而且还可以由用户自行配置。整个系ⅰ
┳τ8.1.2 JavaBean组件模型JavaBean是JavaSoft公司于1995年创建的一个组件模型,旨在为Java定义一个软组件体系结构。这一模型允许第供应商创建和销售基于Java的组件,开发 可以 这些组件,并把它们应用于自己的
系统中。实际上,JavaBean是一种特殊的Java类(简称Bean类)。JavaSoft公司为JavaBean定义的任务是:“Write
once,run
anywhere,reuseeverywhere”。也就是说,JavaBean是一种具有“一次编写,可以在任何地方运行,可以在任何地方重用”特性的Java组件。由于JavaBean是用Java编写的,JavaBean建立在Java的优势上,并进一步扩展了Java平台,所以Java语言环境所具有的特性将会在JavaBean中得到很好的体现,是一个可移植、高度可伸缩、多平台的、可重用的组件体系结构。8.1.3 JavaBean的组成特性JavaBean组件模型由属性、方法和事件三部分组成,并通过封装属性和方法使其成为具有某种功能或者处理某个业务的对象(简称Bean)。Bean的组成特性如下。(1)
方法。指在Bean类中定义的、完成各种特定任务的公共方法,这些方法提供给外部调用。(2)属性。Bean的属性是Bean类中的成员变量,它与一般Java程序中所指的属性是同一概念。Bean的属性可以是任何Java支持的数据类型,包括类和接口类型。在
JavaBean设计中,按照属性的作用不同又可将Bean属性细分为四类:Simple(简单或单值属性)、Indexed(索引属性)、Bound(绑定属性)与Constrained(约束属性)。①简单属性。简单属性是最普通的属性类型,即Java程序中的一个属性或数据成员,且此属性只能含有单一的数据值。此外,简单属性还表示有一对get/set方法与此属性相伴随,属性名与和该属性相关的get/set方法名对应。例如,如果有getXy和setXy方法,则暗指有一个名为xy的属性;如果有一个方法名为isXy,则通常暗指xy是一个布尔型属性(即xy的值为true或false)。②索引属性。索引属性是以数组形式存在的一组具有相同数据类型的属性,使用与该属性对应的set/get方法可设置或获取数组中元素的值,也可以一次设置或获取整个数组的值。③绑定属性。绑定属性是向其它基于该属性的变化而改变的相关部件提供通知信息的属性。一个绑定属性的值发生变化时,就触发一个PropertyChange事件,事件中封装了属性名、属性的原值、属性变化后的新值。这个事件将属性值传递到其它的Bean,接收事件的Bean将根据自己对处理该事件的定义做出相应的动作。④约束属性。约束属性是在改变它的值之前,必须由
Bean外部的某个相关部件进行有效性确认的属性。也就是说,一个JavaBean的约束属性的值要发生变化时,与这个属性相连接的其它Java对象可以否决属性值的改变。(3)
事件。事件用于传递有关Bean状态变化
,以及用户与Bean之间的交互信息。Bean与Bean之间相互连接起来并进行互操作是通过事件处理机制实现的。JavaBean直接继承了JavaAPI中以事件源/收听者模型为基础的事件处理机制。Bean既可以产生事件,也可以收听并处理事件。作为事件源的Bean,既可以产生低层事件,也可以产生语义事件;作为收听者的Bean,向外部提供了响应并处理事件的公共方法。8.1.4 JavaBean的其它特性JavaBean除了具有一般Java类的特性外,还具有一般
Java类所没有的一些特性,具体情况如下。(1)
自查(introspection)。自查是指 工具能够从外部分析Bean是如何工作的。Bean之所以能支持自查是因为在JavaBean中规定:当定义Bean的属性、事件和方法时,要么利用标准的Bean信息类进行显式的定义,要么使用以命名约定为基础的设计模式来定义,两者必居其一。这样无论使用哪种形式,或是混合使用两种形式,应用程序构造工具都能分析Bean具有哪些属性、方法和事件,以及使用它们时所必需的信息。自查对于重用代码组件来讲是至关重要的,因为只有代码组件支持自查,重用者才能真正地以透明的方式重用它们。(2)支持应用程序构造工具。应用程序构造工具可以在Bean类支持自查的基础上,为 开发 提供直观的重用Bean的可视化方式,从而使重用代码资源的过程变得简单、灵活和有效。例如,虽然应用程序构造工具在其内部同样只能通过 者方法来
Bean的属性,但是它可以在此基础上进一步利用Bean属性自查和Bean自身的属性编辑器,为应用程序构造工具的用户提供利用可视化的属性列表和编辑Bean属性 段。(3)
客户定制(customization)。开发 可以利用应用程序构造工具设置Bean的属性值,以定制Bean的外观和行为。(4)
性 。可以在
性 设备上保存Bean类,以供今后重用。JavaBean支持可视化和非可视化两种组件。可视化的组件就是有GUI界面的JavaBean,这些组件在运行中能够显示出来,例如,按钮、文本框等。非可视化的组件就是没有GUI界面的JavaBean,通常用来处理程序中的一些复杂事务。JSP支持非可视化的JavaBean组件技术,用于实现比较复杂的事务处理。8.2
在JSP中使用JavaBean在JSP开发中,JavaBean用于使用JavaBean可以减少在JSP中业务逻辑处理。通过代码的使用,很好地实现业务逻辑和前台程序的分离,使得JSP页面更加容易维护,系统具有更好的健壮性和灵活性。8.2.1 JavaBean编写规范在JSP中使用JavaBean可有下述两个步骤:第一,编写JavaBean;第二,在JSP页面中调用这个JavaBean。虽然编写JavaBean与编写Java程序没有太多区别,但仍然有以下几点需要注意。(1)
如果Bean中有构造方法,那么这个构造方法不能带任何参数,并指定为public。的成员方法的修饰符必Bean中被JSP页面直接须指定为public。Bean具有的成员变量名的第一个字母必须小写,如下节示例程序C8_1.java中的aa1、aa2、bb1等的第一个字母都是小写的。(4) Bean中的每个成员变量都有相应的get和set方法对其进行读/写。而且,对这个get和set方法的方法名有特别的规定。例如,假设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方法是只读方法,不带任何参数,返回值是一个对象,对象的数据类型就是该成员变量的数据类型。set方法是只写方法,带有一个参数,参数的数据类型为该成员变量的数据类型。set方法不能返回值。(6)
如果成员变量的数据类型是boolean型的,则可以用isXy方法来代替上述的getXy方法。8.2.2 JavaBean应用示例下面通过一个具体的例子来说明JavaBean的编写和在
JSP页面中调用JavaBean的方法。这个例子由两个文件组成:一个是名为C8_1.java的JavaBean;另一个是名为C8_1.jsp的调用这个JavaBean的JSP程序。【示例程序C8_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】调用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>第一次调用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>调add()方法,返回值是:<%=myBean.add()%></body></html>说明:在JSP页面中
JavaBean时,必须使用JSP动作标签<jsp:useBean……>。关于这个动作的用法已在6.2.4节作了介绍,如果读者还没有掌握的话,请再次阅读该节。本例中,Bean的id名为myBean,class属性值为“ch8Bean.C8_1”。JSP引擎在创建Bean对象时将调用其无参数的构造方法来初始化Bean属性。如果需要在Bean对象被创建时设置或读出Bean的属性,正如6.2.5和6.2.6节所述的那样,可以使用<jsp:setProperty>和<jsp:getProperty>指令来Bean的属性。当然,也可以使用JSP页面程序或表达式直接调用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节中的c8_1.java和C8_1.jsp程序。用Eclipse中文加强版建立JSP+JavaBean程序的步骤与第3章中介绍的建立JSP程序的步骤相同。当建立了ch8项目(文件夹)后,先创建和存放C8_1.java程序文件。其操作过程如下(图8.1所示):在“ch8”文件夹上单击右键,出现快捷菜单。在出现的快捷菜单中依次单击“新建”/“类”,弹出“新建Java类” 框,如图8.2所示。图8.1
建立C8_1.java程序在图8.2中的“包”处写入“ch8Bean”,“名称”处写入“C8_1”。这两项数据的作用是指明C8_1.java程序存放在F:\xiti\ch8\src\ch8Bean文件夹中。当然,编译后的
C8_1.class也会自动存放在F:\xiti\ch8\build\classes\ch8Bean文件夹中。单击“完成”后,出现如图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的运行结果。图8.4
JSP+JavaBean程序的存放位置图8.5 c8_1.jsp的运行结果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的生命周期是本页面的执行期间,表示Bean只能被当前页面
。2.
scope=sessionSession对象与每个用户相关联,Session
Scope的Bean的生命周期是一个
者的会话期间。当一个
者站点时,则产生一个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
所串联起来的JSP
程序可以共享相同的Bean。4.
scope=applicationApplication
Scope的Bean的生命周期最长,只有当关闭服务器时,它的生命才告终。如果某个Bean属于
Application
Scope时,所有在同一个JSP引擎下的JSP程序都可以共享这个Bean,在相同的JSP引擎下的Web应用程序,都可以使用这个Bean来交换信息。下面 通过一个 计数器的实例来说明这四种JavaBean生命周期的差异。计数器Bean。【示例程序c8_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】 计数器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"
/><!--该语句只有创建新对象时才执行--><%
cn.increase();%><!--在网页上显示计数器结果--><br>
<jsp:getProperty
name="cn"
property="count"/></body></html>图8.6
浏览器刷新后执行的结果运行c8_2.jsp的结果如下:(1)将c8_2.jsp程序中的Scope设为scope=“page”,每当运行或重新刷新JSP程序时,如图8.6所示,计数器值始终保持不变。这是因为当JSP程序执行完成,把结果页面送给客户端后,属于PageScope的Bean对象就被清除,生命周期告终。当有新的请求产生时,c8_2对象又产生一个新的Bean实例对象传送到客户端,计数器重新计数,所以,计数器值保持不变。(2)将c8_2.jsp程序中的Scope设为scope=“session”,当刷新浏览器产生新的请求时,不会再产生新的对象来处理这个请求,如图8.7所示,而是将原来的计数器对象的计数值增1。如果再打开一个新的浏览器窗口,在两个浏览器窗口分别执行这个程序。此时建立了两个客户端应用,将会看到两个窗口的计数器是各自独立计数的。图8.7显示的是打开第一个浏览器窗口并刷新后的结果;图8.8显示的是新打开一个浏览器窗口时的执行结果。图8.7
第一个浏览器执行的结果图8.8
第二个浏览器执行的结果图8.9
设置为request时的运行结果(3)将示例程序c8_2.jsp的Scope设置为scope=“request”时,Bean
的生命周期是用户的请求期间,其运行结果如图8.9所示。当把Scope设置为request时,只能通过forward标签将Bean传送给下一个JSP。当一个JSP程序通过forward标签将Request对象传送给下一个JSP程序时,属于RequestScope的Bean也将会随着Request对象送出。此时,由forward
所串联起来的JSP
程序可以共享相同的Bean。(4)将c8_2.jsp程序中的Scope设为scope=“application”,如果打开两个新的浏览器窗口,在两个浏览器窗口中分别
执行c8_2.jsp程序。此时,将会看到两个客户端共用一个cn对象,两个窗口内的计数器的值是相互连续的,就如同在
一个浏览器窗口中执行了c8_2.jsp程序一样,如图8.10所示。然后再刷新它一次,如图8.11所示。当关闭浏览器后再打
开浏览器并执行c8_2.jsp程序时,Bean的count值再次发生
变化,就如同对此程序再刷新一次的效果是一样的,直到
关闭服务器。图8.10
第一个浏览器执行的结果图8.11
第二个浏览器执行的结果8.2.5
一个具有索引属性的JavaBean索引属性是一种代表一组数值的Bean属性。使用与该属性对应的set/get方法可取得数组中的数值。该属性也可一次设置或取得整个数组的值。【示例程序c8_3.java】具有索引属性的JavaBean。package
ch8Bean;public
class
c8_3{private
int[]
cc1={11,22,33,44};public
void
setCc1(int[]c) //设置整个数组的值{
cc1=c;
}public
void
setCc1(int
index,int
x)个元素的值{
cc1[index]=x;
}public
int[]getCc1()个数组的值{ returncc1;
}public
intgetCc1(intx)组中单个元素的值{ return
cc1[x];
}}//设置单//返回整//返回数【示例程序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数组初始化的值为:11,22,33,44:<br>取cc1数组下标为2的值<%=myBean.getCc1(2)%><br>取cc1数组的值:<%int[]mm=myBean.getCc1(); //将cc1数组的值赋给mm数组out.println("<br>"+mm[0]+","+mm[1]+","+mm[2]+","+mm[3]+"<br>");%><%int
c[]={1,2,3,4};%><br>
修改cc1数组的值为1,2,66,4<%
myBean.setCc1(c);
%><%
myBean.setCc1(2,66);
%><br>取cc1数组下标为2的值:<%=myBean.getCc1(2)%><br>取cc1数组的值:<%mm=myBean.getCc1();//将cc1数组的值赋给
mm数组
out.println("<br>"+mm[0]+","+mm[1]+","+mm[2]+","+mm[3]+"<br>");%></body></html>运行C8_3.jsp的结果如图8.12。图8.12 c8_3.jsp的运行结果在第7章介绍通过JSP页面数据 代码都写入了JSP页面程序中。对于少量的数据库事务来说这样做是可行的,但是,对于大量的数据库访问事务来说,这样的代码可能要在许多页面中重复书写,程序可性和代码的重用性都很低。事实上,在的JSP开发中,已经很少直接在JSP页面中写入大量的逻辑代码,而是把 数据库的代码写在一个JavaBean或者Servlet中,而在需要书写类似代码的JSP页面中通过<jsp:useBean>动作将这个JavaBean引入即可。这样,不仅页面容易 ,而且代码也能得到很好的重用。本节以解怎样在JSP中使用JavaBeanAccess数据库为例,讲数据库。8.3
使用JavaBean数据库数据库时,把所有的通过JavaBean
数据库的过程与第7章讲述的通过JSP页面 数据库的过程相同,都需要五个步骤,即:导入JDBC标准库;的连接;执行数据
实现功能分离,下面数据库驱动程序;建立与数据库操作;关闭所有连接。为了更好地编写两个JavaBean:一个负责建立与数据库的连接;另一个则负责执行数据
操作。8.3.1
连接数据库的JavaBean【示例程序DataBaseConn.java】这个JavaBean的主要数据库驱动程序;建立功能是:导入JDBC标准库;与数据库的连接。程序如下。package
ch8Bean;import
java.sql.*;public
class
DataBaseConn{public
static
Connection
getConnection(){Connection
con=null;String
JDriver
=“sun.jdbc.odbc.JdbcOdbcDriver”;//声JDBC驱动程序对象String
conURL=“jdbc:odbc:TestDB”;//定义JDBC的URL对象,数据库为TestDBtry
{Class.forName(JDriver);//加载JDBC-ODBC桥驱动程序con=DriverManager.getConnection(conURL);//连接数据库的URL}catch(Exception
e){
System.err.println(e.getMessage());
}return
con;}}在这个JavaBean中, 把需要建立连接的数据库以conURL参数对象的形式传递给getConnection()方法,从而实现与数据库的连接。当然,这个例子中的conURL参数值仍然是固定的“jdbc:odbc:TestDB”,即实际上建立的是与TestDB数据库的连接。这样做的原因主要是为了降低读者对程序的理解难度。当
具备了一定的基础后,也可以将这个参数的值做成可变的,只有如此,才可以大大提高代码的重用度。8.3.2
操作数据库中数据的JavaBean【示例程序QueryUpdate.java】这个JavaBean的主要功能是:操作(查询、 、更新和删除)数据库中的数据;完成了所要执行的操作后,关闭各种连接。程序如下。package
ch8Bean;import
java.sql.*; //引入java.sql包public
class
QueryUpdate{Statement
stmt=null;Connection
con=null;public
QueryUpdate
()参数{ //建立与数据库的连接
this.con=DataBaseConn.getConnection();}public
void
executeUpdate(String
sql){//用于进行记录的增删改等操作的方法,为sql语句try{stmt=con.createStatement();类对象stmt.executeUpdate(sql);//建立Statement//执行SQL命令}catch(SQLException
ex){System.err.println(ex.getMessage());}}/*
executeQuery方法用于进行记录的查询操作,数为sql语句,返回含查询结果信息的ResultSet对象*/public
ResultSet
executeQuery(String
sql)参{ResultSet
rs
=
null;try{stmt=con.createStatement();类对象rs=stmt.executeQuery(sql);据库查询操作}catch(SQLException
ex){//建立Statement//执行数System.err.println("executeQuery:"+ex.getMessage());}return
rs;}//关闭各种连接
public
void
close(){try{stmt.close();
//Statement所连接的数据库及JDBC资源con.close();数据库的连线}catch(SQLException
ex){System.err.println(ex.getMessage());}}}//关闭与在这个JavaBean中, 首先在构造方法中使用上一节创建的数据库连接对象DataBaseConn的getConnection()
方法建立了与数据库的连接;然后,定义了executeUpdate()和executeQuery()两个方法,并通过 参数“sql”语句将要执行的操作代入,实现所要执行的对数据库的操作。8.3.3
使用JSP+JavaBean创建表、
记录和显示记录使用JSP+JavaBean模式创建TestDB数据库中的student表,
三条记录,最后,显示student表的所有记录。student表的定义如表8.1所示。表8.1 student表字
段
名类
型描
述idVarchar(10)学号nameVarchar(15)名字scoreinteger成绩【示例程序c8_4.jsp】使用上节创建的JavaBean来操作数据库。<%@
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模式创建数据库中的student表的例子</h3><hr><%//创建数据库中的student空表String
sql="create
table
student("+
"id
char(10),"+"name
char(15),"+"score
integer"+")";myBean.executeUpdate(sql); //执行建表操作',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); //执行%><h4>
记录并显示表记录</h4><p></td><td>分数</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的运行结果在这个例子中, 首先通过<%@
pageimport="ch8Bean.*"
%>指令将ch8Bean包引入JSP程序,接下来再通过<jsp:useBean
…
class="ch8Bean.QueryUpdate"/>将 在上一节创建的QueryUpdate这个JavaBean引入。这样,只要在JSP程序中给出JavaBean中所要求的参数“sql”,就可以调用相应的方法执行相关的数据库操作。c8_4.jsp的运行结果如图8.13所示。8.3.4
使用JSP+JavaBean修改记录和删除记录【示例程序c8_5.jsp】用JSP+JavaBean模式,将TestDB数据库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模式在数据库中更改和删除表记录的例子</h3><hr><h4>显示原始sudent表的内容</h4><table
Border=1><tr><td>学号</td><td>
</td><td>分数</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); //执行更改操作%><h4>显示更改后的sudent表的内容</h4><p><table
Border=1><tr></td><td>分数</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); //执行删除操作%><h4>显示删除一条记录后的sudent表的内容</h4><p></td><td>分数</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的运行结果out.print("<td>"+rs.getString("score")+"</td></tr>");out.print("<p>");}rs.close();myBean.close();%></table></body></html>c8_5.jsp的运行结果如图8.14所示。通过8.3.2和8.3.3节的示例程序可以看出,在JavaBean中操作数据库和在JSP中操作数据库基本上一样,不同的是JavaBean只负责执行数据库的操作,不关心显示方面的逻辑。这样就有效地实现了静态模块(表示层)和动态模块
(逻辑层)的分离,实现了组件JavaBean重用的目标。大部分 都提供留言板,它是一个典型的JSP开发案例。它的基本功能是让使用者撰写留言或查看别人的留言。最简单的留言界面如图8.15所示。在留言板中,用户需要输入留言的标题、留言人的 、留言人的
和留言内容。这里
所关心的是当用户输入内容、点击提交留言按钮后,需要将这些信息保存到数据库。因此,我们可以建立一个名为Message的数据库,在这个库中建立一个MessageTable表来存放留言人输入的信息。MessageTable表的结构如表8.2所示。8.4
JSP+JavaBean留言板案例表8.2
MessageTable表字段名类
型描
述是否可以为空titleVarchar(100)留言的标题否nameVarchar(20)留言人的名字否Varchar(50)留言人的是contentVarchar(100)留言内容否本留言板案例由五个模块组成。其中,一个HTML文件提供用户交互界面;两个JavaBean文件用来封装与数据库有关的操作;两个JSP文件执行与显示相关的操作。下面分别 这五个文件的功能以及它们之间的关系。8.4.1
填写留言的界面填写留言的界面示例程序为Messgages.html。它的执行效果如图8.15所示。留言界面程序中包含一个表单,点击这个表单上的“提交留言”按钮,则
addMessage.jsp页面。图8.15
Messgages.html的运行结果【示例程序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
表示留言数据的JavaBean为了使addMessage.jsp程序更好地用JavaBean模式数据库的数据,获取数据库中的xy数据和修改xy数据,我们建立一个表示留言数据的JavaBean(MessageData.java),主要表示用户留言信息的属性,每个属性对应
MessageTable表中的一个字段,它们的类型也是对应的,每个属性都定义了getXy()和setXy()方法,这样就为JSP和JavaBean传递数据提供了方便。【示例程序MessageData.java】建立一个表示留言数据的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
执行数据库操作的JavaBean该MessageBean主要用于连接数据库,执行数据库操作,并且把结果返回到JSP页面进行显示。【示例程序MessageBean.java】执行数据库操作的JavaBean。package
Message;import
java.sql.*;import
java.util.*;public
class
MessageBean{private
Connection
con;MessageData
msg;//获得数据库连接
public
MessageBean(){String
JDriver
="sun.jdbc.odbc.JdbcOdbcDriver";
//JDBC驱动程序对象String
conURL="jdbc:odbc:message";//定义
JDBC的URL对象try
{Class.forName(JDriver);//加载JDBC-ODBC桥驱动程序con=DriverManager.getConnection(conURL);//连接数据库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(); //关闭数据库连接}catch(Exception
e){
e.printStackTrace(); throw
e;}//获得所有留言消息,并返回结果到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页面将表单提交的留言数据通过
MessageBean.setMessage(MessageData
msg)方法传递给msg。在MessageBean中建立了两个执行数据库操作的方法:
addMessage()方法的主要功能是把对象msg中的信息添加到数据库中;getAllMessage()方法的主要功能是获得所有留
言,然后通过setXy()方法写入MessageData的message对象
中,最后再通过Java类库中Collection(集合)类的ret对象返
回结果到JSP页面。程序中的Collection
类是可以 不同类型数据的集合,集合的长度可以动态变化。Collection
ret=newArrayList();语句表示创建一个空的Collection类的对象ret,其缓冲区长度为10。ret对象是一个序列容器对象,它的每个元素都可以存放一个对象,可以通过下标 或得到元素的值。程序中ret.add(message);语句表示填加message对象到ret容器中。8.4.4
添加留言的JSP页面这个JSP页面程序的主要功能是调用JavaBean,实现向数据库中添加留言的操作。【示例程序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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44845-2024承压设备低频电磁检测方法
- 2024年度年福建省高校教师资格证之高等教育学通关提分题库(考点梳理)
- 2024年度山西省高校教师资格证之高等教育心理学题库附答案(基础题)
- 江苏开放大学形考任务2024年秋包装设计060712形成性考核作业答案
- 2024年商品信用销售协议
- 合同法总作业及参考答案
- 大理石原料买卖化协议文档
- 2024年规范转供电服务协议模板
- 2024年施工协议监管要点明细
- 2024年木模板工程承包协议样本
- 柴油发电机组应急预案
- 语文《猜猜他是谁》教案
- 绘本:让谁先吃好呢
- 宽容待人正确交往中小学生教育主题班会
- 移动通信网络运行维护管理规程
- 龙头股战法优质获奖课件
- 小班幼儿语言活动教案100篇
- 中国青瓷艺术鉴赏智慧树知到答案章节测试2023年丽水学院
- 中广国际总公司-CR2010卫星接收解码器
- 2023年小学数学手抄报比赛活动总结(3篇)
- 社会保险业务申报表(填表说明)
评论
0/150
提交评论