7.3 JSP 之 JDBC 实例一 网上书店
7.3.1 创建 eshop
息加入到数据库中
图7-16 网上书店 结构
为了保存客户在访问过程中选择的图书 即保存订单 我们使用了session 对象 因为 每个访问网站的客户都有一个唯一的session 对象 该对象直到客户离开网站或过期时才会 被撤消
下面 我们逐步实现 网上书店
7.3.1 创建 eshop
在 JRun 服务器中 创建的每一个网站或是一个单独的 Web 页面都可以称之为一个 Web 应用程序 Web Application JRun 服务器为用户提供了一个向导用于创建 Web 应 用程序 包括创建用于保存网站Web 页的本地目录和发布目录
为了使用JRun 服务器创建和发布 网上书店 我们首先应在JRun 服务器中创建一 个Web 应用程序 将 网上书店 发布在 eshop 目录下 我们可按照如下步骤进行
第一步 启动JRun Admin Server
第二步 在 JRun 服务器控制管理页面中选择 JRun Default Server Web Application 如图7-17 所示
在JRun 服务器的 Web Application 管理页面中 提供了 Web 应用程序的编辑 Edit an Application 创建 Create an Application 配置 Deploy an Application 和删除 Remove an Application 等功能
第三步 创建Web 应用程序 eshop
单击 Create an Application 可打开如图7-18 所示页面 将 JRun Server Name 选择为 JRun Default Server 在 Application Name 文本框中输入 Web 应用程序名称
eshop 在 Application URL 文本框中输入 Web 应用程序的发布目录 /eshop 则 可在浏览器中输入 http://hostname:8100/eshop/ 来查看相应的 Web 文档 在 Application Root Dir 文 本 框 中 输 入 保 存 Web 应 用 程 序 文 档 的 本 地 目 录 默 认 为
JRunRoot/servers/default\eshop 可接受默认值 也可选择其他的本地目录 最后 单 击 create 按钮 完成 Web 应用程序的创建
使用JRun 服务器提供的 Web 应用程序创建向导来创建 Web 应用程序的管理和发布目 录 可以方便以后使用JRun 工具进行管理 减少许多复杂的工作
-图7-17 选择创建 Web 应用程序
下面 我们将使用JRun Studio 3.0 来编写需要的各个 JSP 文档 注意 必须将编写的 JSP 文档存放到 eshop 的在 Application Root Dir 目录 即 JRunRoot/servers/default/eshop 目录下
图7-18 创建 Web 应用程序
7.3.2 编写 bookstore.jsp
我们要实现的 网上书店 是一个简单的网站 其目的是为了说明JDBC 在 JSP 中的 应用 所以你最终看到的Web 可能显得很简单 bookstore.jsp 的主要作用是提供 网上书 店 的主页 从中实现或链接到其他页面
bookstore.jsp 文件内容如下 例程 7-9 bookstore.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<table border="0" width="100%">
<tr>
<td>
<font size="+3">
阿当网上书店
</font>
</td>
<td></td>
<td align="center">
<a href="checkout.jsp" title="查看订单,确定购买">查看订单</a>
</td>
</tr>
</table>
<hr>
<center>
<form name="shoppingForm" action="getdata.jsp" method="POST">
<b>图书查询 </b>
<input type="text" name="queryStr" SIZE="20" value="在此输入要查询的图书">
<input type="submit" name="query" value="查询">
</form>
</center>
<hr>
<font size="+2" color="#66ccff">
推荐书目<br>
</font>
<form name="shoppingForm1" action="addtoindent.jsp" method="POST">
<table border="0" cellpadding="0" width="100%" >
<tr>
<td colspan="2"><font size="+2">1 JDBC 程序设计指南 </font></td>
</tr>
<tr>
<td colspan="2" >该书以大量的实例说明了 JDBC 编程技术 其内容涉及到 JSP JAVA SERVLET 中
-的JDBC 编程技术 </td>
<td><input type="hidden" name="bookNo" value="5"></td>
<tr>
<td ></td>
<td align="right">希望出版社 30.50 元/册 <input type="submit" name="recommend1" value="加入到 订单"></td>
</tr>
</table>
</form>
<form name="shoppingForm2" action="addtoindent.jsp" method="POST">
<br>
<table border="0" cellpadding="0" width="100%">
<tr>
<td colspan="2"><font size="+2">2 研究生英语精读教程</font></td>
</tr>
<tr>
<td colspan="2" >研究生英语精读教程辅助读物 包括习题解答 </td>
<td><input type="hidden" name="bookNo" value="3"></td>
<tr>
<td ></td>
<td align="right">中国人民大学出版社 20.00 元/册 <input type="submit" name="recommend2"
value="加入到订单"></td>
</tr>
</table>
</form>
<form name="shoppingForm3" action="addtoindent.jsp" method="POST">
<br>
<table border="0" cellpadding="0" width="100%" >
<tr>
<td colspan="2"><font size="+2">3 Java 类库手册</font></td>
</tr>
<tr>
<td colspan="2" >该书详细介绍了 Java 的各个类以及类成员的定义和使用方法</td>
<td><input type="hidden" name="bookNo" value="1"></td>
<tr>
<td></td>
<td align="right">北京大学出版 80.50 元/册 <input type="submit" name="recommend3" value="加入 到订单"></td>
</tr>
</table>
</form>
<hr>
<font size="-1">
<center>
Copyright to Adam Net Bookstore co. 2001/4/1
</center>
</font></body></html>
在该JSP 文件中 我们利用了 HTML 的表单 FORM 来传递消息 为了将客户选择 的图书存入订单 使用了FORM 中的 INPUT 项目来保存对象图书的编号 该编号是数据 库中该图书的唯一编号 然后将其传递给addtiondent.jsp 文档 addtiondent.jsp 通过 request 对象接收参数
你在浏览器地址栏中输入 http://localhost:8100/eshop/bookstore.jsp 可查看其运行实际 效果 如图7-19 所示
图7-19 bookstore.jsp
7.3.3 编写 getdata.jsp
getdata.jsp 首先将取得客户在主页面中输入的查询字符串 我们可以使用 request 对象 的 getParameter 方法来完成这一要求 在我们取得查询字符串时 需要注意的问题又 是中文处理的问题 经过多次实践 发现在getdata.jsp 文件中 一定记住不要使用<%@ page contentType="text/html;charset=gb2312" %> 使用该语句后 将不能获得正确的中文字符串
这可能会让你感到迷惑 所以 当在浏览器中查看查询结果时 需要在浏览器中选择
查看 编码 简体中文 否则看到的是乱码
另外一个需要说明的是 在获得查询结果时 你可能会使用PreparedStatement 对象 在构造查询字符串时使用参数 同样会导致不能得到正确结果 需要像如下方式来构造查 询
String para=(request.getParameter("queryStr"));
-String str="SELECT * FROM book WHERE bookName like '%"+para+"%'";
PreparedStatement ps=cn.prepareStatement(str);
当然 在其他服务器中也许允许你使用参数查询 这需要你针对使用的服务器进行多
<%@ page contentType="text/html;charset=ISO8859-1" %>
<%@ page import="java.sql.*," %>
<font size="+3">查询结果</font>
________你需要查询的是书名包含 <%=request.getParameter("queryStr") %> 的图书
<hr><p>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:bookDSN");
String para=(request.getParameter("queryStr"));
String str="SELECT * FROM book WHERE bookName like '%"+para+"%'";
PreparedStatement ps=cn.prepareStatement(str);
ResultSet rs=ps.executeQuery();
int i=0;
while(rs.next()){
i++;
out.print("<form name='querydata' action='addtoindent.jsp' method='POST'>");
out.print("<table border='0' cellpadding='0' width='100%'");
out.print("<tr><td colspan='2'><font size='+2'>");
out.print(i);
out.print(" ");
out.print(rs.getString("bookName")+" </font></td></tr>");
out.print("<tr><td colspan='3'>");
out.print(rs.getString("bookAbstract")+"</td><td>");
out.print("<input type='hidden' name='bookNo' value='");
out.print(rs.getString("bookID")+"'></td><tr><td> </td><td align='right'>");
out.print(rs.getString("bookPublish")+" "+rs.getString("bookPrice"));
out.print("<input type='submit' name='recommend1' value='添加到订单'></td></tr>");
out.print("</table></form>");
} ps.close();
cn.close();
%>
<hr>
<font size="+2">
<table border="0" width="100%" >
<tr>
<td align="center">
<a href="bookstore.jsp" title="返回主页">回到主页</a>
</td>
<td align="center">
<a href="checkout.jsp" title="查看订单,确定购买">查看订单</a>
</td></tr>
</table>
</font></body></html>
当我们在主页查询文本框中输出 指南 可获得如图7-20 所示结果
图7-20 查询示例
这是JSP 代码根据从数据库查询结果输出的页面 如果查询没有返回值 则没有查询 结果输出 该例中输出的格式限于篇幅 做得过于简单 当开发一个站点时 你可根据需 要作出更好的Web 页
7.3.4 编写 addtoindent.jsp
addtoindent.jsp 的功能是当客户单击相应的按钮时将对应图书的代码添加到订单中 这 实际上是要实现两个JSP 文件的通信 要保存订单 并且对不同的客户 每一客户都应有 各自唯一的订单存在 我们选择使用session 对象来完成这一功能 因为当每一个客户访问 网站时 系统都为他们创建了一个唯一的session 对象来保存客户的信息 利用这一特点 当用户在访问网站时 我们在其session 对象中加入一个名为 indent 的属性 其值为一
-个Vector 对象 我们在 Vector 对象中保存客户所选择的图书对应的编号 addtoindent.jsp 内容如下
例程 7-11
<html>
<head>
<title>添加订单内容</title>
</head>
<body>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.Vector" %>
<%
//获得图书编号 编号从隐藏按钮的值中获取 String bookid=(request.getParameter("bookNo"));
//首先判断客户是否已经有一个订单 如果没有则创建一个 Vector order=new Vector();
if(session.getValue("indent")!=null) {
order=(Vector)session.getValue("indent");
}
//如果是订单中没有的项目 则添加到订单中 if(!order.contains(bookid))
{
order.addElement(bookid);
session.putValue("indent",order);
}
//将图书编号加入到订单后 将自动回到主页
response.sendRedirect("http://localhost:8100/eshop/bookstore.jsp");
%>
</body>
</html>
首先判断客户是否已经选择了某种图书 如果已选择了订购该图书 则不执行添加操 作 从而避免在订单中出现重复的内容
7.3.5 编写 checkout.jsp
checkout.jsp 用于让客户在决定订购前查看其订购的图书 在查看时 允许客户从订单 中删除某项内容
在checkout.jsp 中 首先从 session 对象中获得客户欲订购的图书编号 然后从数据库 获得图书的相关信息 如书名 单价 内容简介等相关信息
checkout.jsp 内容如下
例程 7-12 checkout.jsp
<html>
<head>
<title>查看订单</title>
</head>
<body>
<center>
<h2>你欲订购的图书信息如下</h2>
<hr>
<%@ page import="java.util.Vector,java.sql.*" %>
<%
//获得订单
Vector orderlist=(Vector)session.getValue("indent");
//构造查询字符串 String instr="(";
//如果客户选择了欲订图书 则显示详细清单 if(orderlist!=null && (orderlist.size()>0)){
for(int i=0;i<orderlist.size();i++){
instr+=orderlist.elementAt(i)+",";
}
instr+=")";
//加载驱动程序 执行查询
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:bookDSN");
String str="SELECT * FROM book WHERE bookID IN "+instr;
PreparedStatement ps=cn.prepareStatement(str);
ResultSet rs=ps.executeQuery();
int i=0;
//输出客户欲订书清单 while(rs.next()){
i++;
out.print("<form name='querydata' action='deletefromindent.jsp' method='POST'>");
out.print("<table border='0' cellpadding='0' width='100%'");
out.print("<tr><td colspan='2'><font size='+2'>");
out.print(i);
out.print(" ");
out.print(rs.getString("bookName")+" </font></td></tr>");
out.print("<tr><td colspan='3'>");
out.print(rs.getString("bookAbstract")+"</td><td>");
out.print("<input type='hidden' name='bookNo' value='");
out.print(rs.getString("bookID")+"'></td><tr><td> </td><td align='right'>");
out.print(rs.getString("bookPublish")+" "+rs.getString("bookPrice"));
out.print("<input type='submit' name='recommend1' value='删除'></td></tr>");
out.print("</table></form>");
}
ps.close();
cn.close();
} %>
</center>
<hr>
<font size="+2">
<table border="0" width="100%" >
<tr>
<td align="center">
<a href="bookstore.jsp" title="返回主页">回到主页</a>
</td>
<td align="center">
<a href="decideorder.jsp" title="我要购买图书">订购图书</a>
</td></tr>
</table> </font>
</body></html>
假设客户选择了两本推荐图书 可获得如图7-21 所示结果
图7-21 checkout.jsp 示例
7.3.6 编写 deletefromindent.jsp
当客户在浏览其欲订图书信息时 如果不想订购其中的某些书籍 可单击 删除 按
钮 将其从订单中删除 单击 删除 按钮 将调用 deletefromindent.jsp 文件 完成删除 订单项目的任务
deletefromindent.jsp 的实现与 addtoindent.jsp 采用了相同的原理 即通过 FORM 传递图 书编号信息
deletefromindent.jsp 文件内容如下 例程 7-13
<html>
<head> <title>删除订单内容</title></head>
<body>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.Vector" %>
<%
//获得欲删除图书的编号 编号从隐藏按钮的值中获取 String bookid=(request.getParameter("bookNo"));
//获得订单
Vector order=(Vector)session.getValue("indent");
//从订单中删除指定项目
order.removeElement(bookid);
session.putValue("indent",order);
//将图书编号加入到订单后 自动返回
response.sendRedirect("http://localhost:8100/eshop/checkout.jsp");
%>
</body></html>
如果我们在浏览图7-21 所示信息时 单击 删除 按钮删除 JDBC 程序设计指南
如果我们在浏览图7-21 所示信息时 单击 删除 按钮删除 JDBC 程序设计指南