《网上书店系统设计-JSP实现.doc》由会员分享,可在线阅读,更多相关《网上书店系统设计-JSP实现.doc(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、网上书店系统设计JSP实现 摘要:本课题主要阐述网上书店的设计与实现过程。具体通过JSP(JAVA SERVER PAGES)技术来建立动态网页,结合MS SQL Server 2000作为后台数据库实现。课题将以网上书店系统的模块为主线展开论述,详细介绍该系统的JSP页面与数据库通信方法以及动态网页的有关理论知识。关键词: JSP. SQL. 一 前言随着Internet和电子商务等应用的出现,动态网页技术也随着它们的出现诞生了。所谓“动态”,就应该具有“交互性”、“自动更新”、“因时因人而变”几个特点。除了早期的CGI外,目前主流的动态网页技术有JSP、ASP、PHP。这些技术都有各自的强
2、势和弱势。JSP页面由HTML代码和嵌入其中的Java代码组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。JSP具备了Java技术的简单易用、完全面向对象、具有平台无关性且安全可靠、主要面向Internet的所有特点。(一)选题背景21世纪是网络时代。网络技术的飞速发展,极大地影响了商业交易中传统的交易方式和流通方式。传统的大型书店,随着业务的不断扩大,书店的规模也不断扩大,迫切需要建立相应的网上书店。利用电子商务的优势同现有销售模式和流通渠道相结合,扩大消费市场,为书店的再发展带来新的商机,也为各地消费者提供便利,而且降低商业成本。
3、目前国内的这种商务网站大多是用ASP来编写,但ASP有它的局限性。它是解释运行的,在多个客户访问的情况下会变得非常慢,而且网站服务器的负荷也很重,且只能运行在微软的操作系统和服务器上。另外不安全性也是需要注意的问题。而JSP的编译操作仅在第一次对页面请求时发生,速度远远大于ASP,而且可以跨操作系统,安全机制和性能均大于ASP。综合各方面的考虑,决定采用JSP+JavaBean/Servlet来开发本网上书店系统,充分利用Java技术的优势,系统稳定高效,而且管理人员通过后台管理能及时地发布新的书讯动态,加强了书店与消费者之间的联系,极大地提高了书店的销售额,取得了显著的效果。(二)方案论证本
4、系统是基于Internet的结构,采用如下图所示的三层架构模型。第一层采用浏览器,操作者通过界面向Web提交服务请求。第二层的Web服务器专门用来进行请求中的逻辑处理,根据请求与第三层的数据库服务器进行数据交易,然后返回浏览者所需要的结果,显示在第一层的浏览器界面上,从而达到远程操作的目的。采用这样的架构改进了传统Client/Server结构的缺点,除降低了Client端程序逻辑的复杂度,更减轻了后端数据库存取的负载,也平衡了整个网络流量。二 网上书店的总体构建(一)网上书店功能分析网上书店的建设总体上分为后台的管理部分和前台用户两大部分。后台的主要功能是增加、删除图书信息,查询图书信息、设
5、定用户的等级,对图书的类别和对出版商进行管理,查询统计图书销售信息。前台主要完成的功能是针对消费者的,包括书店图书分类、查询、排行、推荐、读者反馈和读者购书等。在现实的超市里每个消费者都有一个购物车,在这里也为用户建立一个购物车,只是这里的购物车是虚拟的,但是它却具有现实购物车的功能。(二)数据库分析 表“books”:保存图书的基本信息。 表“customers”:保存会员的基本信息。 表“category”:保存图书类别信息。 表“feedback”:保存图书评比票数信息。 表“supplier”:保存图书出版商信息。 表“salebook”:保存图书销售信息。 表“vouch”:保存读者
6、推荐的图书信息。 表“visit”:保存图书出版商信息。 表“distinction”:保存会员登记制度信息。(三)总体页面构架网上书店的主体框架由3个页面组成,如图(2-3)所示。框架的左侧是图书的类别列表页面,用于满足用户按类别查看图书的需求。框架的头部比较繁杂,用于书店的功能导航。框架的主体部分主要用于用户对图书信息的查看和操作。 图(2-3)三 网上书店的系统实现(一)预备知识1. JSP编程语言介绍 JSP环境的搭配JSP开发环境需要安装:JSDK(包括JVM虚拟机)、Tomcat。 数据库的设计需要安装SQL Server 2000 JSP语法简介JSP主要由模版元素、指令元素、动
7、作元素、脚本元素和JSP内建对象组成。模版元素是指JSP文件中静态HTML或者XML内容。指令是用于从JSP发送到容器上的一个信息,JSP中有四种指令元素,它们是:页面指令、include指令、taglib指令、表达式语言。与指令元素不同,动作元素在请求处理阶段起作用。JSP规范定义了一系列的标准动作,它们用jsp作为前缀,、等都是动作元素。脚本元素包含任意的java脚本代码,主要有声明(Declaration)、表达式(Expression)、Scriptlet。JSP为简化页面的开发提供了一些内部对象主要包括:request、response、out、session、pageContext
8、、application、config、page、exception。 JavaBean的技术简介什么是JavaBean?它是种Java类,通过封装属性和方法成为具有独立功能、可重复使用的并且可以与其他控件通讯的组件对象。JavaBean被组织成为数据包(Package)以便进行管理。JavaBean的结构必须满足一定的命名约定。这些约定Sun和其他几个大公司制定,称为JavaBean API。只要遵守JavaBean API的命名约定,就可以开发出可重用且独立的Java组件。在JSP中,使用bean标签集合,内容开发者不需要编写任何代码就能利用Java强大的功能为页面添加动态元素。在JSP的
9、开发中往往把大段代码放在脚本段(Scriplet)内,但是绝大多数的Java代码属于可重复使用的(如数据库的链接),因此可以把这些重复的代码做成JavaBean组件。JavaBean是一种组件技术,所以JavaBean将内部的动作封装起来,我们看不到它的运行机制,它直提供最小限度的属性接口供外壳控制应用。JavaBean为了提供组件的功能,必须满足以下三种条件。 必须拥有没有参数的构造函数 体现 Serializable Interface 拥有属性接口 Servlet技术Servlet指服务器端小程序,是一种很成熟的技术。从本质上讲Servlet是 一个Java类,Java语言能够实现的功能
10、,Servlet基本都能实现(除了图形界面外)。Servlet主要用于处理Http请求,通常所手的Servlet就是指HttpServlet,用于处理Http请求,能够处理的请求有:Get、Post、Head等。在开发Servlet时,可以直接继承javax.servlet.http.HttpServlet。Servlet需要在web.xml中进行描述,在描述时,主要是执行Servlet的名字、Servlet类、初始参数、安全配置、URL映射、启动的优先权等。Servlet不仅可以生存HTML脚本输出,也可以生产二进制输出。 JSP数据库技术JSP开发离不开数据库编程,几乎所有的JSP项目都使
11、用到数据库。JDBC是一种用于执行SQL的Java API。它为数据库开发人员提供了一系列标准的API函数,使其可以使用纯Java API来开发数据库应用程序。JDBC API为Java开发者使用数据库提供了统一的编程接口,它由一组Java类和接口组成。JDBC API使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。2 SQL结构化查询SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用
12、来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle, Sybase, Microsoft SQL Server, Access等都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select, Insert, Update, Delete, Create, 以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。3. 网上书店的公用组建在网上书店的公用组件中主要介绍JavaBean。图书是最基本的信息,应用的地方也有很多,有必要把它做成一个单独的类:package Book
13、Shop;public class Wareprivate String id;private String name;private int quantity;private float price;private float countprice;public Ware()id=;price=0;quantity=0;countprice=0;public void setId (String id)this.id=id;public String getId()return id;public void setName (String name)this.name=name;public
14、 String getName()return name;public void setCountprice(float countprice)this.countprice=countprice;public float getCountprice()return countprice;public void setPrice(float price)this.price=price;public float getPrice()return price;public void setQuantity (int quantity)this.quantity=quantity;public i
15、nt getQuantity()return quantity;与数据库的连接也需要做成JavaBean,方便以后使用:package BookShop;import java.sql.*;import javax.sql.*;import javax.naming.*;public class MyDbprivate Context ctx=null;private DataSource ds=null;private static Connection conn=null;private Statement stmt=null;private ResultSet rs=null;priva
16、te static int COUNT=0;public MyDb()/*函数功能:关闭数据库连接*/public void close()tryif (rs !=null) rs.close();catch(Exception e)e.printStackTrace(System.err);tryif(stmt!=null) stmt.close();catch(Exception e)e.printStackTrace(System.err);tryif(conn!=null) conn.close();/System.err.println(count - +(-COUNT); catc
17、h(Exception e)e.printStackTrace(System.err);/*函数功能:查询数据库*/public int select(String sql)int k=-10;tryk=0;rs=this.getstmtread().executeQuery(sql);while(rs.next()k+;catch(Exception e)k=-1;e.printStackTrace(System.err);finallythis.close();return k;/*函数功能:连接数据库*/public Connection getCon()tryctx = new Ini
18、tialContext();ds = (DataSource)ctx.lookup(java:comp/env/jdbc/BookShop);conn = ds.getConnection();/System.err.println(count + +(+COUNT);catch(Exception e)e.printStackTrace(System.err);return conn;/*函数功能:更新、删除、插入数据*/public int update(String sql)int k=-10;tryk=0;k=this.getstmt().executeUpdate(sql);catc
19、h(Exception e)k=-1;e.printStackTrace(System.err);finallythis.close();return k;/*函数功能:创建数据库集合*/public Statement getstmtread()tryconn=getCon();stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);catch(Exception e)e.printStackTrace(System.err);return stmt;/*函数功能:创建数据
20、库集合*/public Statement getstmt()tryconn=getCon();stmt=conn.createStatement();catch(Exception e)e.printStackTrace(System.err);return stmt;/*函数功能:做编码转换入库*/public String inStr(String str)if(str=null)str=;elsetrystr=(new String(str.getBytes(iso-8859-1),GB2312).trim();str=str.replace(,(char)1);catch(Excep
21、tion e)e.printStackTrace(System.err);return str;/*函数功能:做编码转换出库*/public String outStr(String str)if(str=null)str=;elsetrystr=str.replace(char)1,);catch(Exception e)e.printStackTrace(System.err);return str;/*函数功能:用于查询处理*/public String selectStr(String str)if(str.equals()str= LIKE % ;elsestr=( LIKE %+s
22、tr+% );return str;(二)前台用户操作进入这个书店的主体框架要从index.htm页跳转过去。如下图所示:点击“阳光书店”4个字就可以进入书店了,如图(2-3)所示。下面对书店的主要功能模块进行实现、讲解。1. 购物车通过“top.jsp”页面的“查看购物车”可以进入购物车相关的代码是:查看购物车购物车的建立方便了用户网上购物,这在每个购物网站都很常见。在网上书店中是不可缺少的,在查看的每一本书中都会有购物车的影子,使用户随时都可以把想要购买的图书加入购物车。购物车如下图:在查看购物车中,“收银台结帐”与“继续购物”都只是普通的链接,退书按钮可以看成是对提交表单事件的触发。“修
23、改数量”比较特别他只是一个静态输出的字符,那么数量是如何修改的呢?让我们来看下面的代码: (trade.jsp)session.setAttribute(shoppingcart,buylist);/显示功能if(buylist!=null&buylist.size()0)for(j=0;j form name= method=post action=trade.jsp input type=hidden name= value=input name= type=text size=5 value= onBlur=javascript:submit()
24、 input type=hidden name=delj value= 总金额: 收银台结账 修改数量 =(stock-sale)session.setAttribute(error,图书已经购完);response.sendRedirect(./error/errorpage.jsp);elsematch3=true;rs.beforeFirst();if(rs.next()&match3=true)newbook.setQuantity(1);newbook.setPrice(Float.parseFloat(rs.getString(1);newbook.setName(rs.getSt
25、ring(2);newbook.setCountprice(newbook.getPrice()*newbook.getQuantity();buylist.addElement(newbook);trade.close();/更改图书列表elsefor(i=0;i=(stock-sale-book.getQuantity()session.setAttribute(error,图书数量不足);response.sendRedirect(./error/errorpage.jsp);elsenewbook.setQuantity(book.getQuantity()+1);buylist.se
26、tElementAt(newbook,i);match=true;trade.close();/新建立图书类型sqls=SELECT price,bookname,stock,sale FROM books WHERE idbook=+newbook.getId()+;Statement stmt=trade.getstmtread();ResultSet rs=stmt.executeQuery(sqls);/控制图书是否卖完if(rs.next()stock=rs.getInt(stock);sale=rs.getInt(sale);if(0=(stock-sale)session.set
27、Attribute(error,图书数量不足);response.sendRedirect(./error/errorpage.jsp);rs.beforeFirst();if(rs.next()newbook.setPrice(Float.parseFloat(rs.getString(1);newbook.setName(rs.getString(2);newbook.setCountprice(newbook.getPrice()*newbook.getQuantity();trade.close();/forif(!match)sqls=SELECT price,bookname,st
28、ock,sale FROM books WHERE idbook=+newbook.getId()+;Statement stmt=trade.getstmtread();ResultSet rs=stmt.executeQuery(sqls);/控制图书是否卖完boolean match2=false;if(rs.next()stock=rs.getInt(stock);sale=rs.getInt(sale);if(0=(stock-sale)session.setAttribute(error,图书已经购完);response.sendRedirect(./error/errorpage
29、.jsp);elsematch2=true;rs.beforeFirst();if(rs.next()&match2=true)newbook.setPrice(Float.parseFloat(rs.getString(1);newbook.setName(rs.getString(2);newbook.setQuantity(1);newbook.setCountprice(newbook.getPrice()*newbook.getQuantity();buylist.addElement(newbook);trade.close();/!match/buylist!=null通过源程序
30、可以看出在对图书的增加中有两种情况: 当新用户来是buylist为空,要新建一个buylist,然后查询数据库,如果库存能够满足用户的消费,则向buylist里面增加数据,否则向用户发出提示。 如果buylist不为空,说明用户之间已经买过书,就不需要新建buylist,之间向加入消费信息即可。如图书重复,只需修复buylist中的图书数量。下面来看购物车中对书籍的删除操作: (trade.jsp)if(action.equals(del)trydel=(String)request.getParameter(delj);d=(new Integer(del).intValue();buyli
31、st.removeElementAt(d);catch(Exception e)删除操作很简单,从buylist中删除此书籍的信息。这是由退书按钮触发的。更新操作其实是在购物车中对图书数量的修改,先获取图书的各种信息,再验证库存数据是否满足,不满足是给予用户提示,满足则更新buylist的信息: (trade.jsp)if(action.equals(update)boolean match1=false;for(k=0;kbuylist.size();k+)trybookadd=(String)request.getParameter(book+k);catch(Exception e)bookadd=;tryquantityadd=Integer.parseInt(String)request.getParameter(quantity+k);catch(Exception e)quantityadd=0;Ware book=(Ware)buylist.elementAt(k);if(bookadd!=&quantityadd!=0)/控制图书是否卖完sqls=SELECT price,bookname,stock,sale
限制150内