550 likes | 756 Views
第十二讲. 课 题 JavaBean 编程与应用 目的要求 掌握在 JSP 中如何使用 JavaBean 及怎样编写 JavaBean 教学重点 JSP 中如何使用 JavaBean 教学难点 利用 JavaBean 连接数据库 教学课时 4 (含 2 课时上机) 教学方法 讲解、示例与启发式教学相结合 教学内容和步骤. 12.1 JAVABEAN 编程
E N D
课 题 JavaBean编程与应用 目的要求 掌握在JSP中如何使用JavaBean及怎样编写JavaBean 教学重点 JSP中如何使用JavaBean 教学难点 利用JavaBean连接数据库 教学课时 4(含2课时上机) 教学方法 讲解、示例与启发式教学相结合 教学内容和步骤
12.1 JAVABEAN编程 JavaBean 是一种基于 Java 的软件组件。 JSP 对于在 Web 应用中集成 JavaBean 组件提供了完善的支持。这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为 JSP 应用带来了更多的可伸缩性。 JavaBean 组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据提取等。如果我们有三个 JavaBean ,它们分别具有显示新闻、股票价格、天气情况的功能,则创建包含所有这三种功能的 Web 页面只需要实例化这三个 Bean ,使用 HTML 表格将它们依次定位就可以了。
为说明在 JSP 环境下 JavaBean 的应用,我们创建了一个名为 TaxRate 的 Bean 。它有两个属性,即 Product (产品)和 Rate (税率)。两个 set 方法分别用来设置这两个属性,两个 get 方法则用于提取这两个属性。在实际应用中,这种 Bean 一般应当从数据库提取税率值,此处我们简化了这个过程,允许任意设定税率。 例1: 下面是这个 Bean 的代码清单: package tax; public class TaxRate { String Product; double Rate;
public TaxRate() { this.Product = "A001"; this.Rate = 5; } public void setProduct (String ProductName) { this.Product = ProductName; } public String getProduct() { return (this.Product); } public void setRate (double rateValue) {
this.Rate = rateValue; } public double getRate () { return (this.Rate); } } 在 JSP 页面中应用上述 Bean 要用到 < jsp:useBean> 标记。依赖于具体使用的 JSP 引擎的不同,在何处配置以及如何配置 Bean 的方法也可能略有不同。本文将这个 Bean 的 .class 文件放在 c:.0INF目录下,这里的 tax 是一个专门存放该 Bean 的目录。下面是一个应用上述 Bean 的示例页面:
< HTML> < BODY> < %@ page language="java" %> < jsp:useBean id="taxbean" scope="application" class="tax.TaxRate" /> < % taxbean.setProduct("A002"); taxbean.setRate(17); %> 使用方法 1 : < p> 产品 : < %= taxbean.getProduct() %> < br> 税率 : < %= taxbean.getRate() %> < p>
< % taxbean.setProduct("A003"); taxbean.setRate(3); %> < b> 使用方法 2 : < /b> < p> 产品 : < jsp:getProperty name="taxbean" property="Product" /> < br> 税率 : < jsp:getProperty name="taxbean" property="Rate" /> < /BODY> < /HTML>
在 < jsp:useBean> 标记内定义了几个属性,其中 id 是整个 JSP 页面内该 Bean 的标识, scope 属性定义了该 Bean 的生存时间, class 属性说明了该 Bean 的类文件(从包名开始)。 这个 JSP 页面不仅使用了 Bean 的 set 和 get 方法设置和提取属性值,还用到了提取 Bean 属性值的第二种方法,即使用 < jsp:getProperty> 标记。 < jsp:getProperty> 中的 name 属性即为 < jsp:useBean> 中定义的 Bean 的 id ,它的 property 属性指定的是目标属性的名字。
事实证明, Java Servlet 是一种开发 Web 应用的理想构架。 JSP 以 Servlet 技术为基础,又在许多方面作了改进。 JSP 页面看起来象普通 HTML 页面,但它允许嵌入执行代码,在这一点上,它和 ASP 技术非常相似。利用跨平台运行的 JavaBean 组件, JSP 为分离处理逻辑与显示样式提供了卓越的解决方案。 JSP 必将成为 ASP技术的有力竞争者。
例2: Jsp的一个重要特性就是可以用javaBean实现功能的扩展。将大部分功能放在javaBean中完成,以使jsp页面程序更干净简洁、利于维护。JavaBean可以很方便的用来捕获页面表单的输入并完成各种业务逻辑的处理。 testA.jsp页面: <%@ page contentType="text/html;charset=GBK" %> <html> <head> <title>示例</title> </head>
<body scroll=no> <form name="frma" method="post" action="testB.jsp" > <p> 你的姓名: <input type="text" size="15" name="yourName" value="" id=yourName> <input type="button" align="center" name="subBtn" value="[ 提交]" onClick="f_check()" id=subBtn> </p> </form> </body> </html> <script language="JavaScript" type="text/javascript"> <!—
function f_check(){ if(document.forms(0).yourName.value==""){ alert("请输入姓名"); }else{ document.forms(0).submit(); } } --> </SCRIPT> testB.jsp页面 <%@ page contentType="text/html;charset=GBK" %> <html> <head>
<title>示例</title> </head> <jsp:useBean id="tBean" scope="page" class="bean.TestBean" > <jsp:setProperty name="tBean" property="*" /> </jsp:useBean> <body scroll=no> <form name="frmb" method="post" action="" > <p> <%=tBean.hello()%> </p>
</form> </body> </html> TestBean.java代码: package bean; public class TestBean{ private String yourName = ""; public void setYourName(String yourName){ this.yourName = ConvertGBK(yourName); public String hello(){ String strHello = "Hello:"+yourName; return strHello; }
//汉字转换方法 public String ConvertGBK(String str){ String strReturn=""; try{ strReturn=new String(str.getBytes("ISO-8859-1"),"GBK"); }catch(Exception ex){ System.out.println("TestBean.ConvertGBK():ex="+ex.toString()); } finally{ return strReturn; } }
testA.jsp页面上“提交”按钮将表单提交给testB.jsp页面,testB.jsp获得的testA.jsp中yourName文本框的值并在实例化TestBean后,执行bean中的setYourName方法,接着执行hello方法,在页面上输出对你问好的语句。testA.jsp页面上“提交”按钮将表单提交给testB.jsp页面,testB.jsp获得的testA.jsp中yourName文本框的值并在实例化TestBean后,执行bean中的setYourName方法,接着执行hello方法,在页面上输出对你问好的语句。 这个简单的示例体现了在jsp中使用javaBean的两个重要方面,一个是捕获表单的输入并保存,一个是执行逻辑功能。所以,依此两个功能还可以将用在jsp中的javaBean分为值Bean(value bean)和工具Bean (utility bean),如下:
值Bean package bean; public class TestValueBean{ private String yourName = ""; public void setYourName(String yourName){ this.yourName = ConvertGBK(yourName); //汉字转换方法 public String ConvertGBK(String str){ String strReturn=""; try{
strReturn=new String(str.getBytes("ISO-8859-1"),"GBK"); }catch(Exception ex){ System.out.println("TestBean.ConvertGBK():ex="+ex.toString()); } finally{ return strReturn; } 工具Bean package bean; public class TestUtilityBean{
public String hello(TestValueBean tvBean){ String strHello = "Hello:"+tvBean.getName(); return strHello;} public String hello(String yourName){ String strHello = "Hello:"+yourName; return strHello; } }
当然,从这个例子看是没有必要分开value bean和utility bean的,但在具有复杂业务逻辑的web应用程序中就可以用value bean实现对表单输入的捕获、保存,减少对数据库中那些值几乎不变的实体的访问,或将value bean放在一定作用域内使此作用域内的多个jsp页面共享。用utility bean完成操作数据库、数据处理等业务逻辑,以value bean 或页面传递的值为参数。当然,从这个例子看是没有必要分开value bean和utility bean的,但在具有复杂业务逻辑的web应用程序中就可以用value bean实现对表单输入的捕获、保存,减少对数据库中那些值几乎不变的实体的访问,或将value bean放在一定作用域内使此作用域内的多个jsp页面共享。用utility bean完成操作数据库、数据处理等业务逻辑,以value bean 或页面传递的值为参数。
12.1.1 数据类型的转换 在使用<jsp:getProperty…/><jsp:setProperty…/>指令设置或获取JavaBean中属性时涉用到相关的数据类型转换 表1 <jsp:getProperty…/>
12.1.2 session事件的运用 • 在jsp页面中,将Bean对象保存至session对象时,可以定义Bean响应HttpSessionBindingEvent事件。当Bean对象加入session、Bean从session中删除以及session对象终止时,将会触发此事件。因此,我们可以利用这两个事件,执行数据起始、善后的工作。由此,我们可以想到,把jsp页面中最耗费服务器资源的数据库连接工作放入HttpSessionBindingEvent事件中。当一个会话开始时,建立一个“数据库连机”,随后的整个会话过程中,所有与数据库相关的操作均使用这一个“连机”,这样,就避免了每执行一次数据库操作就产生一个数据库连机的巨大消耗。当此会话结束时,再关闭释放这个“数据库连机”。
如果要Bean对象响应HttpSessionBindingEvent事件,则该Bean对象必须实现如果要Bean对象响应HttpSessionBindingEvent事件,则该Bean对象必须实现 HttpSessionBindingListener接口,并且定义响应会话开始的valueBound方法以及响应会话结束的valueUnbound方法。 现在,我们来实做一个例子,首先,建立一个“用来建立会话级别数据库联机”的Bean文件DBCon.java,它的源代码如下所示:
例3: /* * 文件名:DBCon.java * * 类名:DBCon * * 所属包:j2ee.jsp * * 导入包:java.sql.*;javax.servlet.http.*; * * 作者:杨?? * * 创建时间:2003.12.9 *
* 用途描述:在此JavaBean中建立会话级别的数据库联机,供会话过程中的各个jsp页面使用 * * 版本号:1.0 * */ package j2ee.jsp; import javax.servlet.http.*; import java.sql.*;
//定义DBCon类别实做HttpSessionBindingListener介面 public class DBCon implements HttpSessionBindingListener { //与数据库连结有关的Bean属性 private Connection con = null; /** * 方法名:BulidConnection
* 级别:private * @param (无) * @return (无) * @throws (无) * 作用:建立一个数据库联机 */ private void BulidConnection() { try { System.out.println("BulidConnection()方法被调用"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//载入驱动程式类别 con = DriverManager.getConnection("jdbc:odbc:test"); //建立数据库连线 } catch(Exception ex) { System.out.println(ex.toString()); } } /**
* 方法名:close * 级别:private * @param (无) * @return (无) * @throws (无) * 作用:关闭数据库联机 */ private void close() { try { con.close(); //关闭Connection对象 con = null; }
catch(SQLException sex) { System.out.println(sex.toString()); } } /** * 方法名:getConnection * 级别:public * @param (无)
* @return Connection 数据库联机 * @throws (无) * 作用:返回一个数据库联机 */ public Connection getConnection() { //若con为null时, 重新建立数据库连结 if(con == null) BulidConnection(); return this.con; } /**
* 方法名:valueBound * 级别:public * @param HttpSessionBindingEvent 事件 * @return (无) * @throws (无) * 作用:建立一个数据库联机,并输出相关信息 */ public void valueBound(HttpSessionBindingEvent event) { BulidConnection(); System.out.println("会话级别的数据库连接已经建立!!!"); }
/** * 方法名:valueUnbound * 级别:public * @param HttpSessionBindingEvent 事件 * @return (无) * @throws (无) * 作用:关闭一个数据库联机,并输出相关信息 */ public void valueUnbound(HttpSessionBindingEvent event) { if(con != null) close(); //呼叫close方法
System.out.println("会话级别的数据库连接已经关闭!!!"); } } 编译这个Bean源文件。注意,编译前要设定好classpath的路径,使得它所包含的类库中有javax.servlet.http.*包。然后,建立两个用来测试此Bean的jsp页面文件DBBean1.jsp与DBBean2.jsp,它们的程序代码差不多,都是用来显示数据库内容的,现在就只列出DBBean1.jsp的源文件,如下: <%@ page contentType="text/html; charset=GB2312" import="java.sql.*"%> <HTML> <HEAD>
<TITLE>利用Bean对象建立数据库链接</TITLE> </HEAD> <BODY> <CENTER> <FONT SIZE = 5 COLOR = blue> 利用Bean对象建立数据库链接 </FONT> </CENTER> <HR> <P></P>
<CENTER> <%--起始建立数据库链接的Bean对象--%> <jsp:useBean id="ConBean" scope="session" class="j2ee.jsp.DBCon"/> <% Connection con = ConBean.getConnection(); //从Bean对象取得已完成建立的数据库链接 Statement stmt = con.createStatement(); //建立Statement对象 ResultSet rs = stmt.executeQuery("SELECT product_name, price FROM products"); //建立ResultSet(结果集)对象,并执行SQL叙述 %>
<TABLE bgcolor=DodgerBlue> <TR bgcolor=SkyBlue> <TD><B>书 名</B></TD><TD><B>价 格</B></TD> </TR> <% //利用while循环将数据表中的记录列出 while (rs.next()) { %> <TR bgcolor=LightGoldenrodYellow> <TD><B><%= rs.getString("product_name") %></B></TD>
<TD><B><%= rs.getString("price") %></B></TD> </TR> <% } rs.close(); //关闭记录集 stmt.close(); //关闭Statement对象 %> </TABLE> </CENTER> <a href="DBBean2.jsp">DBBean2.jsp</a> </BODY> </HTML>
12.2 在JSP中用JavaBeans、JDBC-ODBC访问数据库 JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与建立的一种动态网页技术标准。使用JSP技术,Web页面开发人员可以使用Html或者XML标识来设计和格式化最终页面。使用JSP标识(tag)或者小脚本(Scriptlet)来生成页面上的动态内容。生成内容的逻辑被封装在标识和JavaBeans组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行。
JavaBeans是一种基于Java的软件组件,JavaBeans和 ActiveX控件一样,可以通过封装业务逻辑建立一整套可重复利用的对象库。JSP对于在 Web应用中集成JavaBeans组件提供了完善的支持,这种支持不仅能缩短开发时间(可以直接利用经过测试和可信任的已有组件),避免重复开发,也为JSP应用带来了更多的可伸缩性。JavaBeans组件可以用来执行复杂的计算任务、或负责与数据库的交互以及数据提取等,本文将通过一个实例介绍在JSP中利用JavaBeans通过JDBC-ODBC Bridge访问客户信息数据库。
数据库连接对动态网站来说是最为重要的部分,Java中连接数据库的技术是JDBC(Java Database Connectivity)。很多数据库系统带有JDBC驱动程序,Java程序就通过JDBC驱动程序与数据库相连,执行查询、提取数据等等操作。Sun 公司还开发了JDBC-ODBC bridge,用此技术Java程序就可以访问带有ODBC驱动程序的数据库,目前大多数数据库系统都带有ODBC驱动程序,所以Java程序能访问诸如Oracle、 Sybase、MS SQL Server和MS Access等数据库。下面介绍如何用Access实现一个客户信息查询程序。
⑴ 首先建立一个Access数据库Customers.mdb,其中的表Customers有字段id(自动增量型,并设为主关键字)、name(文本型,长度10)、address(文本型,长度30)、 info(备注型)。 ⑵ 在Control Panel(控制面板)的ODBC Datasource模块中加入System DSN,取名 Customers,并指向Customers.mdb。 ⑶ 创建一个JavaBean,名为DBconn.java,并保存在支持JSP的Web服务器的缺省文档根目录下。DBconn.java主要是封装与数据库的连接操作,内容如下:
import java.sql.*; public class DBconn { StringDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; String ConnStr = "jdbc:odbc:Customers"; Connection conn = null; ResultSet rs = null; public DBconn { try { Class.forName(DBDriver);
//加载数据库驱动程序 } catch(java.lang.ClassNotFoundException e) { System.err.println("DBconn (): " + e.getMessage()); public ResultSet executeQuery(String sql) { } } rs = null; try { conn = DriverManager.getConnection(ConnStr);
//与DBMS建立链接 Statement stmt = conn.createStatement(); rs = stmt.executeQuery(sql); } catch(SQLException ex) { } System.err.println("aq.executeQuery:"+ex.getMessage()); } return rs; } }
⑷ DBconn.java编辑好后,在DOS状态下,利用JDK的javac命令编译 DBconn.java形成相应的class文件。 ⑸ 建立Customers.jsp文件,在JSP中调用以上编译好的JavaBeans,其内容如下: < html > < head > < meta http-equiv="Content-Type" content="text/html; charset=gb2312" > < title >客户信息调查< /title > < /head > < body >
< p >< b >客户信息调查< /b >< /p > < %@ page language="java" import="java.sql.*" % > < jsp:useBean id="DBconn1" scope="page" class="DBconn" / > <% ResultSet RS = DBconn1.executeQuery("SELECT * FROM Customers"); while (RS.next()) { out.print("< LI >" + RS.getString("name") + "< /LI >"); } RS.close(); %>