资源描述
第15章 网上书店实例
在本章中咱们使用JSP和Java Bean来构建一种网上书店。本章简介例子可以提成两大某些,第一某些是普通程序,用于客户在网上选购图书,第二某些是管理程序,用于在服务器端解决客户定单。客户端程序由如下几种某些构成:
default.jsp:会员登录界面(首页);
checklogon.jsp:检测登录代码和密码与否一致,依照由JavaBean返回成果显示不同信息。
BuyerBean:会员合法性检查所用Bean;
booklist.jsp:给登录会员显示当前书店中可供选取图书;
addcart.jsp:将所选图书加入购物车;
shoppingcart.jsp:查看购物车内容;
本例数据库采用Access(.MDB数据库),对数据库访问采用便于理解JDBC-ODBC方式,在使用本例前先在本地数据库建立一种ODBC数据源:bookstore。
设立环节如下:
(1)在开始->设立->控制面版(Win98、NT4.0)中选用“数据源(ODBC)”;在Win Professional和Server中分别位于“开始->设立->控制面版->管理工具”和“开始->程序->管理工具”下。
(2)启动“数据源(ODBC)”配备程序,界面如图15-1所示。
图15-1 ODBC数据源管理界面
(3)在图15-1中“系统DSN”选项下单击“添加”按钮,来添加一种系统数据源(DSN),则浮现如图15-2所示数据源驱动程序选取界面:
图15-2 数据源驱动程序选取界面
(4)在图15-2中选取“Microsoft Access Driver (*.mdb)”单击“完毕”加载Access数据库驱动,则浮现如图15-3所示数据库ODBC安装界面:
图15-3 数据库ODBC安装界面
(5)在图15-3中单击“选取(S)…”按钮,启动一种类似资源管理器界面来选取数据库,如图15-4所示,在图15-4所示界面中选取bookstore.mdb。
图15-4 数据库选取界面
15.1 会员登录
做一种网上书店,在顾客开始购书之前,必要要记录顾客某些信息以便顾客在不同分类、不同页面购书时,最后可以去收款台统一结帐,并且网上书店同步有许多人在选购图书,也规定对不同顾客进行区别,咱们可以规定顾客在购书之迈进行注册成为会员,后来只用会员代码和密码即可登录。
为了便于阐明当前电子商务网站,由JSP做页面体现,由Java Bean做应用逻辑构造,在本例中将会员登录程序提成两大某些:一、Java Bean用于对数据库操作,验证顾客名和密码与否对的;二、JSP页面某些,用于供顾客会员代码和密码以及显示验证成果。
15.1.1 会员登录Java Bean
咱们网上书店中会员信息库构造如图15-5所示:
图15-5 会员信息库
其中memberID 是主键,用于区别不同会员,新会员注册时只能使用没有被使用顾客代码。
在验证时咱们只要使用验证顾客memberID和其pwd与否一致即可判断该顾客与否合法,如果合法则其登录次数加1。
下面是顾客验证某些Java Bean代码
清单15-1 BuyerBean.Java
/* *BuyerBean.Java 1.10.
*Copyright © , by cuug llp.
*本Bean中有两个set办法和两个get 办法:
*setMemberID()— 对BuyerBean中memberID属性进行赋值;
*setPwd()—对BuyerBean中 pwd 属性进行赋值;
*getLogontimes()— 取该会员登录次数
*getMenberName()获得该会员真实姓名,用于显示欢迎信息。
*main()办法用于将BEAN作为一种 Application进行测试时使用,正式发布时可以删除。
**/
package cuug;
import Java.sql.*;
public class BuyerBean {
private String memberID = null ; //会员ID
private String memberName = null; //会员姓名
private String pwd = null; //密码
private int logontimes = -1; //登录次数
private static String strDBDriver = “sun.jdbc.odbc.JdbcOdbcDriver”; //JDBC驱动
private static String strDBUrl = “jdbc:odbc:bookstore”; //数据源 ,
private Connection conn =null; //连接
private ResultSet rs = null; //成果集
public BuyerBean (){
//加载JDBC-ODBC驱动
try {
Class.forName(strDBDriver );
}
//捕获异常
catch(Java.lang.ClassNotFoundException e){
System.err.println(“BuyerBean():” + e.getMessage());
}
}
//获得登录次数,登录会员名字也在该办法调用时获得
public int getLogontimes(){
String strSql = null;
try{
conn = DriverManager.getConnection(strDBUrl);
Statement stmt = conn.createStatement();
strSql = “Select logonTimes,membername from buyerInfo where memberID = ‘” +
memberID + “’ and pwd =’” + pwd + “’”;
rs = stmt.executeQuery(strSql);
while (rs.next()){
// 登录次数
logontimes = rs.getInt(“logonTimes”);
//会员姓名
memberName = rs.getString(“membername”);
}
rs.close();
//如果是合法会员则将其登录次数加1
if (logontimes != -1 ) {
strSql = “Update buyerInfo set
logonTimes = logonTimes +1 where memberID = ‘” + memberID + “’”;
stmt.executeUpdate(strSql);
}
stmt.close();
conn.close();
}
//捕获异常
catch(SQLException e){
System.err.println(“BuyerBean.getLogontimes():” + e.getMessage());
}
return logontimes ;
}
//设立memberID属性;
public void setMemberID(String ID){
this.memberID = ID;
}
//设立pwd 属性
public void setPwd(String password){
this.pwd = password;
}
//获得该会员真实姓名,必要在取该会员登录次数之后才干被赋予对的值
public String getMemberName(){
return memberName;
}
//测试Bean中各个办法与否可以正常工作
public static void main(String args[]){
BuyerBean buyer = new BuyerBean();
buyer.setMemberID(“abcd”);
buyer.setPwd(“1234”);
System.out.println(buyer.getLogontimes());
System.out.println(buyer.getMemberName());
}
}
在BuyerBean中用了package cuug;在发布到WEB SERVER时,可以用JAR(JDK中带打包工具)把编译后BuyerBean.class 打包成JAR文献在服务器环境变量classpath中予以指定,或者在服务器classpath环境变量指定目录下建一种cuug文献夹,把BuyerBean.class放到cuug目录下。
15.1.2 会员登录htm与JSP
会员登录要由两个某些来完毕,第一种页面用于会员输入其ID和密码,固然首页还可以加某些广告等其他信息,在本例中略过。
清单15-2 default.htm
<contentType=”text/html;charset=gb2312”>
<HTML>
<!—
Copyright © 1999 cuug,liu.
à
<HEAD>
<TITLE>CUUG ON LINE BOOK STORE – MEMBER LOGIN</TITLE>
</HEAD>
<BODY bgcolor=”white”>
<H1 align=”center”>CUUG 网上书店</H1>
<H2 align=”center”>会员登录页</H2>
<P> </P>
<P> </P>
<CENTER>
<FORM METHOD=POST ACTION=”checklogon.jsp”>
<BR>
<font size=5 color=”green”>
请输入会员代号和密码:<br>
会员代码:<input TYPE=”text” name=memberID > <BR>
密 码:<input TYPE=”password” name=pwd > <BR>
<br> <INPUT TYPE=submit name=submit Value=”登录”>
</font>
</FORM>
</CENTER>
</BODY>
</HTML>
在本例中提供了一种文本框供顾客输入会员代号和登录密码,其运营成果如图15-6所示,当会员输入其代码和密码后调用checklogon.jsp 来验证该网络顾客与否是合法会员。
图15-6 会员登录页
在checklogon.jsp 中接受从default.htm中由顾客所填会员代码和密码,把它传给BuyerBean,由BuyerBean判断该顾客会员代码和密码对的性,若对的显示欢迎信息;若不对的,则提供一种重新登录链接。
Checklogon.jsp源代码如下:
清单15-3 checklogon.jsp
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<%@ page language=”Java” contentType=”text/html;charset=GB2312”%>
<jsp:useBean class=”cuug.BuyerBean” id=”buyer” scope=”page”></jsp:useBean>
<HTML>
<HEAD>
<META name=”CHECKLOGON” >
<TITLE>
CUUG ON LINE BOOK STORE – MEMBER LOGIN
</TITLE>
</HEAD>
<BODY BGCOLOR=”#FFFFFF”>
<H1 align=”center”>CUUG 网上书店</H1>
<%
String memberID = request.getParameter(“memberID”);
String pwd = request.getParameter(“pwd”);
buyer.setMemberID(memberID);
buyer.setPwd(pwd);
%>
<% int logonTimes = buyer.getLogontimes() ;
if (logonTimes > 0){
session.putValue("memberID",memberID);
%>
<H2 align=”center”><%= buyer.getMemberName() %>欢迎你第
<%= logonTimes +1%>次来到CUUG网上书店</H2>
<H2 align=”center”><A href=”booklist.jsp”>进入书店</A></H2>
<%
}
else{
%>
<H2 align=”center”>对不起,<%= memberID %>你顾客名和密码不一致</H2>
<H2 align=”center”><A href=”default.htm”>重新登录</A></H2>
<%
}
%>
</BODY>
</HTML>
登录对的时成果如图15-7所示,错误时成果如图15-8所示。
图15-7 顾客登录对的(会员abcd真实姓名是cuug001)
图15-8 顾客登录错误
15.2 选书
会员登录之后,合法顾客将可以看到本书店中可供选取图书,并且将她感兴趣书放入“购物车”,在去“收银台”结帐之前,该顾客可以放弃购买其购物车中任何一本书。在此处咱们用BookBean来获取图书信息,在Booklist.jsp中显示这些书。
在会员选书某些,咱们仍用Java Bean来操作数据库,用jsp来做页面体现。
15.2.1 选书Java Bean
图书信息表构造如图15-9所示,为了便于阐明,在本例中price也设立成了String型,在实际应用中应当设立成货币或浮点型:
图15-9 图书信息表构造
其中,bookISBN是主键,区别不同图书。Java Bean要依照不同图书bookISBN来获得其相应书名、作者、出版社、价格、简介等信息。同步Java Bean还要有列出书店中所有图书信息功能。
清单15-4 BookBean..Java
/* *BuyerBean.Java 1.10.
*Copyright © , by cuug ,llp.
*本Bean中各个办法功能简介如下:
*setBookISBN():设立图书编号,同步依照编号更新相应书名、作者、出版社、价格*和简介
*getBookList()— 获得书库中所有书书名、出版社、价格、作者等信息;
*getBookISBN()— 获得当前图书编号 ;
*getBookName()—获得当前图书书名;
*getBookAuthor()—获得当前图书作者;
*getPublisher()—获得当前图书出版社信息;
*getPrice()—获得当前图书价格;
* getIntroduce()获得当前图书简介信息。
*main()办法用于将BEAN作为一种 Application进行测试时使用,正式发布时可以删除。
**/
package cuug;
import Java.sql.*;
public class BookBean {
private String bookISBN = null; //图书编号
private String bookName = null; //书名
private String bookAuthor = null; //作者
private String publisher = null; //出版社
private String introduce = null; //简介
private String price = null; //价格
private static String strDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
private static String strDBUrl = "jdbc:odbc:bookstore";
private Connection conn =null;
private ResultSet rs = null;
public BookBean(){
//加载驱动
try {
Class.forName(strDBDriver );
}
catch(Java.lang.ClassNotFoundException e){
System.err.println("BookBean ():" + e.getMessage());
}
}
//取当前书库中所有图书信息
public ResultSet getBookList(){
String strSql = null;
try{
//建立与数据库连接
conn = DriverManager.getConnection(strDBUrl);
Statement stmt = conn.createStatement();
strSql = "Select bookISBN,bookName,bookAuthor,publisher,price from bookInfo ";
rs = stmt.executeQuery(strSql);
}
//捕获异常
catch(SQLException e){
System.err.println("BookBean.getBookList():" + e.getMessage());
}
return rs ;
}
//依照图书编号给图书其她信息赋值
private void getBookInfo(String ISBN){
String strSql = null;
bookName = null;
bookAuthor = null;
publisher = null;
introduce = null;
price = null;
try{
//建立和数据库连接
conn = DriverManager.getConnection(strDBUrl);
Statement stmt = conn.createStatement();
strSql = "Select * from bookInfo where bookISBN = '" + ISBN + "'";
rs = stmt.executeQuery(strSql);
while (rs.next()){
bookName = rs.getString("bookName");
bookAuthor = rs.getString("bookAuthor");
publisher = rs.getString("publisher");
introduce = rs.getString("introduce");
price = rs.getString("price");
}
}
//捕获异常
catch(SQLException e){
System.err.println("BookBean.getBookList():" + e.getMessage());
}
}
//给图书编号赋值,同步调用函数给图书其她信息赋值
public void setBookISBN (String ISBN){
this.bookISBN = ISBN;
getBookInfo(bookISBN);
}
//取图书编号
public String getBookISBN (){
return bookISBN ;
}
//取书名
public String getBookName(){
return bookName ;
}
//取作者信息
public String getBookAuthor(){
return bookAuthor;
}
//取出版社信息
public String getPublisher(){
return publisher;
}
//取图书简介
public String getIntroduce(){
return introduce ;
}
//取图书价格
public String getPrice(){
return price;
}
//将Bean作为一种application进行测试用
public static void main(String args[]){
BookBean book = new BookBean ();
book.setBookISBN("7-5053-5316-4");
System.out.println(book.getBookName());
System.out.println(book.getBookAuthor());
System.out.println(book.getPublisher());
System.out.println(book.getIntroduce());
System.out.println(book.getPrice());
try{
ResultSet tmpRS = book.getBookList();
while (tmpRS.next()){
System.out.println(tmpRS.getString("bookname"));
}
tmpRS.close();
}
//捕获异常
catch(Exception e){
System.err.println("main()" + e.getMessage());
}
}
}
15.2.2 选书JSP
会员对的登录之后,即可进入书店进行选书,咱们已经在checklogon.jsp中将会员代码(memberID)放入系统session中,为了保证顾客只能从主页面登录进入书店,咱们在给会员显示可供选取图书之前,先检查session中与否有memberID合法值,如果没有则提示顾客先去登录。
清单15-5 booklist.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ page language="Java" import="Java.sql.*" contentType="text/html;charset = gb2312"%>
<jsp:useBean class="cuug.BookBean" id="book" scope="page"></jsp:useBean>
<HTML>
<HEAD>
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>
CUUG Book Store On Line -member:<%= session.getValue("memberID") %>
</TITLE>
<SCRIPT language="JavaScript">
<!--
function openwin(str)
{ window.open("addcart.jsp?isbn="+str,
"shoppingcart","width=300,height=200,resizable=1,scrollbars=2");
return;
}
//-->
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<H1 align="center">CUUG 网上书店</H1>
<%
if (session.getValue("memberID") == null||"".equals(session.getValue("memberID"))){
%>
<H2 align="center">请先登录,然后再选书</H2>
<H2 align="center"><A href="default.htm">登录</A></H2>
<%
}
else{
%>
<table width="100%" border="1" cellspacing="0" bordercolor="#9999FF">
<tr>
<td><font color="#3333FF">书名</font></td>
<td><font color="#3333FF">作者</font></td>
<td><font color="#3333FF">出版社</font></td>
<td><font color="#3333FF">定价</font></td>
<td> </td>
</tr>
<%
ResultSet rs = book.getBookList();
while(rs.next()){
String ISBN = rs.getString("bookISBN");
%>
<tr>
<td><a href="bookinfo.jsp?isbn=
<%= ISBN%>"><%= rs.getString("bookName")%></A></td>
<td><%= rs.getString("bookAuthor")%></td>
<td><%= rs.getString("publisher")%></td>
<td><%= rs.getString("price")%></td>
<td><a href='Javascript:openwin("<%= ISBN %>")'>加入购物车</a></td>
</tr>
<%
}
%>
</table>
<table align="center" border="0">
<tbody>
<tr>
<td><a href="shoppingcart.jsp"><font color="#0000FF">查看购物车</font></a></td>
<td></td>
</tr>
</tbody>
</table>
<p> </p>
<%
}
%>
</BODY>
</HTML>
已经登录过会员和没有登录过会员进入该页面是构造分别如图15-10和图15-11所示:对的登录会员会员代码在浏览器标题栏显示为:member:“会员代码”。
图15-10 会员abcd对的登录
图15-11 会员未登录直接来选书
在本例中运用JavaScript语句定义了一种函数来将所调用此外一种jsp来解决把书加入购物车操作:
<SCRIPT language="JavaScript">
<!--
function openwin(str)
{ window.open("addcart.jsp?isbn="+str,
"shoppingcart","width=300,height=200,resizable=1,scrollbars=2");
return;
}
//-->
</SCRIPT>
该函数用于打开addcart.jsp并切将图书编号作为参数传给addcart.jsp。
addcart.jsp运用Cookie来保存所选购图书信息,Cookie相称于一种购物车。为了与其她Cookie变量区别,每个写入Cookie图书编码前面都加上“ISBN”作为标志,向购物车中加入图书代码如下:]
清单15-6 addcart.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ page language="Java" contentType="text/html;charset=GB2312"%>
<%
/*Cookie信息解决*/
/*增长Cookie*/
if (request.getParameter("isbn")!=null)
{ Cookie cookie=new Cookie("ISBN"+request.getParameter("isbn"),"1");
cookie.setMaxAge(30*24*60*60);//设定Cookie有效期限30日
response.addCookie(cookie);
}
%>
<html>
<head>
<script language="Javascript">
function Timer(){setTimeout("self.close()",10000)}
</script>
<META http-equiv="Content-Type" content="text/html;charset=gb2312">
<title>购物车——CUUG 网上订书系统</title>
</head>
<BODY onload="Timer()">
<table width=100%>
<tr><td align=center>图书已经成功放入购物车!</td></tr>
<tr><td align=center><A href="shoppingcart.jsp" target=resourcewindow>
<font class=font1 color=darkblue>
查看购物车SHOPPING CART</font></A></u></font></td></tr>
<tr><td align=center><a href="order.jsp" target=resourcewindow>
<font class=font1 color=darkblue>
提交定单 ORDER</font></a></u></font></td></tr>
<tr><td align=center>
<input type="button" value="继续购买" name="B3"
LANGUAGE="Javascript" onclick="window.close()"
style="border:#006699 solid 1px;background:#ccCCcc"></td>
</tr>
<tr><td align=center>
(此窗口将为您在10秒内自动关闭,您商品已经安全地保存在购物车中。)
</td></tr>
</table>
</BODY>
</html>
在addcart.jsp中运用JavaScript定义了一种函数Timer(),由它来控制该窗口显示时间(<BODY onload="Timer()">)。继续购买某些也是由JavaScript定义函数来控制关闭本窗口。其运营成果如图15-12所示。
图15-12 加入购物车
无论从图15-12还是图15-13所示界面中,都提供了一种查看购物车超链接,查看购物车程序如下所示,它从Cookie中取出图书编号,并将它传给BookBean,由BookBean来获得图书详细资料。查看购物车JSP代码shoppingcart.jsp代码如下:
清单15-7 shoppingcart.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ page language="Java" contentType="text/html;charset=gb2312"%>
<jsp:useBean class="cuug.BookBean" id="bookinfo" scope="page"></jsp:useBean>
<%
/*禁止使用浏览器Cache*/
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
%>
<HTML>
<HEAD>
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>
查看购物车 -member:<%= session.getValue("memberID") %>
</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<H1 align="center">CUUG 网上书店购物车</H1>
<FORM>
<TABLE border="1" width="100%" cellspacing="0" bordercolor="#9999FF">
<TR>
<TD width="82"><font color="#0000FF">ISBN</font></TD>
<TD width="258"><font color="#0000FF">书名</font></TD>
<TD width="62"><font color="#0000FF">单价</font></TD>
<TD width="36"><font color="#0000FF">数量</font></TD>
<TD width="43"><font color="#0000FF"> </font></TD>
</TR>
<%
展开阅读全文