版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第15章 网上书店实例在本章中我们使用JSP和Java Bean来构建一个网上书店。本章介绍的例子可以分成两大部分,第一部分是普通程序,用于客户在网上选购图书,第二部分是管理程序,用于在服务器端处理客户的定单。客户端程序由以下几个部分构成:default.jsp:会员登录界面(首页;checklogon.jsp:检测登录代码和密码是否一致,根据由JavaBean返回的结果显示不同的信息。BuyerBean:会员的合法性检验所用的Bean;booklist.jsp:给登录会员显示当前书店中可供选择的图书;addcart.jsp:将所选的图书加入购物车;shoppingcart.jsp:查看购物车
2、的内容;本例的数据库采用Access(.MDB数据库),对数据库的访问采用便于理解的JDBC-ODBC方式,在使用本例前先在本地数据库建立一个ODBC数据源:bookstore。设置步骤如下:(1)在开始->设置->控制面版(Win98、NT4.0)中选取“数据源(ODBC)”;在Win 2000 Professional和Server中分别位于“开始->设置->控制面版->管理工具”和“开始->程序->管理工具”下。(2)启动“数据源(ODBC)”配置程序,界面如图15-1所示。图15-1 ODBC数据源管理界面(3)在图15-1中“系统DSN”选项
3、下单击“添加”按钮,来添加一个系统的数据源(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 会员登录做一个网上书店,在顾客开始购书之前,必须要记录用户的
4、一些信息以便用户在不同的分类、不同的页面购书时,最后能够去收款台统一结帐,而且网上书店同时有许多人在选购图书,也要求对不同的顾客进行区分,我们可以要求顾客在购书之前进行注册成为会员,以后只用会员代码和密码即可登录。为了便于说明现在的电子商务网站,由JSP做页面表现,由Java Bean做应用逻辑的结构,在本例中将会员登录程序分成两大部分:一、Java Bean用于对数据库的操作,验证用户名和密码是否正确;二、JSP页面部分,用于供用户会员代码和密码以及显示验证结果。会员登录Java Bean我们网上书店中的会员信息的库结构如图15-5所示:图15-5 会员信息库其中memberID 是主键,用
5、于区分不同的会员,新会员注册时只能使用没有被使用的用户代码。在验证时我们只要使用验证用户的memberID和其pwd是否一致即可判断该用户是否合法,如果合法则其登录次数加1。下面是用户验证部分的Java Bean的代码清单15-1 BuyerBean.Java*Copyright © 2000, 2001 by cuug llp.*本Bean中有两个set方法和两个get 方法:*setMemberID( 对BuyerBean中的memberID属性进行赋值;*setPwd( 对BuyerBean中的 pwd 属性进行赋值;*getLogontimes( 取该会员登录的次数*getM
6、enberName()获得该会员的真实姓名,用于显示欢迎信息。*main( 方法用于将BEAN作为一个 Application进行测试时使用,正式发布时可以删除。*/package cuug;public class BuyerBean private String memberID = null ; /会员IDprivate String memberName = null; /会员姓名private String pwd = null; /密码private int logontimes = -1; /登录的次数private static String strDBUrl = “jdbc:
7、odbc:bookstore”; /数据源 ,private Connection conn =null; /连接private ResultSet rs = null; /结果集public BuyerBean ( /加载JDBC-ODBC驱动try Class.forName(strDBDriver ;/捕获异常 /获得登录次数,登录的会员的名字也在该方法调用时获得public int getLogontimes(String strSql = null;tryconn = DriverManager.getConnection(strDBUrl;Statement stmt = conn
8、.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(;/如果是合法会员则将其登录次数加1if (logonti
9、mes != -1 strSql = “Update buyerInfo set logonTimes = logonTimes +1 where memberID = ” + memberID + “”;stmt.executeUpdate(strSql;stmt.close(;conn.close(;/捕获异常catch(SQLException ereturn logontimes ;/设置memberID属性;public void setMemberID(String IDthis.memberID = ID;/设置pwd 属性public void setPwd(String pa
10、sswordthis.pwd = password;/获得该会员的真实姓名,必须在取该会员登录的次数之后才能被赋予正确的值public String getMemberName(return memberName;/测试Bean中的各个方法是否能够正常工作public static void main(String argsBuyerBean buyer = new BuyerBean(;buyer.setMemberID(“abcd”;buyer.setPwd(“1234”; 在BuyerBean中用了package cuug; 在发布到WEB SERVER时,可以用JAR(JDK中带的打包
11、工具)把编译后的BuyerBean.class 打包成JAR文件在服务器的环境变量classpath中给予指定,或者在服务器classpath环境变量指定的目录下建一个cuug文件夹,把BuyerBean.class放到cuug目录下。会员登录要由两个部分来完成,第一个页面用于会员输入其ID和密码,当然首页还可以加一些广告等的其它信息,在本例中略过。清单15-2 default.htm2312” > Copyright © 1999 cuug,liu.CUUG 网上书店会员登录页 请输入会员代号和密码: 会员代码: 密 &
12、#160;码: 登录”>在本例中提供了一个文本框供用户输入会员代号和登录密码,其运行结果如图15-6所示,当会员输入其代码和密码后调用checklogon.jsp 来验证该网络用户是否是合法会员。图15-6 会员登录页在checklogon.jsp 中接收从default.htm中由用户所填的会员代码和密码,把它传给BuyerBean,由BuyerBean判断该用户的会员代码和密码的正确性,若正确显示欢迎信息;若不正确,则提供一个重新登录的链接。Checklogon.jsp的源代码如下:清单15-3 checklogon.jsp3C/DTD HTML 4.0 Transitional/E
13、N”><% page language=”Java” contentType=”text/html;charset=GB2312”%><META name=”CHECKLOGON” >CUUG 网上书店<%String memberID = request.getParameter(“memberID”;String pwd = request.getParameter(“pwd”;buyer.setMemberID(memberID;buyer.setPwd(pwd;%> <% int logonTimes = buyer.getLogonti
14、mes( ;if (logonTimes > 0session.putValue("memberID",memberID;%><%= buyer.getMemberName( %>欢迎你第<%= logonTimes +1%>次来到CUUG网上书店进入书店<%else%>对不起,<%= memberID %>你的用户名和密码不一致重新登录<%>登录正确时的结果如图15-7所示,错误时的结果如图15-8所示。图15-7 用户登录正确(会员abcd的真实姓名是cuug001)图15-8 用户登录错误15.2
15、 选书会员登录之后,合法的用户将可以看到本书店中可供选择的图书,并且将他感兴趣的书放入“购物车”,在去“收银台”结帐之前,该用户可以放弃购买其购物车中的任何一本书。在此处我们用BookBean来获取图书的信息,在Booklist.jsp中显示这些书。在会员选书部分,我们仍用Java Bean来操作数据库,用jsp来做页面表现。图书信息的表结构如图15-9所示,为了便于说明,在本例中price也设置成了String型,在实际应用中应该设置成货币或浮点型:图15-9 图书信息的表结构其中,bookISBN是主键,区分不同的图书。Java Bean要根据不同的图书的bookISBN来获得其相应的书名
16、、作者、出版社、价格、简介等信息。同时Java Bean还要有列出书店中所有图书的信息的功能。清单15-4 BookBean.Java*Copyright © 2000, 2001 by cuug ,llp.*本Bean中的各个方法的功能介绍如下:*setBookISBN(:设置图书的编号,同时根据编号更新相应的书名、作者、出版社、价格*和简介*getBookList( 取得书库中全部书的书名、出版社、价格、作者等信息;*getBookISBN( 取得当前图书的编号 ;*getBookName(取得当前图书的书名;*getBookAuthor(取得当前图书的作者;*getPublis
17、her(取得当前图书的出版社信息;*getPrice(取得当前图书的价格;* getIntroduce()取得当前图书的简介信息。*main(方法用于将BEAN作为一个 Application进行测试时使用,正式发布时可以删除。*/package cuug;public class BookBean private String bookISBN = null; /图书编号private String bookName = null; /书名private String bookAuthor = null; /作者private String publisher = null; /出版社pri
18、vate String introduce = null; /简介private String price = null; /价格private static String strDBUrl = "jdbc:odbc:bookstore"private Connection conn =null;private ResultSet rs = null; public BookBean(/加载驱动try Class.forName(strDBDriver ; /取当前书库中全部图书信息public ResultSet getBookList(String strSql = n
19、ull;try/建立与数据库的连接conn = DriverManager.getConnection(strDBUrl;Statement stmt = conn.createStatement(;strSql = "Select bookISBN,bookName,bookAuthor,publisher,price from bookInfo "rs = stmt.executeQuery(strSql; /捕获异常catch(SQLException ereturn rs ;/根据图书的编号给图书的其他信息赋值private void getBookInfo(Str
20、ing ISBNString 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 + "'"r
21、s = 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 /给图书的编号
22、赋值,同时调用函数给图书的其他信息赋值public void setBookISBN (String ISBNthis.bookISBN = ISBN;getBookInfo(bookISBN;/取图书编号public String getBookISBN (return bookISBN ; /取书名public String getBookName(return bookName ;/取作者信息public String getBookAuthor(return bookAuthor;/取出版社信息public String getPublisher(return publisher;/取
23、图书简介public String getIntroduce(return introduce ;/取图书价格public String getPrice(return price; /将Bean作为一个application进行测试用public static void main(String argsBookBean book = new BookBean (;book.setBookISBN("7-5053-5316-4"tryResultSet tmpRS = book.getBookList(;while (tmpRS.next( tmpRS.close(;/捕获
24、异常catch(Exception e 会员正确登录之后,即可进入书店进行选书,我们已经在checklogon.jsp中将会员的代码(memberID)放入系统的session中,为了保证用户只能从主页面登录进入书店,我们在给会员显示可供选择的图书之前,先检查session中是否有memberID的合法值,如果没有则提示用户先去登录。清单15-5 booklist.jsp3C/DTD HTML 4.0 Transitional/EN"><META http-equiv="Content-Style-Type" content="text/cs
25、s">CUUG 网上书店<% if (session.getValue("memberID" = null|"".equals(session.getValue("memberID"%>请先登录,然后再选书登录<%else%><%ResultSet rs = book.getBookList(;while(rs.next(String ISBN = rs.getString("bookISBN"%> <% %> <书名作者出版社定价 &
26、lt;%= ISBN%>"><%= rs.getString("bookName"%><%= rs.getString("bookAuthor"%><%= rs.getString("publisher"%><%= rs.getString("price"%>加入购物车der="0"> 查看购物车 <%>已经登录过的会员和没有登录过的会员进入该页面是的结构分别如图15-10和图15-11所示:正确登
27、录的会员的会员代码在浏览器的标题栏显示为:member:“会员代码”。图15-10 会员abcd正确登录图15-11 会员未登录直接来选书在本例中利用JavaScript语句定义了一个函数来将所调用另外的一个jsp来处理把书加入购物车的操作:addcart.jsp利用Cookie来保存所选购的图书信息,Cookie相当于一个购物车。为了与其他的Cookie变量区分,每个写入Cookie的图书编码前面都加上“ISBN”作为标志,向购物车中加入图书的代码如下:清单15-6 addcart.jsp3C/DTD HTML 4.0 Transitional/EN"><% page
28、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日respo
29、nse.addCookie(cookie;%><META http-equiv="Content-Type" content="text/html; charset=gb2312">图书已经成功放入购物车!查看购物车SHOPPING CART提交定单 ORDERLANGUAGE="Javascript" onclick="window.close(" style="border: #006699 solid 1px;background:#ccCCcc">(此窗口将为您在
30、10秒内自动关闭,您的商品已经安全地保存在购物车中。)在addcart.jsp中利用JavaScript定义了一个函数Timer(),由它来控制该窗口的显示时间()。继续购买部分也是由JavaScript定义的函数来控制关闭本窗口。其运行结果如图15-12所示。图15-12 加入购物车无论从图15-12还是图15-13所示的界面中,都提供了一个查看购物车的超链接,查看购物车的程序如下所示,它从Cookie中取出图书的编号,并将它传给BookBean,由BookBean来获得图书的详细资料。查看购物车的JSP代码shoppingcart.jsp代码如下:清单15-7 shoppingcart.j
31、sp3C/DTD HTML 4.0 Transitional/EN"><% page language="Java" contentType="text/html;charset=gb2312"%><%/*禁止使用浏览器Cache*/response.setHeader("Pragma", "No-cache"response.setHeader("Cache-Control", "no-cache"response.setDateHeade
32、r("Expires",0;%><META http-equiv="Content-Style-Type" content="text/css">CUUG 网上书店购物车<% /*读取购物车信息*/Cookie cookies=request.getCookies(;for (int i=0;i String isbn=cookiesi.getName(;String num=cookiesi.getValue(;if (isbn.startsWith("ISBN"&&isb
33、n.length(=17 bookinfo.setBookISBN(isbn.substring(4,17;%> <% %> ISBN书名单价数量<%=bookinfo.getBookISBN(%><%= bookinfo.getBookName(%><%= bookinfo.getPrice(%><%=num%>name="num" readonly>删除返回首页清空购物车修改数量填写提交订单查看购物车的结果如图15-13所示:图15-13 查看购物车内容在查看购物车内容时提供了一个删除图书的功能,其
34、目的是从购物车删除不想购买的图书,其源代码如下:清单15-8 delbook.jsp3C/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
35、.getParameter("isbn","0" cookie.setMaxAge(0;/设定Cookie立即失效response.addCookie(cookie;%>删除图书 .本例中利用jsp:forward动作在删除图书动作完成之后,将页面继续转向购物车页面。即图15-14只显示一瞬间,浏览器的内容由成为购物车内容的页面。图15-14 删除图书的页面如果一个会员选了很多书,逐个删除比较麻烦。为了方便会员放弃选购的所有图书,重新开始选书,本例提供了清空购物车程序(emptycart.jsp),用于清空购物车,其原理与删除图书相同,只是把全部的
36、Cookie中图书的有关的内容都清空了。其代码如下:清单15-9 emptycart.jsp<% page language="Java" contentType="text/html;charset=GB2312"%><%/*清空Cookie(购物车信息*/Cookie cookies=request.getCookies(;for (int i=0;i String isbn=cookiesi.getName(;if (isbn.startsWith("ISBN"&&isbn.length(=17
37、 Cookie c=new Cookie(isbn,"0" c.setMaxAge(0;/设定Cookie立即失效response.addCookie(c;%>清空购物车.图15-15 清空购物车的页面从图书选择页面和购物车页面,点图书名称,都可以查看图书的详细信息,查看图书详细信息的jsp仍用BookBean来获取图书的详细信息,只是在该页中可以看到更加详细的信息:清单15-10 bookinfo.jsp3C/DTD HTML 4.0 Transitional/EN"><% page language="Java" cont
38、entType="text/html;charset=gb2312"%><META http-equiv="Content-Style-Type" content="text/css"><%/*读取购物车信息*/if (request.getParameter("isbn"!=null String isbn = request.getParameter("isbn" bookinfo.setBookISBN(isbn; %> ISBN<%= bookinfo
39、.getBookISBN(%>书名<%= bookinfo.getBookName(%>出版社<%= bookinfo.getPublisher(%>作者/译者<%= bookinfo.getBookAuthor(%>图书价格<%= bookinfo.getPrice(%>内容简介</span></p><p style=""><span span><%= bookinfo.getIntroduce(%><%else out.println("没有
40、该图书数据"%>加入购物车查看购物车返回首页其运行结果如图15-16所示。图15-16 图书详细信息15.3 定单提交及查询用户一旦确定购物车中所选的图书都是其所要购买的,就要到去提交其定单,以便书店按照相应的方式进行处理。而且,为方便用户是否已经提交定单,及定单的状态,本例提供了定单查询功能。在此处我们用OrderBean来将定单提交到数据库中,在order.jsp中显示并提交定单信息,queryorder.jsp来查询定单。在会员选书部分,我们仍用Java Bean来操作数据库,用jsp来做页面表现。为了减少数据冗余,定单信息由两张表来记录其信息:orderInfo,记录定
41、单的有关公用信息,orderdetail,记录该定单包含哪些书籍及数量,表结构分别如下:图15-17 定单信息表结构图15-18 定单详细所有的对数据库的操作都由JavaBean来完成,其代码如下:清单15-11 OrderBean.Javapackage cuug;public class OrderBean private static String strDBUrl = "jdbc:odbc:bookstore"private Connection conn =null;private ResultSet rs = null;public OrderBean(try
42、Class.forName(strDBDriver ;public static void main(String args/* 返回定单的总价。*/return oderprice;/*返回定单的日期 。*/return orderDate;/* 返回定单的ID号。*/return orderID;/* 返回定单的备注信息。*/return orderRem;/* 返回接收者的地址*/return receiverAddress;/* 返回接收者的姓名。*/return receiverName;/* 返回接收者的邮政编码。*/return receiverZip;/* 获得用户ID。*/r
43、eturn userID;/* 给图书信息赋值。*/bookinfo = newBookinfo;createNewOrder(;int fromIndex = 0;int tmpIndex = 0;int tmpEnd = 0;String strSql = null;tryconn = DriverManager.getConnection(strDBUrl;Statement stmt = conn.createStatement(;while(bookinfo.indexof('',fromIndex != -1 tmpEnd = bookinfo.indexOf(
44、39;',fromIndex;tmpIndex = bookinfo.lastIndexof('=',tmpEnd;strSql = "insert into orderdetail (orderID ,bookISBN ,bookcount"+ " values( '" getOrderID( + "', '" + bookinfo.substring(fromIndex ,tmpIndex + "', "+ bookinfo.substring(tmpIn
45、dex+1 ,tmpEnd + " " ;stmt.executeUpdate(strSql;fromIndex = tmpEnd + 1;stmt.close(;conn.close(;catch(SQLException e/*给定单的总价赋值。*/oderprice = newOderprice;/* 给定单的备注赋值。*/orderRem = newOrderRem;/* 给接收者的地址赋值。*/receiverAddress = newReceiverAddress;/* 给接收者的姓名赋值。*/receiverName = newReceiverName;/*
46、给接收者的邮政编码代码赋值。*/receiverZip = newReceiverZip;/* 给用户代码赋值。*/userID = newUserID;/* 创建一个新定单*/private void createNewOrder( String strSql = null;tryconn = DriverManager.getConnection(strDBUrl;Statement stmt = conn.createStatement(;strSql = "insert into orderInfo (userID,receiverName,receiverAddress,r
47、eceiverZip,orderRem,orderPrice,Orderdate"+ " values( '" getUserID( + "', '" + getReceiverName( + "', '"+ getReceiverAddress( + "', '" + getReceiverZip( + "', '" + getOrderRem( + "', "+ getOrderPr
48、ice( + " ,'" getOrderDate( + "'" ;stmt.executeUpdate(strSql;strSql = "select max(OrderID from orderInfo where userID = '" getUserID( + "' and receiverName = '" + getReceiverName( + "' and receiverAddress = '" + getReceiver
49、Address( +"' and receiverZip = '" + getReceiverZip( +"' and orderRem = '" + getOrderRem( + "' and orderPrice = " + getOrderPrice( +" and Orderdate = '" getOrderDate( + "'" ;orderID = 0;rs = stmt.executeQuery(strSql;while (
50、rs.next(orderID = rs.getString("OrderID"rs.close(;stmt.close(;conn.close(;catch(SQLException e在本Bean中,如果一张定单中有多种书籍,可以以“BOOKISBN = BOOKCOUNT;BOOKISBN = BOOKCOUNT;”的形式组成字符串,来向JAVABEAN中的bookinfo赋值。在赋值后,Bean内部完成创建定单,并将各个图书信息拆分,提交定单的详细信息。用jsp页面来显示用户所选的图书的信息,并提供一个提交按纽,为便于程序的管理,我们将显示和处理结果放在一个JSP中
51、,其代码如下:清单15-12 order.jsp3C/DTD HTML 4.0 Transitional/EN"><% page language="Java" contentType="text/html;charset=GB2312"%><%/*禁止使用浏览器Cache,网页立即失效*/response.setHeader("Pragma", "No-cache"response.setHeader("Cache-Control", "no-cac
52、he"response.setDateHeader("Expires",0;%><META http-equiv="Content-Style-Type" content="text/css"><%if ("send".equals(request.getParameter("send" orderBean.setUserID(session.getValue("memberID"String str=request.getParameter("receivername"orderBean.setReceiverName(str=null?"":str;str=request.getParameter("orderprice"str=request.getParameter("address"orderBean.setReceiverAddress(str=null?"":str;str=req
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年某科技公司与某政府机构关于智慧城市建设的研究与开发合同
- 2024年标准化项目服务合同模板版B版
- 2024年度电脑设备保密及信息安全风险评估合同3篇
- 2024年度文化产业项目总承包合同
- 2024版YXJS04模具实训设备采购与售后服务合同
- 2024年度建筑水电安装承包合同6篇
- 2024年消防设施翻新工程施工合作合同版B版
- 2024年度办公大楼物业设施设备采购与安装合同2篇
- 2024年度商业房屋租赁合同书(附不可抗力条款)3篇
- 2024年度大数据中心建设和运营服务合同3篇
- 遗体异地接收证明范本
- 患者跌倒事件RCA分析
- 中国糖尿病足诊治临床路径(2023版)-
- 信访论文资料
- 2022新能源风电场测风成果分析报告
- 糖尿病肾病血透患者护理查房
- 车辆生产进度保障措施方案
- 2023国开大数据导论实验报告实验2 Hadoop开发环境部署
- 牛津深圳版五年级上册第9单元第1课时优秀公开课课件
- 2021-2022学年广东省广州市白云区五年级(上)期末英语试卷
- 发酵酸菜加工厂建设项目可行性研究报告
评论
0/150
提交评论