• 沒有找到結果。

第一部分 JSP 技术与 J2EE 技术

1.9 date1.jsp 程序的运行效果(第二次)

由图 1.8 不难看出 两种方法获取的时间一样 在图 1.9 中 第一种方法获取的时间 和第二种方法获取的时间有着明显的差距 大概有1 分半钟左右 即使考虑到代码执行先 后的时间间隔 也没有办法解释有这样大的时间差距 但是第一种方法获取的时间(图 1.9) 和图 1.8 所显示的时间一模一样 这说明了一个问题 即在 date1.jsp 程序中 JspCalander 组件的代码只被执行一次 不管如何刷新页面 JspCalendar Bean 组件的 getXXX()方法都 是返回JspCalendar Bean 组件第一次被初始化时的时间 这就是 Application Scope 类型的 JavaBeans 与 Page Scope 类型的 JavaBeans 的不同之处

1.4 JavaBeans 应用实例

在这一节中 我们将结合以前介绍过的知识 讨论JavaBeans 组件技术如何与 JSP 技 术结合在一起 开发功能强大的 JSP 程序 限于篇幅 我们只能够介绍如何用 JavaBeans 封装数据库操作和购物车功能这两个方面的内容 至于其他的方面 读者可以仿照下面的 例子 自己探索

1.4.1 JavaBeans 封装数据库操作

这一小节我们就来介绍如何使用 JavaBeans 封装数据库操作的功能 我们首先需要创 建一个可以访问数据库的 JavaBean 组件 然后在 JSP 程序中调用它 请看程序清单 1.20(JDBCBean.java)

程序清单 1.20 //File Name:

//Author:fancy //Date:2001.4.1

//Note:to visit the database



第 1 章 JavaBeans 组件技术

package test;

import java.io.*;

import java.sql.*;

public class JDBCBean {

String Hello="hello world I am fancy";

public void JDBCBean() {

}

public ResultSet connect() {

try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection conn = DriverManager.getConnection("jdbc:odbc:test" "sa" "");

Statement stmt=conn.createStatement();

ResultSet rs=stmt.executeQuery("USE fancy SELECT * FROM goods");

return rs;

}

catch(Exception fe) {

} return null;

} }

JDBCBean.java 程序中定义了 JDBCBean 类 使用该类的 connect()方法可以访问数据 库 JDBCBean 类的 connect()方法采用标准的流程访问数据库 首先是载入数据库驱动程 序 然后是创建数据库连接对象conn 利用这个连接对象创建 SQL 语句对象 stmt 接下来 利用 stmt 对象的 executeQuery()方法向数据库系统发送 SQL 语句 该方法的返回值是 ResultSet 接口的实例对象

在 JSP 程 序 中 如 何 使 用 这 个 JavaBean 组 件 访 问 数 据 库 呢 ? 请 看 程 序 清 单 1.21(JDBCBean.jsp)

程序清单 1.21

<%--

File Name:JDBCBean.jsp Author:fancy



第一部分 JSP 技术与 J2EE 技术

Date:2001.3.26

Note:use JDBCBean to access the db System --%>

<%@ page import="java.sql.*"%>

<jsp:useBean id="db" class="test.JDBCBean" />

<%

ResultSet rs=db.connect();

while(rs.next()) {

out.println(rs.getObject(1)+"-->"+rs.getObject(3)+"<br>");

}

%>

在程序清单1.21(JDBCBean.java)中 应用 JDBCBean Bean 实现了访问数据库的功能 首先使用<jsp:useBean>操作指令创建 JDBCBean 组件的实例对象 db 然后在 JSP 程序段中 直接调用db 对象的 connect()方法 获取 ResultSet 接口的实例对象 rs 接下来使用一个 while 循环结构遍历这个记录集对象 获取记录集第三个字段的值 并把它们一一输出

程序清单1.21 的运行效果如图 1.10 所示

1.10 JDBCBean.jsp 程序的运行效果

上面所举的例子十分简单 例如SQL 语句已经指定了 我们没有办法改变它 除非重 新编写JDBCBean.java 程序 那么如何解决这个问题呢?答案是重载 JDBCBean 类的 connect() 方法 让它可以接受更多的数据库访问参数 包括用户名 密码 SQL 语句等参数 这样 对于JDBCBean.jsp 程序来说 无需作多大改动 甚至不需要改动 功能也可以大大扩展

注意 本例所使用的 JDBC 驱动程序为 JDBC-ODBC 桥 数据库系统为 MS SQL Server7.0 Desktop Edition 操作系统为 Windows Me 关于数据库的结构信息



第 1 章 JavaBeans 组件技术

读者可以参考本书附录4 的内容 1.4.2 JavaBeans 和购物车功能

本小节中我们将要使用 JavaBeans 组件实现一个简单的购物车 请看程序清单 1.22(carts.html) 这是购物车的页面程序

程序清单 1.22

<!—

File Name:carts.html Author:fancy Date:2001.4.1 Note:show the goods -->

<html>

<head>

<title>carts</title>

</head>

<body bgcolor="white">

<font size = 5 color="#CC0000">

<form type=POST action=carts.jsp>

<BR>

Please enter item to add or remove:

<br>

Add Item:

<SELECT NAME="item">

<OPTION>Beavis & Butt-head Video collection

<OPTION>X-files movie

<OPTION>Twin peaks tapes

<OPTION>NIN CD

<OPTION>JSP Book

<OPTION>Concert tickets

<OPTION>Love life

<OPTION>Switch blade

<OPTION>Rex Rugs & Rock n' Roll

</SELECT>

<br> <br>

<INPUT TYPE=submit name="submit" value="add">

<INPUT TYPE=submit name="submit" value="remove">

</form>

</FONT>

</body>



第一部分 JSP 技术与 J2EE 技术

</html>

程序清单 1.22(carts.html)的作用是给用户提供一个购物的界面 让他们可以自由地往 购物车中添加商品 或者是删除某种商品 程序清单 1.22(carts.html)的运行效果如图 1.11 所示

1.11 carts.html 的运行效果 接下来请看程序清单1.23(DummyCart.java)

程序清单 1.23

//File Name:DummyCart.java //Author:fancy

//Date:2001.4.1 //Note:a cart

package test;

import javax.servlet.http.*;

import java.util.Vector;

import java.util.Enumeration;

public class DummyCart {

Vector v = new Vector();

String submit = null;

String item = null;

private void addItem(String name) {

v.addElement(name);

}

private void removeItem(String name) {



第 1 章 JavaBeans 组件技术

v.removeElement(name);

}

public void setItem(String name) {

item = name;

}

public void setSubmit(String s) {

submit = s;

}

public String[] getItems() {

String[] s = new String[v.size()];

v.copyInto(s);

return s;

}

public void processRequest(HttpServletRequest request) {

// null value for submit - user hit enter instead of clicking on // "add" or "remove"

if (submit == null) addItem(item);

if (submit.equals("add")) addItem(item);

else if (submit.equals("remove")) removeItem(item);

// reset at the end of the request reset();

}

// reset

private void reset() {

submit = null;

item = null;

} }



第一部分 JSP 技术与 J2EE 技术

在DummyCart.java 程序中 定义了购物车的基本模型 DummyCart 类使用 Vector 数 据结构来模拟购物车的功能 DummyCart 有三个属性 分别是 submit item v 其中 submit 的值如果为 add 那么意味着往购物车中添加商品 如果为 remove 那么表示用户将从购 物车中删除商品 Item 代表用户需要添加或者舍弃的商品的名字 v 是一个 Vector 类型的 数据 它保存着购物车的所有信息 利用Vector 类的方法 可以实现往购物车中添加商品 或者删除商品的操作 在DummyCart 类中 最重要的方法是 processRequest() 这个方法判 断submit 的值 然后调用 addItem()方法或者 removeItem()方法 完成基本的购物车操作

<jsp:useBean id="cart" scope="session" class="test.DummyCart" />

<jsp:setProperty name="cart" property="*" />

<%

cart.processRequest(request);

%>

<FONT size = 5 COLOR="#CC0000">

<br> You have the following items in your cart:

<ol>

<%

String[] items = cart.getItems();

for (int i=0; i<items.length; i++) {

%>

<%@ include file ="carts.html" %>

</html>

用户首先打开carts.html 页面 选中某种商品 然后单击 submit 按钮 把数据提交到 carts.jsp 程序中 carts.jsp 程序首先使用<jsp:useBean>创建一个新的 Session Scope 类型的 JavaBean 组件对象 cart 如果此 cart 对象已经存在了 那就不用创建了 直接拿过来用就 是了 Carts.jsp 程序接着使用<jsp:setProperty>操作指令给 carts 对象赋值 如下面的代码所



第 1 章 JavaBeans 组件技术

示 例

<jsp:setProperty name="cart" property="*" />

读者一定注意到了上面的代码行中property 属性的值为* 这是什么意思呢?这就意味 着从客户端传递过来的任何参数 只要名字和 cart 对象的属性名字相符 它们的值就会被 赋给cart 对象的相应的属性 例如如果用户选择了 JSP Book 这种商品 单击了 submit 按钮 那么JSP 引擎会自动调用 cart 对象的 addItem()方法和 setSubmit()方法 把 item 属性的值设 为JSP Book 把 submit 的值设为 add

接下来 carts.jsp 程序调用 processRequest()方法 让它根据 submit 属性的值完成相应 的购物车操作 最后 carts.jsp 程序使用 cart 对象的 getItems()方法 配合 for 循环结构 把 购物车的内容全部输出来

程序清单1.24 的运行效果如图 1.12 所示

1.12 carts.jsp 程序的运行效果