欢迎添加微信互相交流学习哦!
项目源码:https://gitee.com/oklongmm/biye
1引言
随着Internet国际互联网的发展,越来越多的企业开始建造自己的网站。基于Internet的信息服务,商务服务已经成为现代企业一项不可缺少的内容。很多企业都已不满足于建立一个简单的仅仅能够发布信息的静态网站。现代企业需要的是一个功能强大的,能提供完善的电子商务服务的动态商务网站。同时人们的生活方式也在随着发生改变,传统的购物方式已不能满足人们的需求。
JSP是Sun公司推出的一种网站开发技术,Sun公司借助自己在Java上的不凡造诣,又把人们引进JSP时代,JSP即Java Server Page,它可以在Servlet和JavaBean的支持下,完成功能强大的Web应用程序。所以,在我的毕业设计中,我采用了JSP作为开发工具,构建了一个能实现基本的电子商务的小型动态商务网站——网上图书销售系统。该系统能实现用户的注册、登录功能;能够实现商品的查询,订购等功能。该系统基本上具备一个网上商品销售系统应该具备的常用功能,该设计项目基本上体现了构建一个动态商务网站所需要的技术,可以说,目前的大型商务网站也就是我们这个小型网站在内容上的扩充和完善。
2 概述
随着时代的发展,信息技术、Internet/Intranet技术、数据库技术的不断发展完善,网络进程的加快,传统的购物方式也越来越不能满足人们快节奏的生活需求,使得企业的IT部门已经认识到Internet的优势,电子商务就是在这样一个背景下产生发展起来的。伴随着电子商务技术的不断成熟,电子商务的功能也越来越强大,注册用户可以在网上搜索购买到自己想要的各种商品,初步让人们体会到了足不出户,便可随意购物的快感。我的毕业设计也就正是一个电子商务系统的开发---网上图书销售系统。
3 系统分析
3.1 可行性分析
商业企业在运营过程中,经常会受到以下一些条件的限制:
产品的宣传受到限制,采购商或顾客只能通过上门咨询、电话沟通等方式进行各种信息的获取,受一定的时间与物理空间的局限并且成本较高。
庞大的商业经济周转。
复杂的产品周转渠道。从看样品、谈价格到支付货款等一系列的产品周转渠道过于复杂,企业与顾客之间缺乏全面的沟通与快捷运营的平台。
商业企业中根据季节的变化,热销商品在销售高峰到来时货源紧张,企业需要实时了解商品的销售情况,保证热销商品的要货满足率。
因此,企业需要重新认识市场、消费者以及自身市场定位,正确认识电子商务技术在企业中的重要地位,以少量的时间和资金建立企业信息门户网站并架设一定范围的商务网络,以此来制定长远发展战略,使企业与顾客间的经济活动变得更灵活、更主动。
本系统是一个中小型的电子商务系统----网上书店,可以为各类用户提供方便的在线买书环境,符合目前国内流行的电子商务模式。用户可以在系统中实现注册、浏览商品、搜索查询商品、下定单、处理定单等功能;管理员可以通过用户管理、定单管理、商品管理、评论管理等管理功能来对系统进行维护更新。
在技术上,目前市场上开发电子商务平台的技术很多,如ASP,PHP,PB,.NET等。我采用SUN公司的JSP技术,它是目前市场上最流行的技术之一,JSP具有一次编译,处处运行的优点[4]。
由分析可得,不论是商业还是技术上,网上图书销售系统的开发都是可行的。
3.2需求分析
通过对电子商务网站及网上书店的考察、分析以及实际的市场调查,要求本系统具有以下功能:
统一友好的操作界面,能保证系统的易用性。
规范、完善的基础信息设置。
图书分类详尽,可按不同类别查看商品信息。
按图书大类及图书名称进行模糊查询。
实现网上购书。
新书及特价图书展示。
4 概要设计
4.1 系统设计目标
对于典型的数据库管理系统,尤其是对像电子商务这样的数据流量特别大的网络管理系统,必须要满足使用方便、操作灵活等设计要求。本系统在设计时应该满足以下几个目标:
采用人机对话的操作方式,界面设计美观友好、信息查询灵活、方便、快捷、准确、数据存储安全可靠。
全面展示书店内所有的图书,并可展示最新图书及特价图书。
为顾客提供一个方便、快捷的图书信息查询功能。采用模糊查询查询数据。
实现网上购物。
商品销售排行,以方便顾客了解本商城内的热销商品及帮助企业领导者做出相应的决策。
查看商城内的公告信息。
用户随时都可以查看自己的订单。
对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
系统最大限度地实现了易维护性和易操作性。
系统运行稳定、安全可靠。
4.2 系统设计思想
本系统采用三层架构设计[4],它的工作原理如图4.1所示。
图4.1 三层结构原理图
采用三层构架以后,用户界面层通过统一的接口向业务层发送请求,业务层按自己的逻辑规则将请求处理之后进行数据库操作,然后将数据库返回的数据封装成类的形式返回给用户界面层。这样用户界面层甚至可以不知道数据库的结构,它只要维护与业务层之间的接口即可。
4.3 系统功能模块划分
根据需求分析及三层架构设计的思想,设计出客户系统功能如图4.2
图 4.2 客户端系统
后台管理的系统功能图如图4.3
图4.3 后台管理系统功能图
4.4系统结构设计
根据面向对象和三层结构设计的思想,可得出如图4.4所示的系统结构设计图。
图4.4 系统结构图
4.5系统功能简介
4.5.1系统基本功能
1)图书信息查询
该模块实现图书信息的分类显示,提供最新商品的推荐显示以及销售显示,便于引导购物取向。此外,还提供依据图书名称或是编号等包含关键字实现快速搜索的功能并显示图书的有关详细信息。
2)购物车管理
用于对每一个进入系统的用户所对应的购物车进行管理。将用户所选购的图书信息,包括价格、数量等信息记录到对应的购物车上,便于到收银台进行结帐处理。同时在此模块中,用户还可以方便的实现修改购物图书、清空购物车等操作。
3)会员信息管理
实现系统相关用户信息的注册及身份验证,同时也提供对应的用户资料的更新。该系统可以收集用户相关的联系方式、通讯地址等信息,可以更好的拓展销售规模。
4)订单处理
根据购物车中的信息,以及用户所选择的送货方式和付款方式,和用户对应的个人信息生成订单,便于后续工作的处理。在该模块中,用户可以随时查阅自己的订单,并对其进行取消等处理操作。
4.6 数据库设计
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率,以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致[10]。
4.6.1 数据库需求分析
针对网上图书销售系统的需求分析,得出如下需求信息。
订单分为单张详细订单和总订单。
一个用户可以购买多本图书。
一个用户对应一张订单。
一个列表对应多张订单。
针对本系统功能分析,总结出如下的需求信息。
用户,包括数据项:用户ID、用户名、密码。
图书,包括数据项:图书编号、图书名、价格、图书介绍。
订单列表,包括数据项:订单编号、图书编号、购书数量。
订单,包括数据项:订单编号、用户编号、下单时间。
4.6.2 数据库概念结构设计
从本系统中规划出的实体有:用户信息实体、管理员信息实体、图书实体、图书分类实体、订单实体、订单列表实体。
实体之间关系的E-R图如图4.5所示。
图4.5 实体之间的E-R图
管理员实体的E-R图,如图4.6所示。
图书分类实体的E-R图,如图4.7所示。
用户信息实体的E-R图,如图4.8所示。
图书实体的E-R图,如图4.9所示。
订单实体的E-R图,如图4.10所示。
订单列表实体的E-R图,如图4.11所示。
图4.6 管理员实体的E-R图 图4.7 图书分类实体E-R图
图 4.8 用户实体E-R图
图4.9 图书实体E-R图
图4.10 订单实体E-R图
图 4.11订单列表实体的E-R图
4.7 数据库逻辑结构设计
本系统数据库采用SQL Server 2000数据库,系统数据库名称为bookshop,下面分别给出数据表概要说明、数据表关系概要说明及主要数据表的结构。
1、 数据表概要说明
数据表树型结构图如图4.12所示,该数据表树型结构图包含系统所有的数据表
图4.12 数据表树型结构图
2、各个表的的结构如下表
表4.1为图书信息列表,记录书店现有的图书信息。
表4.1 Book表
列名 数据类型 长度 允许空 注释
ID Int 4 图书编号
BookName varchar 40 否 图书名称
BookClass Int 4 否 图书分类
Author Varchar 25 是 作者
Publish Varchar 150 是 出版社
BookNo Varchar 30 是 书号
Content text 300 是 内容
Price float 8 是 价格
Amount int 4 是 总数量
Leav_number int 4 是 剩余数量
RegTime datatime 8 是 注册时间
Picture varchar 60 是 封面
表4.2为书店管理员信息表,记录管理员的帐号和密码。
表4.2 BookAdmin表
列名 数据类型 长度 允许空 注释
Adminuser Varchar 20 否 管理员
AdminPass Varchar 20 否 管理员密码
表4.3为用户信息表,记录用户的基本信息。
表4.3 用户表
列名 数据类型 长度 允许空 注释
ID Int 2 否 用户编号
UserName Varchar 50 否 用户名
passWord Varchar 50 否 密码
Names Varchar 50 否 真名
Sex Varchar 50 是 性别
Address Varchar 50 是 地址
Phone Varchar 50 是 电话
Post Varchar 50 是 邮编
Email Varchar 50 是 电子邮件
RegTime Datatime 50 是 注册时间
RegIPAddress varchar 50 是 注册IP地址
表4.4为订单总表,记录某个用户的订单总信息。
表4.4 订单总表
列名 数据类型 长度 允许空 注释
ID Int 4 否 总订单编号
OrderID Int 4 否 订单号
BookNo Int 4 否 书号
Amount int 4 是 数量
表4.5为订单表,记录但张订单的具体信息。
表4.5 订单表
列名 数据类型 长度 允许空 注释
ID Int 4 否 订单ID
OrderID Varchar 50 否 总订单ID
UserId Varchar 50 否 用户ID
SubmitTime Datatime 8 是 提交时间
ConsignmentTime Datatime 8 是 购买时间
TotalPrice Float 16 是 总价格
content Text 300 是 描述
Ipaddress Varchar 50 是 Ip 地址
Ispayoff Varchar 50 是 是否付款
IsAddress varchar 20 是 是否发货
表4.6为图书分类表,记录书店现有图书的分类。
表4.6 Bookclass表
列名
数据类型 长度 允许空 注释
ID Varchar 30 否 分类编号
ClassName varchar 30 否 分类名
5 详细设计
5.1 开发技术简介
5.1.1 JSP简介
JSP(Java Server Pages)是由Sun Microsystems 公司倡导、许多公司参与一起建立的一种动态网页技术标准,JSP技术在Servlet技术基础上发展起来的,它正在飞速发展中,现已成为Java服务器编程的重要组成部分。它虽然还未成型,但是它必将和J2EE(Java 2 Enterprise Edition)一起发展[6]。
JSP是结合markup(HTML和XML)和Java代码来处理一种动态页面。每一页第一次被调用时,通过JSP引擎自动被编译成Servlet,然后被执行,以后每次调用时,执行编译过的Servlet。JSP提供了多种方式访问Java class、Servlet、Applets和Web Server,因此,Web应用的功能可以分成多个明确定义公用接口的组件,通过JSP将它们结合在一起[9]。
5.1.2 JSP的运行原理
在JSP第一次获得来自于客户端浏览器的请求时,JSP文件将被JSP引擎(JSP engine)转换成一个Servlet,即将”.jsp”文件编译成Java Class文件。当Servlet引擎接收到请求后,如果设置了使用最新的JSP,它就会去找JSP文件,检查该文件在上次编译后是否改动过。如果改动过,就会重新编译生成新的Servlet,最终将请求转交给编译好的Servlet引擎执行[1]。如图5.1
图5.1 JSP运行原理图
在编译时如果发现JSP文件有任何语法错误,转换过程将中断,并向客户端发出出错信息;如果编译成功,则所转换产生的Servlet代码被编译,然后该Servlet被JSP引擎加载到内存中。此时JSP引擎还请求了jspInit()方法的执行,并对此Servlet初始化。JspInit()方法在Servlet的生命周期中只被请求一次,然后将被调用来处理客户端的请求和回复操作。对于所有随后对该JSP文件的请求,服务器将检查该JSP文件自最后一次被存取后是否经过修改。如果没有修改,则将请求交还给还在内存中的Servlet的jspService()方法,执行回复操作。由于Servlet始终驻于内存,所以响应是非常快的。Jsp页面在第一次访问时由于要转化和编译,运行速度较慢,但是当第二次访问该页时,由于文件已经被编译成字节码文件了,所以速度非常得快。
5.1.3 JSP页面的组成
JSP页面看上去像标准的HTML和XML页面,并附带有JSP引擎能够处理和解析执行的代码与组件。通常,JSP代码和组件用于创建在最终页面上显示的文本。通常来说,JSP页面包括模板元素,指令元素,动作元素,Scritptlets,声明,表达式和JSP内建对象。
1)模板元素:模板元素是指JSP的静态HTML或者XML[4] 。
2)指令元素:使用指令元素来设置全局变量,声明类、要实现的方法和输出内容的内型,它们并不向客户端产生任何输出,所有指令在文件范围内有效,JSP指令的一般语法形式为:<%@directivename attribute=”value”,attribute=”value”%>。
3)动作元素(标识):动作元素用于执行某些动作。在JSP规范中有2种类型的动作指令的标识。第一种是标准动作,它定义的是无论在什么版本的JSP引擎或Web服务器下总是可用的动作。第二种是自定义动作,它通过使用taglib指令来实现。例如JSP:useBean;JSP:setProperty;JSP:getProperty就是标准动作。
4)声明:用于声明合法的变量和方法。与任何语言相同,JSP语言使用变量来保存数据。这些变量用declaration元素声明,声明的语法为<%! declaration(s) %>。当页面被初始化的时候,JSP页面中的所有声明都被初始化。除了简单的变量,方法也能被声明。声明不对当前的输出流产生任何影响。
5)表达式:通过计算表达式所得到的结果来表示某个值。表达式的形式为:<%=expression%>。表达式求值的结果被强制转换为一个字符串,并插入到当前的输出流中。
6)程序段:JSP可以在页面中包含的一段程序,称之为程序段。程序段是一个代码片断,在请求的处理过程中被执行。程序段可以和页面中的静态元件组合起来创建动态生成的页面。程序段在“<% %>”中定义,在这对标识中的所有东西都会被当成JSP程序执行。
5.1.4 JavaBean技术介绍
JavaBean技术是一种基于Java的组件技术,JavaBean组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据的提取,以及封装事务逻辑等,可以很好的实现业务逻辑和前台程序的分离使得系统具有更好的健壮性和灵活性,同时也是解决代码重用问题的一种策略。
以前的组件无法实现真正的代码重用,其主要原因就是它们对于处理平台的依赖和对开发语言的依赖过重。由于Java语言在这些方面所具有的特点和优势,使得基于它的软件JavaBean组件技术倍受人们的关注。它的任务就是:一次编写,可以在任何地方执行,
可以在任何地方重用。JavaBean组件可以在任何地方冲用包括了可以在应用程序、其他组件、文档、Web站点和应用程序构造器工具等多种方案中再利用。
为了创建和使用Java软件组件,JavaBean被实现为一种独立于平台和结构的应用程序接口,它的实现可以忽略内部的结构及细节问题,只需要定义其外部的特征及对外功能就行。其中,属性、方法和事件三种接口可以独立对外进行开发。
JavaBean的实质就是一个.class文件,也可以成为类文件。JavaBean以binary格式保存,可以保护Java源代码不容易被他人抄袭[7]。
5.1.5 JSP 的运行环境
要运行Jsp(注意,不是浏览Jsp页面),需要有支持Jsp的服务器。这里分2种情况:一种是自身就支持Jsp的服务器,如Jrun,Weblogic,JSWDK等;而另一种则是在不支持Jsp的服务器上安装Jsp引擎的插件,如在IIS,Apache等服务器上安装WebSphere,tomcat,Resin等插件。其中主流服务器是Weblogic和tomcat.
Weblogic是一款功能强大的服务器软件,配置比较简单,而且Jsp的扩展功能较多,附带了数据库的JDBC驱动程序。,支持JHTML(一种与Jsp十分相似的技术),是目前市场占有率最高的服务器。不过,Weblogic的运行情况不太稳定,使用它调试Jsp文件,出现语法错误或者数据库连接错误时,Weblogic就有可能崩溃。
Tomcat服务器是Apache Group Jakarta小组开发的一个免费服务器软件,适合于嵌入Apache中使用,而且,它的源代码可以免费获得,你可以*地对它进行扩充。访问的地址 http://jakarta. apache.org/tomacat/index.html, Tomcat服务器的兼容性很好,如WebLogic服务器采用其为Web服务器引擎,Jbuilder将其作为标准的测试服务器,Sun公司也将其作为JSP技术应用的示例服务器。不足之处是它的配置比较麻烦,对系统硬件要求较高,而且有一些安全性的问题没有解决。但是Tomcat服务器有众多大软件公司的支持,而且服务器的性能稳定,其发展前景很好[9]。
5.2 系统主要文件
该购书系统主要有2类文件,一类是Bean文件,我把它们统一放在了bookshop文件夹里,保存在jakarta-tomcat-5.0.27\common\classes\bookshop下,(这是tomcat要求的默认存放Bean的路径),在bookshop文件夹下又有3个包:book,run,util,对Bean文件的一个分类;另一类是jsp文件,保存在jakarta-tomcat-5.0.27\webapps\ROOT。(这是tomcat的默认工作环境)
Book包中的Bean文件:Allorder.java,Book.java,Bookclass.java,Order.java,Shopcar.java,User.java
Util包中的Bean文件:ChStr.java,DataBase.java,DataFormat.java
Run包中的Bean文件Login.java,
Op_book.java,Op_bookclass.java,Op_buy.java,Op_user.java
Jsp文件分为前台文件和后台文件,因文件太多,在此就不列举。
5.3 详细设计及说明
5.3.1 数据库连接Bean的编写[2]
数据库操作的JavaBean是一个公共类,放在bookshop下的util包中,通常包括连接数据库的方法getConnection、执行查询语句的方法executeQuery、执行更新操作的方法executeUpdate、关闭数据库连接的方法close。其实现代码如下:
package bookshop.util; //将该类保存到package bookshop.util 包中
/**
* <p>数据库连接专用包 </p>
* <p>Copyright: wxy Copyright (c) 2007</p>
* <p>Company:Ling Du book shop online </p>
*/
import java.sql.*; //导入提供基本的数据库编程服务的包
public class DataBase {
public Connection conn; //定义一个Connection对象
public Statement stmt; //定义一个Statement对象
public ResultSet rs=null; //定义一个ResultSet对象
public String sqlStr=""; //定义一个字符串,用来保存SQL语句
public DataBase() {
this.connect();
}
public boolean connect(){
//download by http://www.codefans.net/ try{Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
//加载SQL Server 2000数据库驱动
String url ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bookshop";
//保存连接数据库的URL地址的变量
conn=DriverManager.getConnection(url,”sa”,””);//建立数据库连接
Statement stmt= conn.createStatement ();
}catch(Exception ee){
System.out.println("connect db error:"+ee.getMessage());
//检测数据库连接是否成功
return false;
}
return true;
}
public static void main(String[] args) {
try{
DataBase db = new DataBase();
db.connect();
}catch(Exception e){
e.printStackTrace();
}
}
}
5.3.2字符处理Bean的编写
在JSP开发中经常会涉及有关字符串的处理,例如:把字符串转换成适合于网页显示的文本、八字符串转换成适合SQL语句的字符串等等,所以把这些字符串处理方法集中到一个类中。这也是一个公共类[3]。
关键代码如下:
package bookshop.util;
/**
* <p>负责字符串的处理 </p>
*/
import java.lang.*;
import java.util.*;
public class dataFormat {
public dataFormat() { }
/**
* 把字符串转换成适合于网页显示的文本
* @param s
* @return
*/
public static String toHtml(String s) {
if (s==null) return s;
s=strReplace(s,"&","&");
s=strReplace(s,"<","<");
s=strReplace(s,">",">");
s=strReplace(s,"\"",""");
s=parseReturn(s,"<br>\n ");
return s;
}
/**
* 把字符串sBody中的sFrom用sTo替换
* @param sBody
* @param sFrom
* @param sTo
* @return
*/
public static String strReplace(String sBody, String sFrom, String sTo) {
int i,j,k,l;
if (sBody==null || sBody.equals("")) return "";
i = 0;
j = sFrom.length();
k = sTo.length();
StringBuffer sss = new StringBuffer(sBody.length());
boolean bFirst=true;
l = i;
while (sBody.indexOf(sFrom,i)!=-1) {
i = sBody.indexOf(sFrom,i);
sss.append(sBody.substring(l,i));
sss.append(sTo);
i += j;
l = i;
}
sss.append(sBody.substring(l));
return sss.toString();
}
/**
* 把字符串中的"\r\n"转换成"\n"
* @param String sBody : 要进行替换操作的字符串
* @param String sEndwith : 要替换成为的字符串
*/
public static String parseReturn(String sBody, String sEndwith) {
StringTokenizer t = new StringTokenizer(sBody, "\r\n");
StringBuffer sss = new StringBuffer(sBody.length());
boolean bFirst=true;
if (sEndwith.trim().equals("")) sEndwith="\n";
while (t.hasMoreTokens()) {
String s=t.nextToken();
s=s.trim();
while (s.startsWith(" ")) s=s.substring(2);
if (!s.equals("")) {
if (bFirst) {
bFirst=false;
} else {
sss.append(sEndwith);
}
sss.append(s);
}
}
return sss.toString();
}
/**
* 将字符串格式化成 HTML 代码输出
* 只转换特殊字符,适合于 HTML 中的表单区域
* @param str 要格式化的字符串
* @return 格式化后的字符串
*/
public static String toHtmlInput(String str) {
if (str == null) return null;
String html = new String(str);
html = strReplace(html, "&", "&");
html = strReplace(html, "<", "<");
html = strReplace(html, ">", ">");
return html;
}
/**
* 将普通字符串格式化成数据库认可的字符串格式
*
* @param str 要格式化的字符串
* @return 合法的数据库字符串
*/
public static String toSql(String str) {
String sql = new String(str);
return strReplace(sql, "'", "''");
}
}
5.3.3实现用户实体的Bean
1)用户实体Bean,这个类是对用户实体的抽象,它包含了用户实体的所有属性及用户对象初始化构造方法。它们都是和数据库里的shop_user表相对应的,在这个Bean里封装的方法也主要是对这个表进行操作.这些属性都被定义为类的私有成员,外界不可访问[8]
private Long id;
private String userName;
private String userPassword;
private String Names;
private String Sex;
private String Address;
private String Phone;
private String Post;
private String Email;
private String RegTime;
private String RegIpAddress;
2)构造函数里对以上私有成员进行初始化:
Public user()
{
Id=0;
UserName=””;
Password=””;
Names=””;
Sex=””;
Address=””;
Phone=””;
Post=””;
Email=””;
RegTime=””;
RegIpAddress=””;
}
……..
其中的seter和geter方法用来设置和获取以上各属性的值。在jsp页面中通过 <jsp:useBean>引入。
5.3.4实现图书实体的Bean
应用面向对象的思想把具有共性的实体抽象成一个类。这个图书Bean就是对图书实体的抽象,他包含了图书实体的所有属性及图书对象的初始化构造方法,里面的属性和表Book表对应[8]。部分代码如下:
package bookshop.book;
/**
* <p>图书类 </p>
*/
public class book {
private long Id; //ID序列号
private String BookName; //书名
private int BookClass; //图书类别
private String classname ; //图书类别名
private String Author; //作者
private String Publish; //出版社
private String BookNo ; //书号
private String Content ; //内容介绍
private float Prince ; //书价
private int Amount ; //总数量
private int Leav_number ; //剩余数量
private String RegTime ; //登记时间
private String picture ; //图书样图文件的名称
/**
* 图书的初始化
*/
public book() {
Id = 0;
BookName = "";
BookClass = 0;
classname = "";
Author = "";
Publish = "";
BookNo = "";
Content = "";
Prince = 0;
Amount = 0;
Leav_number = 0;
RegTime = "";
}
public void setId(long newId){
this.Id = newId;
}
public long getId(){
}
……
其中的seter和geter方法用来设置和获取以上各属性的值。在jsp页面中通过 <jsp:useBean>引入。
5.3.5 实现图书分类实体Bean
这个类是对图书分类实体的抽象,他包含了图书分类实体的所有属性及图书分类对象的初始化构造方法,它的属性和表Bookclass对应,部分代码如下:
package bookshop.book;
/**
* <p>图书分类类</p>
*/
public class bookclass {
private int Id; //ID序列号
private String ClassName; //图书类别
public bookclass() {
Id = 0;
ClassName = "";
}
public bookclass(int newId, String newname) {
Id = newId;
ClassName = newname;
}
……
5.3.6实现订单实体Bean
这个类是对订单实体的抽象,它包含了订单实体的所有属性及订单对象的初始化构造方法。客户每次购买一种商品都会产生一次订购单,它包括订单号,所购买的书号,所购买这种书的数量等,这些构成了这个类的私有属性,这些属性和表Order对应。核心代码如下:
package bookshop.book;
/**
* <p>订单类 </p>
*/
public class order {
private long Id; //ID序列号
private String orderId; //订单编号
private long UserId; //用户序列号
private String SubmitTime; //提交订单时间
private String ConsignmentTime; //交货时间
private float TotalPrice; //总金额
private String content; //用户备注
private String IPAddress; //下单时IP
private boolean IsPayoff; //用户是否已付款
private boolean IsSales; //是否已发货
public order() { //在构造方法里初始化变量
Id = 0;
orderId = "";
UserId = 0;
SubmitTime = "";
ConsignmentTime = "";
TotalPrice = 0;
content = "";
IPAddress = "";
IsPayoff = false;
IsSales = false;
}
public long getId() {
return Id;
}
……
其中的seter和geter方法用来设置和获取以上各属性的值。在jsp页面中通过 <jsp:useBean>引入。
5.3.7 实现订单列表的Bean
这个类是对订单列表实体的抽象,它包含了订单实体的所有属性及订单列表对象的初始化构造方法,它的属性和表Allorders对应,部分代码如下:
package bookshop.book;
/**
* <p>Title: </p>
*/
public class allorder {
private long Id; //ID序列号
private long orderId; //订单号表序列号
private long BookNo; //图书表序列号
private int Amount; //订货数量
public allorder() {
Id = 0;
orderId = 0;
BookNo = 0;
Amount = 0;
}
public long getId() {
return Id;
}
………
其中的seter和geter方法用来设置和获取以上各属性的值。在jsp页面中通过 <jsp:useBean>引入。
5.3.8 实现购物车实体的Bean
在现实生活中,人们去超市买东西,都是把商品放在一个购物篮里,等到把所有要买的东西选购完毕后,一起拿到收银台前付钱。我在程序里定义的购物车实体就是模拟这个功能.作为购物车,购物时间,所购书的总价格都是必不可少的,这个类是对购物车实体的抽象,它包含了购物车的所有属性及购物车对象的初始化构造方法。部分代码如下:
package bookshop.book;
/**
* <p>Title: </p>
*/
public class shopcar {
private long bookId; //图书ID编号
private int quanlity; //选购数量
public shopcar(){
bookId = 0;
quanlity = 0;
}
public long getBookId() {
return bookId;
}
5.3.9 管理用户登录Bean的编写
这是一个以客户为中心的交易平台,只有成为了系统的合法用户才有使用本系统的权利,因此需要检测每个用户的合法性,管理用户登录这个Bean:Login.java就是要完成这一功能。图5.2为Login类的类图其中只是关键的几个方法。
图5.2
从图4-1中可以看出Login具有的属性和方法,其中login() :void构造函数,getismin为取得属性isadmin的值的方法,即判断登陆用户是否是管理员。其它的是设置和获取属性的方法。其中有两个重要的方法介绍如下:
1) getSql()方法
根据用户的不同获得不同的查询SQL语句。判断登陆用户是否是管理员,如果是则从管理员信息表中查询数据,否则则从普通用户表中查询数据。实现代码如下:
/**
* 获得查询用户信息的sql语句
* @return
*/
public String getSql() {
if (isadmin) {
sqlStr = "select * from BookAdmin where adminuser = '" +
dataFormat.toSql(username) + "' and adminpass = '" +
dataFormat.toSql(passwd) + "'";
}else {
sqlStr = "select * from shop_user where username = '" +
username + "' and password = '" + passwd + "'";
}
return sqlStr;
}
2)Execute()方法
/**
* 执行查询
* @return
* @throws java.lang.Exception
*/
public boolean excute() throws Exception
{
boolean flag = false;
DataBase db = new DataBase();
db.connect(); //获取一个数据库连接
Statement stmt = db.conn.createStatement ();
rs = stmt.executeQuery(getSql()); //rs 里返回查询结果集
if (rs.next()){
if (!isadmin)
{
userid = rs.getLong("id");
}
flag = true;
}
rs.close();
return flag;
}
从以上代码中可以看出,构造数据库连接DataBase类的对象,调用其connect()方法获得连接,调用getsql()方法获得SQL语句,然后从数据库中查得用户所需信息。
5.3.10管理图书Bean的编写
该类负责图书的管理,包括图书的修改、查询、删除、和添加等,图5.3为该类的类图[5],其中省去了部分方法,这里只介绍几个重要的方法。
图5.3管理图书op_book类的类图
1)getRequest()方法
该方法负责从页面接收到的表单资料分解,并设置图书实体的相应属性,它的返回值为Boolean类型,true表示成功,反之表示失败。部分代码如下:
public boolean getRequest(javax.servlet.http.HttpServletRequest newrequest) {
boolean flag = false;
try{
request = newrequest;
String ID = request.getParameter("id");
long bookid = 0;
try{
bookid = Long.parseLong(ID);
}catch (Exception e){
}
abooks.setId(bookid);
String bookname = request.getParameter("bookname");
if (bookname==null || bookname.equals(""))
{
bookname = "";
sqlflag = false;
}
abooks.setBookName(to_String(bookname));
String author = request.getParameter("author");
if (author==null || author.equals(""))
{
author = "";
sqlflag = false;
}
abooks.setAuthor(to_String(author));
String publish = request.getParameter("publish");;
if (publish==null)
{
publish = "";
}
abooks.setPublish(to_String(publish));
String bookclass = request.getParameter("bookclass");
int bc = Integer.parseInt(bookclass);
abooks.setBookClass(bc);
String bookno = request.getParameter("bookno");
if (bookno == null)
{
bookno = "";
}
abooks.setBookNo(to_String(bookno));
String picture = request.getParameter("picture");
if (picture == null)
{
picture = "images/01.gif";
}
abooks.setPicture(to_String(picture));
float price;
try {
price =new Float(request.getParameter("price")).floatValue();
} catch (Exception e){
price = 0;
sqlflag = false;
}
abooks.setPrince(price);
int amount;
try{
amount = new Integer(request.getParameter("amount")).intValue();
}catch (Exception e){
sqlflag = false;
amount = 0;
}
abooks.setAmount(amount);
String content = request.getParameter("content");
if (content == null)
{
content = "";
}
abooks.setContent(to_String(content));
if (sqlflag)
{
flag = true;
}
return flag;
}catch (Exception e){
return flag;
}
}
2)book_search()方法
该方法负责图书查询,包括图书的分类,分页、关键字查询。首先通过getRequest()方法获得页面表单参数值,根据参数值判断是何种查询,然后根据相应的SQL的语句从数据库里查询相应的值。这里需要用到分页技术。
部分代码如下:
/**
* 完成图书查询,包括分类,分页查询
* @param res
* @return
* @throws java.lang.Exception
*/
public boolean book_search(HttpServletRequest res) throws Exception {
DataBase db = new DataBase();
db.connect();
Statement stmt = db.conn.createStatement ();
request = res;
String PAGE = request.getParameter("page"); //页码
String classid = request.getParameter("classid"); //分类ID号
String keyword = request.getParameter("keyword"); //查询关键词
if (classid==null) classid="";
if (keyword==null) keyword = "";
keyword = to_String(keyword).toUpperCase();
try {
page = Integer.parseInt(PAGE);
}catch (NumberFormatException e){
page = 1;
}
//取出记录数
if (!classid.equals("") && keyword.equals("") ) {
sqlStr = "select count(*) from book where bookclass='"+classid + "'";
}
else if (!keyword.equals("")) {
if (classid.equals("")){
sqlStr = "select count(*) from book where upper(bookname) like '%" +
keyword+ "%' or upper(content) like '%" + keyword + "%'";
} else {
sqlStr = "select count(*) from book where bookclass='" + classid
+ "' and (upper(bookname) like '%" +keyword+ "%' or "+
"upper(content) like '%" + keyword + "%')";
}
} else {
sqlStr = "select count(*) from book";
}
int rscount = pageSize;
try {
ResultSet rs1 = stmt.executeQuery(sqlStr);
if (rs1.next()) recordCount = rs1.getInt(1);
rs1.close();
}catch (SQLException e){
System.out.println(e.getMessage());
return false;
}
//设定有多少pageCount
if (recordCount < 1)
pageCount = 0;
else
pageCount = (int)(recordCount - 1) / pageSize + 1;
//检查查看的页面数是否在范围内
if (page < 1)
page = 1;
else if (page > pageCount)
page = pageCount;
rscount = (int) recordCount % pageSize; // 最后一页记录数
//sql为倒序取值
sqlStr = "select a.id,a.bookname,a.bookclass,b.classname,"+
"a.author,a.publish,a.bookno,a.content,a.prince,a.amount,"+
"a.Leav_number,a.regtime,a.picture from book a,bookclass b"+
" where a.Bookclass = b.Id ";
if (!classid.equals("") && keyword.equals("") ){ //如果类别不为空,非查询
if (page == 1)
{
sqlStr = sqlStr + " and a.bookclass='" + classid + "' "+
"order by a.Id desc";
} else {
sqlStr = sqlStr + " and a.bookclass='" + classid + "limit "+
(recordCount-pageSize * page)+","+(recordCount-pageSize * (page-1));
}
} else if (!keyword.equals("")) { //如果是查询资料
if (page == 1){
if (!classid.equals("")) {//查询某一类
sqlStr = sqlStr + "and a.Bookclass='" +
classid + "' and (upper(a.bookname) like '%" +
keyword+ "%' or upper(a.content) like '%" +
keyword + "%') order by a.Id desc";
} else { //查询所有类
sqlStr = sqlStr + " and (upper(a.bookname) like '%" +
keyword+ "%' or upper(a.content) like '%" +
keyword + "%') order by a.Id desc";
}
} else {
if (!classid.equals("")){
sqlStr = sqlStr + " and a.Bookclass='" +
classid + "' and (upper(a.bookname) like '%" +
keyword+ "%' or upper(a.content) like '%" +
keyword + "%') limit "+(recordCount-pageSize * page)+","+
(recordCount-pageSize * (page-1));
} else {
sqlStr = sqlStr + " and (upper(a.bookname) like '%" +
keyword+ "%' or upper(a.content) like '%" +
keyword + "%') limit "+(recordCount-pageSize * page)+","+
(recordCount-pageSize * (page-1));
}
}
} else {//非查询,也非分类浏览
if (page == 1){
sqlStr = sqlStr + " order by a.Id desc limit 0,"+pageSize;
} else {
sqlStr = sqlStr + "limit "+(recordCount-pageSize * page)+","+
(recordCount-pageSize * (page-1));
}
}
try {
rs = stmt.executeQuery(sqlStr);
booklist = new Vector(rscount);
while (rs.next()){
book book = new book();
book.setId(rs.getLong("id"));
book.setBookName(rs.getString("bookname"));
book.setBookClass(rs.getInt("bookclass"));
book.setClassname(rs.getString("classname"));
book.setAuthor(rs.getString("author"));
book.setPublish(rs.getString("publish"));
book.setBookNo(rs.getString("Bookno"));
book.setContent(rs.getString("content"));
book.setPrince(rs.getFloat("prince"));
book.setAmount(rs.getInt("amount"));
book.setLeav_number(rs.getInt("leav_number"));
book.setRegTime(rs.getString("regtime"));
book.setPicture(rs.getString("picture"));
booklist.addElement(book);
}
rs.close();
return true;
}catch (Exception e){
System.out.println(e.getMessage());
return false;
}
}
3)insert()方法
该方法负责图书的添加,返回类型为Boolean型,true表示成功,反之失败。首先从图书对象中获得属性,组装相应的SQL语句并执行,返回执行结果。代码如下:
/**
* 完成图书添加
* @return
* @throws java.lang.Exception
*/
public boolean insert() throws Exception {
sqlStr = "insert into book (Bookname,Bookclass,Author,Publish,Bookno,"+
"Content,Prince,Amount,Leav_number,Regtime,picture) values ('";
sqlStr = sqlStr + dataFormat.toSql(abooks.getBookName()) + "','";
sqlStr = sqlStr + abooks.getBookClass() + "','";
sqlStr = sqlStr + dataFormat.toSql(abooks.getAuthor()) + "','";
sqlStr = sqlStr + dataFormat.toSql(abooks.getPublish()) + "','";
sqlStr = sqlStr + dataFormat.toSql(abooks.getBookNo()) + "','";
sqlStr = sqlStr + dataFormat.toSql(abooks.getContent()) + "','";
sqlStr = sqlStr + abooks.getPrince() + "','";
sqlStr = sqlStr + abooks.getAmount() + "','";
sqlStr = sqlStr + abooks.getAmount() + "',";
sqlStr = sqlStr + "now()"+ ",'";
sqlStr = sqlStr + abooks.getPicture()+"')";
try{
System.out.print(sqlStr);
DataBase db = new DataBase();
db.connect();
stmt =db.conn.createStatement ();
stmt.execute(sqlStr);
return true;
}catch (SQLException sqle){
System.out.print(sqle.getMessage());
return false;
}
}
图书的修改和删除方法和上面类似,省略讲解。
5.3.11管理图书分类Bean
由于图书分类实体的存在,需要对图书进行分类查询、添加、删除等操作方法,为了方便,把这些方法集合到一个类中,即Op_bookclass类,图5.4为该类的类图,其中也省略了部分方法。该类的方法和管理图书Bean中的方法类似,所以在次就不多讲。
图5.4管理图书分类的Op_bookclass类图
5.3.12管理用户的Bean
为了使用上的方便,我把对用户的管理,包括用户的添加、删除、修改、查询等集合成一个管理类,即Op_user类。图5.5为该类的类图,其中只是关键的几个方法。
图5.5管理用户op_user类的类图
有类图可以看出该类具有以下属性:
private user user = new user(); //新的用户对象
private javax.servlet.http.HttpServletRequest request; //建立页面请求
private Vector userlist; //显示用户列表向量数组
private int page = 1; //显示的页码
private int pageSize=8; //每页显示的图书数
private int pageCount =0; //页面总数
private long recordCount =0; //查询的记录总数
private String message = ""; //出错信息提示
private String username = ""; //注册后返回的用户名
private long userid = 0; //注册后返回的用户ID
5.3.13管理订单的Bean
当用户选择图书后单击[购买]按钮时,选定的图书就被放入购物车中,这是系统并没有把数据提交到数据库,而是保存在Session中,只有用户进入购物车页面单击[提交购物车]按钮时才把数据作为订单提交到数据库中。
我把实现上述逻辑及对订单和订单列表的管理放在一个类中,即:OP_buy。图5.6为该类的类图。
图5.6管理订单op_buy类的类图
上图中Addnew()方法是向购物车中添加一条新的购买纪录,首先从页面获得请求对象,从中获取图书编号等参数,判断购买数量是否大于库存量,如果是,则设置标志isEmpty为false,本次购买将不成功。如果不是,则判断用户是不是第一次购买,如果是第一次购买,则直接在列表中添加一条新记录,如果不是第一次购书,则判断用户先前是不是购买过该书,如果是 则把购买数量增加,否则添加新记录。实现代码如下:
public boolean addnew(HttpServletRequest newrequest) {
request = newrequest;
String ID = request.getParameter("bookid");
String Amount = request.getParameter("amount");
long bookid = 0;
int amount = 0;
try {
bookid = Long.parseLong(ID);
amount = Integer.parseInt(Amount);
}
catch (Exception e) {
return false;
}
if (amount < 1)
return false;
session = request.getSession(false);
if (session == null) {
return false;
}
purchaselist = (Vector) session.getAttribute("shopcar");
sqlStr = "select leav_number from book where id=" + bookid;
try {
DataBase db = new DataBase();
Connection conn=db.connect();
stmt = conn.createStatement ();
rs = stmt.executeQuery(sqlStr);
if (rs.next()) {
if (amount > rs.getInt(1)) {
leaveBook = rs.getInt(1);
isEmpty = true;
return false;
}
}
rs.close();
}
catch (SQLException e) {
return false;
}
allorder iList = new allorder();
iList.setBookNo(bookid);
iList.setAmount(amount);
boolean match = false; //是否购买过该图书
if (purchaselist == null) { //第一次购买
purchaselist = new Vector();
purchaselist.addElement(iList);
}
else { // 不是第一次购买
for (int i = 0; i < purchaselist.size(); i++) {
allorder itList = (allorder) purchaselist.elementAt(i);
if (iList.getBookNo() == itList.getBookNo()) {
itList.setAmount(itList.getAmount() + iList.getAmount());
purchaselist.setElementAt(itList, i);
match = true;
break;
} //if name matches结束
} // for循环结束
if (!match)
purchaselist.addElement(iList);
}
session.setAttribute("shopcar", purchaselist);
return true;
}
/**
* 修改已经放进购物车的数据
* @param newrequest
* @return
*/
public boolean modiShoper(HttpServletRequest newrequest) {
request = newrequest;
String ID = request.getParameter("bookid");
String Amount = request.getParameter("amount");
long bookid = 0;
int amount = 0;
try {
bookid = Long.parseLong(ID);
amount = Integer.parseInt(Amount);
}
catch (Exception e) {
return false;
}
if (amount < 1)
return false;
session = request.getSession(false);
if (session == null) {
return false;
}
purchaselist = (Vector) session.getAttribute("shopcar");
if (purchaselist == null) {
return false;
}
sqlStr = "select leav_number from book where id=" + bookid;
try {
DataBase db = new DataBase();
Connection conn=db.connect();
stmt = conn.createStatement ();
rs = stmt.executeQuery(sqlStr);
if (rs.next()) {
if (amount > rs.getInt(1)) {
leaveBook = rs.getInt(1);
isEmpty = true;
return false;
}
}
rs.close();
}
catch (SQLException e) {
return false;
}
for (int i = 0; i < purchaselist.size(); i++) {
allorder itList = (allorder) purchaselist.elementAt(i);
if (bookid == itList.getBookNo()) {
itList.setAmount(amount);
purchaselist.setElementAt(itList, i);
break;
} //if name matches结束
} // for循环结束
return true;
}
5.4客户界面设计
5.4.1界面头、界面尾设计
为了提高代码的重用性,我把客户界面部分相同的头和尾做成两个模块,分别命名为 head.inc 和tail.inc,这两个文件都是纯 HTML代码,在头和尾引入下面的两句代码方可;
<%@include file=”/bookshop/inc/head.inc”%>
<%@include file=”/bookshop/inc/tail.inc”%>
5.4.2用户登陆模块设计
//download by http://www.codefans.net/
为了检测用户是否是书店的合法用户,需要用户输入用户名和密码来核对用户的合法性,用户登陆模块就是完成这一功能。该模块需要用到Login.java这个Bean。界面如图5.7
图5.7用户登陆界面
部分代码如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page session="true" %>
<jsp:useBean id="login" scope="page" class="bookshop.run.login" />
<%
String mesg = "";
if( request.getParameter("username")!=null && !request.getParameter("username").equals("")){
String username =request.getParameter("username");
String passwd = request.getParameter("passwd");
username = new String(username.getBytes("ISO8859-1"));
passwd = new String(passwd.getBytes("ISO8859-1"));
login.setUsername(username);
login.setPasswd(passwd);
out.print(username+passwd);
if (login.excute()){
session.setAttribute("username",username);
String userid = Long.toString(login.getUserid());
session.setAttribute("userid",userid);
response.sendRedirect("booklist.jsp");
%>
<%
}else {
mesg = "登录出错!" ;
}
}
%>
<%@include file="/bookshop/inc/head.inc"%>
………….
该模块通过Request.getparameter()从表单中取得参数,然后调用Login.java的 execute()方法通过数据库进行检测实现。
5.4.3在线购书功能模块设计
在该模块用户可以看见现有的图书,用户可以查找图书(可分类查询,也可以按关键字查询),用户可以购买图书(把书放进购物车),也可以查看图书的详细资料,还可以转到其他模块,如查看购物车,查看订单信息等。考虑到其他页面也用到导航条和左边的图书分类和图书查询部分,因此把这两部分也设计成两个公用模块:sub.inc和left.inc,在其他页面中只需引入即可。
5.4.4我的购物车功能模块设计
在”我的购物车”这个模块里,用户可以修改购买数量,可以修改已经选购的图书,可以提交购物车(在提交时可以简单附言说明),可以清空购物车,还可以继续购书,或者查询图书,或者转到其他功能模块。
买书的第一步便是用户登录,现在购书网站都要求已经注册过的用户才能购买书籍,这样便于网站管理。checkLogin()就是用来检验用户的合法性的:
function checklogin() {
if (document.payout.userid.value=="")
{
alert("你还没有登录,请登录后再提交购物清单。");
return false;
}
证明是合法用户后,就必须给这个用户一个购物车,用户每次选中一本书,点击“放入购物车”,就必须添加一个订购单。这就相当于把用户要买的书放入购物车里,addnew()就是用来实现这些的,其主要代码如下:
/**
* 往购物车中添加选购的图书
* @param newrequest
* @return
*/
public boolean addnew(HttpServletRequest newrequest) {
request = newrequest;
String ID = request.getParameter("bookid");
String Amount = request.getParameter("amount");
long bookid = 0;
int amount = 0;
try {
bookid = Long.parseLong(ID);
amount = Integer.parseInt(Amount);
}
catch (Exception e) {
return false;
}
if (amount < 1)
return false;
session = request.getSession(false);
if (session == null) {
return false;
}
purchaselist = (Vector) session.getAttribute("shopcar");
sqlStr = "select leav_number from book where id=" + bookid;
try {
DataBase db = new DataBase();
Connection conn=db.connect();
stmt = conn.createStatement ();
rs = stmt.executeQuery(sqlStr);
if (rs.next()) {
if (amount > rs.getInt(1)) {
leaveBook = rs.getInt(1);
isEmpty = true;
return false;
}
}
rs.close();
}
catch (SQLException e) {
return false;
}
allorder iList = new allorder();
iList.setBookNo(bookid);
iList.setAmount(amount);
boolean match = false; //是否购买过该图书
if (purchaselist == null) { //第一次购买
purchaselist = new Vector();
purchaselist.addElement(iList);
}
else { // 不是第一次购买
for (int i = 0; i < purchaselist.size(); i++) {
allorder itList = (allorder) purchaselist.elementAt(i);
if (iList.getBookNo() == itList.getBookNo()) {
itList.setAmount(itList.getAmount() + iList.getAmount());
purchaselist.setElementAt(itList, i);
match = true;
break;
} //if name matches结束
} // for循环结束
if (!match)
purchaselist.addElement(iList);
}
session.setAttribute("shopcar", purchaselist);
return true;
}
如果用户对所选购的图书不满意,可以修改购物车,代码如下:
/**
* 修改已经放进购物车的数据
* @param newrequest
* @return
*/
public boolean modiShoper(HttpServletRequest newrequest) {
request = newrequest;
String ID = request.getParameter("bookid");
String Amount = request.getParameter("amount");
long bookid = 0;
int amount = 0;
try {
bookid = Long.parseLong(ID);
amount = Integer.parseInt(Amount);
}
catch (Exception e) {
return false;
}
if (amount < 1)
return false;
session = request.getSession(false);
if (session == null) {
return false;
}
purchaselist = (Vector) session.getAttribute("shopcar");
if (purchaselist == null) {
return false;
}
sqlStr = "select leav_number from book where id=" + bookid;
try {
DataBase db = new DataBase();
Connection conn=db.connect();
stmt = conn.createStatement ();
rs = stmt.executeQuery(sqlStr);
if (rs.next()) {
if (amount > rs.getInt(1)) {
leaveBook = rs.getInt(1);
isEmpty = true;
return false;
}
}
rs.close();
}
catch (SQLException e) {
return false;
}
for (int i = 0; i < purchaselist.size(); i++) {
allorder itList = (allorder) purchaselist.elementAt(i);
if (bookid == itList.getBookNo()) {
itList.setAmount(amount);
purchaselist.setElementAt(itList, i);
break;
} //if name matches结束
} // for循环结束
return true;
}
/**
*删除购物车中数据
* @param newrequest
* @return
*/
public boolean delShoper(HttpServletRequest newrequest) {
request = newrequest;
String ID = request.getParameter("bookid");
long bookid = 0;
……………
for (int i = 0; i < purchaselist.size(); i++) {
allorder itList = (allorder) purchaselist.elementAt(i);
if (bookid == itList.getBookNo()) {
purchaselist.removeElementAt(i);
break;
} //if name matches结束
} // for循环结束
return true;
}
5.4.5订单信息功能模块设计
在该功能模块用户可以看见自己已经提交的所有订单,可以查看订单的详细情况。并设计以弹出窗口的形式显示订单信息,在弹出的窗口中可以付款。实现代码如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page session="true" %>
<%
String username = (String)session.getAttribute("username");
if ( username == null || username.equals("") ){
response.sendRedirect("login.jsp?msg=nologin");
}
%>
//引入JavaBean
<%@ page import="bookshop.book.book "%>
<%@ page import="bookshop.util.*" %>
<%@ page import="bookshop.book.allorder" %>
<%@ page import="bookshop.run.op_book" %>
<jsp:useBean id="myIndentlist" scope="page" class="bookshop.run.op_buy" />
<jsp:useBean id="mybook" scope="page" class="bookshop.run.op_book" />
<%
String mesg = "";
long Id=0;
String indentNo = request.getParameter("orderno");
if( (indentNo==null)|| indentNo.equals("")) {
mesg = "你要查看的订单清单不存在!";
} else {
try {
Id = Long.parseLong(request.getParameter("id"));
if (!myIndentlist.getAllorder(indentNo)){
mesg = "你要查看的订单清单不存在!";
}
} catch (Exception e){
mesg = "你要查看的订单清单不存在!";
}
}
%>
………..
5.5管理界面设计
5.5.1界面头、界面尾设计
同客户界面一样,为了提高代码的重用性,把相同的头和尾设计成两个公用模块,分别引入即可[1]:
< %@include file=”/bookshop/inc/admin_head.inc”%>
<%@include file=”/bookshop/inc/admin_tail.inc”%>
两个文件都是纯HTML代码,再次就不多讲。
5.5.2管理员登陆功能模块设计
为了检测用户是否是管理员,所以需要对登陆用户进行检测。该模块需要用到Login.java这个Bean,需要设计一个表单让用户输入用户名和密码。如图5.8
图5.8 管理员登陆界面
5.5.3现有图书管理功能模块设计
在该功能模块管理员可以查看详细资料,可以修改图书,可以删除图书如图5.9所示。,部分代码如下。
if(request.getParameter("action")!=null&&request.getParameter("action").equals("del")){
try {
int delid = Integer.parseInt(request.getParameter("id"));
if (book_list.delete(delid)){
mesg = "删除成功!";
} else {
mesg = "删除出错!";
}
} catch (Exception e){
mesg = "你要删除的对象错误!";
}
}
if(request.getParameter("page")!=null && !request.getParameter("page").equals("")) {
String requestpage = request.getParameter("page");
try {
pages = Integer.parseInt(requestpage);
} catch(Exception e) {
mesg = "你要找的页码错误!";
}
}
%>
图5.9 现有图书管理功能模块图
5.5.4订单管理功能模块设计
在这个功能模块,管理员可以查看下订单用户的详细资料(单击用户名),可以查看订单的详细情况,还可以删除订单。效果图如图4.10所示。下面部分代码:
if (user.getUserinfo(Ident.getUserId())&&user.getUserlist().size()>0) {
user userinfo = (user)user.getUserlist().elementAt(0); %>
<a href="#" οnclick="openScript('user_detail.jsp?userid=<%= Ident.getUserId() %>','showuser',450,500)"><%= userinfo.getUserName() %></a>
<%} else {
out.println("该用户已被删除");
}
%></td>
<td align="center"><%= Ident.getSubmitTime() %></td>
<td align="center"><%= Ident.getConsignmentTime() %></td>
<td align="center"><%= Ident.getTotalPrice() %></td>
<td align="center"><%= Ident.getIPAddress() %></td>
<td align="center">
<% if (Ident.getIsPayoff() )
out.print("已付清");
else
out.print("未付");
%></td>
<td align="center">
<% if (Ident.getIsSales())
out.print("已发货");
else
out.print("未发货");
%></td>
<td align="center"><a href="#" οnclick="openScript('order_detail.jsp?indentid=<%= Ident.getOrderId() %>','indent',500,500)" >详细情况</a> <a href="adm_order.jsp?action=del&indentid=<%= Ident.getId()%>&page=<%= shop.getPage() %>" οnclick="return(confirm('你真的要删除吗?'))">删除</a></td>
</tr>
<% }
}
图5.10 订单管理效果图
5.5.5用户管理功能模块设计
管理员可以通过值额个模块查看用户的详细资料,修改用户资料和删除用户资料,实现代码和图书管理基本上差不多。 在此就不多说。
6 系统使用
6.1服务器的配置及环境的搭建
从JSP的运作全过程可见,运行JSP最少需要三样东西:JSP引擎、Web服务器和JVM。最常用的Java开发工具就是JDK和Jbuilder,它们之间的很大不同就是JDK是字符界面,而Jbuilder是窗口界面。本系统直接采用JDK作为JVM和Eclipse3.2+MyEcliopse5.0来开发,Eclpise是一个功能非常强大的JAVA/JSP/J2EE工具,它主要以提供插件的方式进行开发。所用的操作系统是WindowsXP,服务器采用的是Tomcat,利用了它充当Jsp引擎,同时还利用了它的信息发布功能。首先把JDK,tomcat安装到本地硬盘C盘根目录下,下面详细的介绍如何配置运行环境:
第一步:进入我的桌面,右击“我的电脑”,选择“属性”选项,进入“系统属性“对话框,单击”高级“标签“,如图6.1所示:
图6.1
第二步:点击上图箭头所示“环境变量”,进入图6.2画面。
图6.2
第三步:单击 “系统变量”部分的 “新建按扭”,创建JAVA-HOME变量,在变量值栏内输入C:\Program Files\ava\jdk1.6.0_01,图5.3是Java_home的路径, 指明JDK安装路径,就是刚才安装时所选择的路径C:\jdk1.6.0_01,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat,eclipse等都需要依靠此变量)
图6.3
第四步:同样的方法创建CLASSPATH 变量,在变量栏内输入,.;%JAVA_HOME%\lib;
%JAVA_HOME%\lib\tools.jar (要加.表示当前路径)CLASSPATH为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别。
第五步:创建PATH变量,在变量栏内输入,%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
Path使得系统可以在任何路径下识别java命令。
第六步:创建Tomcat-Home变量,在变量栏内输入
C:\Program Files\Apache Software Foundation\Tomcat 5.0 如图6.4所示:
图6.4
第七步:检测配置是否成功:
1) 检测JDK是否配置成功
编写一个java程序,例如:
public class HelloWorldApp
{
public static void main(String args[])
{
System.out.println(“HelloWorld!”);
}
}
首先把它放到一个名为HelloWorldApp.java的文件中,这里,文件名应和类名相同,因为java解释器要求公共类必须放在与其同名的文件中。然后对它进行编译:
c:\>javac –g HelloWorldApp.java
编译的结果是生成字节码文件HelloWorldApp.class。最后用java解释器来运行该字节码文件:
c:\>java HelloWorldApp
结果是在屏幕上显示“Hello World!”
至此,JDK完全安装成功。
2) 检测tomcat是否配置成功
进入C:\Tomcat5.0\bin目录,双击startup.bat执行文件启动Tomcat服务器,成功启动后的界面如图6.5所示:
我们现在就可以通过浏览器看Tomcat服务器的示例程序了,打开浏览器,键入http://localhost:8080/index.jsp进入Tomcat服务器的主页面。
图6.5
6.2 进入前台
部署好系统得环境后,启动Tomcat服务器容器,并打开SQL SERVER 2000数据库,此时的windows状态栏如下[7]:
启动浏览器,在浏览器IE的地址栏输入http://localhost:8080,则显示图6.6。
图6.6
单击中间的链接 ,则进入登录服务器对话框,如图6.7所示。
图6.7
输入合法的用户名admin,密码为空后,单击确定进入如图6.8所示的界面,在此可以看到已经安装在Tomcat目录下webapps下的bookshop路径。
图6.8
单击bookshop路径,则启动网上书店站点的前台界面。
6.3 进入后台
在IE浏览器地址栏输入http://localhost:8080/bookshop/bookshop/admin/adm_login.jsp或前台的链接点单击即可进入后台。登录用户名为admin,口令admin即可登录后台。
7 总结
本文论述了一个基于WEB的网上图书销售系统,基本上体现了电子商务各方面的优点。我所设计的网上书店,主要是熟悉和掌握JSP的技术以及对电子商务进行初步的探讨和设计。在几个月的设计过程中,我初步了解了JSP的优点和先进之处,也看到了JSP技术在电子商务应用上的光明前途。通过这次设计,我设计的网上书店基本完成了要求的诸项基本功能,实现了一个简单的不同部分以数据为中心的模型,方案的各部分在实际运作中能够解决相应的问题。
在设计和制作网上书店这一个整体项目的过程中,也培养了自己的综合能力和从全局考虑的思想。将复杂的问题简单化,作为电子商务应用的一个缩影,我所涉及的模块项目完成了其后台具有的基本功能,使自己对于电子商务的了解更加深入和明了。
当然,其中也遗留下了一些待解决的问题,但出于自己水平有限,作为一个网上书店系统,该项目上有一些不完善和函待改进之处,特别是在网站信息的安全性上需要进一步加强。
通过这次的毕业设计,我了解了目前流行的动态商务网站的构成和运作原理,掌握了用JSP构建动态网站的相关知识和技术原理,锻炼了自己的动手实践能力。更重要的是,通过这次的毕业设计,我培养出了刻苦钻研的学习精神和严肃认真的学习态度,这对我以后的学习和工作有很大的益处。
在这次毕业设计过程中,我得到了指导老师张瑞林老师的悉心指导和其他同学的帮助。在此,我对他们表示衷心的感谢!
致 谢
经过三个多月的毕业设计,在指导老师张瑞林的指导下基本开发完成了网上书店。本系统功能还不是十分的完善,但基本上能完成用户在网上购买书籍。其主要功能有用户登录,书籍查询,购物车,以及订单处理等功能。界面美观,明了,易操作。
通过毕业设计我学到了很多新知识,个人能力与了很大的提高。在设计中经常遇到种种困难与挫折,几次陷入停顿状态。在这种情况下,指导老师不但给予我的很多的鼓励,而且在设计上提出了很多正确的建议和善意的批评。还有我在加中培训时的很多同学,很多我不会的问题我就给他们发邮件,大家一起搜集各种相关资料,一起探讨技术问题,一起攻克设计中的各种困难。使我深刻体会到团队精神的重要性。
在这里,顺利完成毕业设计我首先要感谢指导老师张瑞林老师的细心指导,他帮助解决了我设计中的疑难和困惑,为我完成设计提供了极大的帮助。在这个学期中,我随时都能与他取得联系询问相关问题,他总是耐心的为我作出解答,并多次给热心地帮我查找相关书籍资料。我的这次设计顺利完成离不开张瑞林老师的帮助;还有班上的其他同学也为我提供了不少的帮助,在此一并向他们表示衷心的感谢!
不过对我来说,由于时间有限,也包括我的知识水平有限,系统中还有许多不足之处,还请各位老师指导指正。
参考文献
[1] 汪孝宜,刘中兵,徐佳晶等编著,JSP数据库开发实例精粹[M],北京:电子工业出版社,2005.
[2] 姚晓春,郑文清编著,Java编程技术教程[M],北京:清华大学出版社,1999.
[3] 吴逸贤,吴目诚编著,Java2程序设计[M],北京:科学出版社,2003.
[4] 飞思科技产品研发中心编著, Jsp应用开发详解[M],北京:电子工业出版社,2006.
[5] 周竞涛,赵寒,王明微,等编著,Eclipse完全手册[M],北京:电子工业出版社,2006.
[6] 张文静,林琪译,JSP程序设计,北京:人民邮电出版社[M],2006.
[7] 孙卫琴,李洪成著,Tomcat与Java Web开发技术祥解[M],北京:电子工业出版社,2006.
[8] Bruce Eckel著,Thinking In Java[M],北京:机械工业出版社,2006.
[9] 陈威,白伟明,李楠著,JSP工程应用与项目实践[M],北京,机械工业出版社, 2005.
[10] 宋昆、李严著,SQL Server数据库开发实例解析[M],北京, 机械工业出版社,2006.
//download by http://www.codefans.net/
网上图书销售系统的设计与实现
石 磊
(陕西理工学院数学系信息与计算科学专业03级4班,陕西 汉中,723001)
指导老师:张瑞林
[摘要]伴随着Internet的迅速发展,电子商务将成为21世纪主流的商业模式之一。网上书店是随着计算机技术和网络技术的发展而出现的一种新型图书销售渠道。依靠计算机网络,以通讯技术为基础,实现图书销售的网上交易。网上书店同传统的店面书店相比,网上书店的经营方式和销售渠道是全新的;它24小时的全天候和全方位服务是传统书店所不能比及的,成本低廉更是开设网上书店的主要原因。而与其他商品相比,书籍运送几乎不怕碰撞碎裂,不具时效性,同时书本具有功能单一,形式简单,易于判断和选择而独具优势,最适合于网上交易;再次是单价低,降低了消费者第一次在网络购物的门槛,所以网上书店成了电子商务的先锋。
本文首先简述网上购书的历史背景,接着陈述了设计的原理和设计所采用的工具,工具包括JSP 、Dreamweaver MX 、Microsoft SQL2000、JavaScript ;首先对系统进行需求分析,得出了购书系统的结构图,然后接着详细的描述实现了一个网上书店全程购物系统解决方案。
[关键词] 电子商务;电子书店;JSP;Dreamweaver MX
The Design and Development of Electronic Bookshop
Shi Lei
(Grade03,Class 4,Major Information &Compute Science,Math Dept.,Shaanxi University of Technology,Hanzhong 723001,Shaanxi)
Tutor: Zhang Rui Lin
Abstract:We make great strides before being accompanied by Internet, e-commerce will become the mainstream of the 21st century business model. With the online bookstore is the network technology and the emergence of a new type of library development sales channels. Through the combination with electronic forms of communication, rely on computer networks for communications technology as a basis for the realization of the online bookselling transactions. Online bookshop compared with the traditional storefront bookshop, online bookstore's mode of operation and marketing channels is a brand-new; Its 24-hour, all-weather and all-round service is not over and bookstore shops; Low cost is the main reason for the creation of online bookstore. Compared with other commodities, almost no books of collisions fragmentation, without limitation; Meanwhile a function of a single book, a simple form, and unique advantages and options to determine the most suitable for online transactions; Again is at the low and lower consumer shopping network in the first threshold, the online bookshop has become the vanguard of e-commerce.
The first online ordering process described, followed by the presentation of the design principles and design tools used, including JSP, Dreamweaver MX, Microsoft SQL2000, JavaScript; After entering the preparation part of the system here needs analysis, given the shopping process, and data flow; The following is the full text of the main part of the realization of a detailed online bookstore full shopping system solutions.
Keyword: E-commerce; Electronic bookshop;JSP;Dreamweaver MX
目 录
1引言……………………………………………………………………..1
2 概述 1
3 系统分析 1
3.1 可行性分析 1
3.2需求分析 1
4 概要设计 2
4.1 系统设计目标 2
4.2 系统设计思想 2
4.3 系统功能模块划分 2
4.4系统结构设计 3
4.5系统功能简介 4
4.5.1系统基本功能 4
4.6 数据库设计 5
4.6.1 数据库需求分析 5
4.6.2 数据库概念结构设计 5
4.7 数据库逻辑结构设计 7
5 详细设计 9
5.1 开发技术简介 9
5.1.1 JSP简介 9
5.1.2 JSP的运行原理 9
5.1.3 JSP页面的组成 10
5.1.4 JAVABEAN技术介绍 10
5.1.5 JSP 的运行环境 10
5.2 系统主要文件 11
5.3 详细设计及说明 11
5.3.2字符处理BEAN的编写 12
5.3.3实现用户实体的BEAN 14
5.3.4实现图书实体的BEAN 15
5.3.5 实现图书分类实体BEAN 16
5.3.6实现订单实体BEAN 16
5.3.7 实现订单列表的BEAN 17
5.3.8 实现购物车实体的BEAN 18
5.3.9 管理用户登录BEAN的编写 18
5.3.10管理图书BEAN的编写 20
5.3.11管理图书分类BEAN 25
5.3.12管理用户的BEAN 26
5.3.13管理订单的BEAN 26
5.4客户界面设计 30
5.4.1界面头、界面尾设计 30
5.4.2用户登陆模块设计 30
5.4.3在线购书功能模块设计 31
5.4.4我的购物车功能模块设计 31
5.4.5订单信息功能模块设计 34
5.5管理界面设计 35
5.5.1界面头、界面尾设计 35
5.5.2管理员登陆功能模块设计 35
5.5.3现有图书管理功能模块设计 36
5.5.4订单管理功能模块设计 37
5.5.5用户管理功能模块设计 38
6 系统使用 38
6.1服务器的配置及环境的搭建 38
6.2 进入前台 40
6.3 进入后台 41
7 总结 41
参考文献 43
附录
附录A 使用手册
附录B 英文参考文献
附录C 参考文献译文网上图书销售系统的设计与实现