下载数据库文件：

#### 为了方便，请下载本训练使用的数据库文件，并复制到您的 mysql 安装目录中。

n 创建 public class ProductBean，一个代表产品的 Javabean。ProductBean.java 完整代码如下：

package jsplession;

import java.util.*;

import java.sql.*;

public class ProductBean implements java.io.Serializable {

/* Member Variables */

private String prodID;

private String prodDesc;

private String prodManuf;

private float prodPrice;

/* 利用 List 对象记录产品数据，生成数组 */

private List prodIDList, prodDescList, prodManufList, prodPriceList;

/* 定义变量 */

private int currentRow;

private int rowCount;

private Connection db = null;

/* 构造器，初始化类 */

public ProductBean() {

/* Initialize bean properties */

setProdID("");

setProdDesc("");

setProdManuf("");

setProdPrice(0.00f);

/* 初始化数组列表 */

prodIDList = new ArrayList();

prodDescList = new ArrayList();

prodManufList = new ArrayList();

prodPriceList = new ArrayList();

/* 初始化变量 */

currentRow = 0;

rowCount = 0;

/* 连接数据库 */

dbConnect();

}

/* 连接数据库的方法 */

private void dbConnect() {

if (db == null) {

try {

Class.forName("com.mysql.jdbc.Driver");

db = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/catalog", "root", "password");

} catch (Exception e) {

System.out.println("连接到数据库时出错： catalog DB："

+ e.toString());

}

}

}

/* 属性方法 */

public String getProdID() {

return prodID;

}

public void setProdID(String _prodID) {

prodID = _prodID;

}

public String getProdDesc() {

return prodDesc;

}

public void setProdDesc(String _prodDesc) {

prodDesc = _prodDesc;

}

public String getProdManuf() {

return prodManuf;

}

public void setProdManuf(String _prodManuf) {

prodManuf = _prodManuf;

}

public float getProdPrice() {

return prodPrice;

}

public void setProdPrice(float _prodPrice) {

prodPrice = _prodPrice;

}

/* 只读属性 */

public int getCurrentRow() {

return currentRow;

}

/* 填充记录列表 */

public boolean populate() {

/* 如果 prodIDList 为空，则执行查询来填充列表 */

if (prodIDList.isEmpty()) {

try {

/* 执行查询*/

Statement s = db.createStatement();

ResultSet rs = s.executeQuery("select * from product");

prodIDList.clear();

prodDescList.clear();

prodManufList.clear();

prodPriceList.clear();

rowCount = 0;

//循环取出记录并填充到数组

while (rs.next()) {

prodIDList.add(rs.getString("id"));

prodDescList.add(rs.getString("description"));

prodManufList.add(rs.getString("manuf"));

prodPriceList.add((new Float(rs.getFloat("price"))));

rowCount++;

}

} catch (Exception e) {

System.out.println("出现错误: "

+ e.toString());

return false;

}

}

/* 返回状态 */

return true;

}

//以下代码为了分页显示

/* 定位当前行 */

public void setStartRow(int _start) {

if (_start < rowCount) {

currentRow = _start;

}

}

/* 移动到下一行 */

public int nextRow() {

if (currentRow == rowCount) {

currentRow = 0; // 开始下一页

return 0; // 返回记录结束标识

}

/* 填充属性列表 */

setProdID((String) prodIDList.get(currentRow));

setProdDesc((String) prodDescList.get(currentRow));

setProdManuf((String) prodManufList.get(currentRow));

Float price = (Float) prodPriceList.get(currentRow);

setProdPrice(price.floatValue());

currentRow++;

/* 返回当前记录行 */

return currentRow;

}

}

ProductBean.java 代表产品的 Javabean，一是定义属性，首先，表示产品数据有 4 个属性，即：

· private String prodID;

· private String prodDesc;

· private String prodManuf;

· private float prodPrice;

分别表示产品的 ID、产品描述、制造商和价格。同时按照 javabean 的编写规范，分别给这 4 个属性创建 getter 和 setter 方法。

其次，定义 4 个数组，缓存从数据库中得到的所有产品数据：

· private List prodIDList, prodDescList, prodManufList, prodPriceList;

再次，为了实现翻页功能，定义 2 个变量：

· private int currentRow，表示当前行

· private int rowCount，表示数据的总行数

最后，代表数据库连接的变量：

· private Connection db = null;

二是定义若干方法：

· 创建 private void dbConnect()，建立到数据库的连接，即

Class.forName("com.mysql.jdbc.Driver");

db=DriverManager.getConnection("jdbc:mysql://localhost:3306/catalog", "root", "");

注意异常的处理。

· 定义初始化方法 public ProductBean()，初始化各个变量，并调用 dbConnect()：

setProdID("");

setProdDesc("");

setProdManuf("");

setProdPrice(0.00f);

prodIDList = new ArrayList();

prodDescList = new ArrayList();

prodManufList = new ArrayList();

prodPriceList = new ArrayList();

currentRow = 0;//表示第一行数据

rowCount = 0;

dbConnect();

· 定义 public boolean populate()，从数据库中获得所有产品数据，并缓存到 prodIDList, prodDescList, prodManufList, prodPriceList 这 4 个数组中。

Statement s = db.createStatement();

ResultSet rs = s.executeQuery("select * from product");

rowCount = 0;

while (rs.next()) {

prodIDList.add(rs.getString("id"));

prodDescList.add(rs.getString("description"));

prodManufList.add(rs.getString("manuf"));

prodPriceList.add((new Float(rs.getFloat("price"))));

rowCount++;

}

· 定义 public void setStartRow(int _start)，设置起始行数，也就是数据从哪一行开始显示。注意起始行数不能超过数据的总行数 rowCount，即 if(_start < rowCount) {currentRow = _start;}

· 定义 public int nextRow()，跳到下一行数据。

1. 如果当前行已经是最后一行，则跳到第 1 行，即 if (currentRow == rowCount) { currentRow = 0;return 0;}

2. 把当前行的数据填充到 Javabean 中：

setProdID((String) prodIDList.get(currentRow));

setProdDesc((String) prodDescList.get(currentRow));

setProdManuf((String) prodManufList.get(currentRow));

Float price = (Float) prodPriceList.get(currentRow);

setProdPrice(price.floatValue());

3. 跳到下一行即 currentRow++，并返回下一行的行数即 return currentRow

n 创建 productList.jsp，在这个 JSP 文件中使用 Javabean 完成数据显示和翻页功能。完整代码如下：

<%@ page language="java" contentType="text/html; charset=gbk"

pageEncoding="gbk"%>

<html>

<head>

<title>Product List</title>

<style type="text/css">

<!--

.STYLE1 {

color: #FFFFFF;

font-weight: bold;

}

-->

</style>

</head>

<body>

<jsp:useBean id="pBean" scope="session" class="jsplession.ProductBean" />

<!-- Build table of products -->

<table width="516" align="center" cellpadding="1" cellspacing="1" bgcolor="#3300FF">

<tr bgcolor="#000066">

<td width="18%"><span class="STYLE1">产品 ID</span></td>

<td width="22%"><span class="STYLE1">产品描述</span></td>

<td width="22%"><span class="STYLE1">制造商</span></td>

<td width="38%"><span class="STYLE1">价格</span></td>

</tr>

<%

int rowCount = 0;

int startRow = 0;

if (pBean.populate()) {

String start = (String) request.getParameter("start");

if (start != null) {

startRow = new Integer(start).intValue();

pBean.setStartRow(startRow);

}

while (rowCount < 10 && pBean.nextRow() > 0) {

rowCount++;

%>

<tr bgcolor="#FFFFFF">

<td width="18%"><jsp:getProperty name="pBean" property="prodID" /></td>

<td width="22%"><jsp:getProperty name="pBean" property="prodDesc" /></td>

<td width="22%"><jsp:getProperty name="pBean"

property="prodManuf" /></td>

<td width="38%"><jsp:getProperty name="pBean"

property="prodPrice" /></td>

</tr>

<%

}

}

%>

<!-- Display the back and next links -->

<tr bgcolor="#FFFFFF">

<td colspan="2" align="center"><br>

<a href="?start=<%= (startRow > 9) ? startRow - 10 : 0%>">Back</a></td>

<td colspan="2" align="center"><br>

<a href="?start=<%= pBean.getCurrentRow() %>">Next</a></td>

</tr>

</table>

</body>

</html>

其中：

· <jsp:useBean id="pBean" scope="session" class="jsplession.ProductBean" />，声明使用的 Javabean，并设置其范围为 session。

· 初始化int rowCount = 0，我们用这个变量来控制每页输出10行数据

· 初始化int startRow = 0，控制翻页的变量，表示当前页面显示数据的起始行数。

· 调用 pBean.populate()，从数据库中获取数据并缓存在 Javabean 中

· 若成功，则获得变量"start"的值 String start = (String) request.getParameter("start")

· 若 start != null，则起始行数 startRow = new Integer(start).intValue()，并设置 Javabean 的起始行数即 pBean.setStartRow(startRow)

· 从起始行开始，调用 pBean.nextRow()，循环输出 10 行数据，即

while (rowCount < 10 && pBean.nextRow() > 0) {

rowCount++;

%>

<tr>

<td width="20%"><jsp:getProperty name="pBean" property="prodID" /></td>

<td width="30%"><jsp:getProperty name="pBean" property="prodDesc" /></td>

<td width="30%"><jsp:getProperty name="pBean"

property="prodManuf" /></td>

<td width="20%"><jsp:getProperty name="pBean"

property="prodPrice" /></td>

</tr>

<%

}

· 设置前一页的超链接：<a href="?start=<%= (startRow > 9) ? startRow - 10 : 0%>">Back</a>

· 设置后一页的超链接：<a href="?start=<%= pBean.getCurrentRow() %>">Next</a>

·部署运行

n 部署文件

· 编译 ProductBean.java，把 class 文件放到 WEB-INF\classes\jsplession 目录下。

· 把 productList.jsp 放到应用程序 javabeantest 目录下。

n 在 IE 浏览器的地址栏中输入 http://localhost:8080/jsp_test/productlist.jsp