网上书店Online BookStore System毕业论文Word下载.docx
《网上书店Online BookStore System毕业论文Word下载.docx》由会员分享,可在线阅读,更多相关《网上书店Online BookStore System毕业论文Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
客户端
请求(Request)
WebServer
响应(Response)
Server
extension
服务器扩展
Servlet
engine
JSP
Servlet引擎
JSP引擎
Class
loader
Java
complier
parser
类载入器
Java编译器
JSP语法分析器
图1-1JSP运行原理
在编译时如果发现JSP文件有任何语法错误,转换过程将中断,并向客户端发出出错信息;
如果编译成功,则所转换产生的Servlet代码被编译,然后该Servlet被JSP引擎加载到存中。
此时JSP引擎还请求了jspInit()方法的执行,并对此Servlet初始化。
JspInit()方法在Servlet的生命周期中只被请求一次,然后将被调用来处理客户端的请求和回复操作。
对于所有随后对该JSP文件的请求,服务器将检查该JSP文件自最后一次被存取后是否经过修改。
如果没有修改,则将请求交还给还在存中的Servlet的jspService()方法,执行回复操作。
由于Servlet始终驻于存,所以响应是非常快的。
Jsp页面在第一次访问时由于要转化和编译,运行速度较慢,但是当第二次访问该页时,由于文件已经被编译成字节码文件了,所以速度非常得快。
1.2.2JSP页面的组成
JSP页面看上去像标准的HTML和XML页面,并附带有JSP引擎能够处理和解析执行的代码与组件。
通常,JSP代码和组件用于创建在最终页面上显示的文本。
通常来说,JSP页面包括编译指令,动作指令,声明,表达式和程序段等容。
1.2.3JavaBean技术介绍
JavaBean技术是一种基于Java的组件技术,JavaBean组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据的提取等,是解决代码重用问题的一种策略。
以前的组件无法实现真正的代码重用,其主要原因就是它们对于处理平台的依赖和对开发语言的依赖过重。
由于Java语言在这些方面所具有的特点和优势,使得基于它的软件JavaBean组件技术倍受人们的关注。
它的任务就是:
一次编写,可以在任何地方执行,可以在任何地方重用。
JavaBean组件可以在任何地方冲用包括了可以在应用程序、其他组件、文档、Web站点和应用程序构造器工具等多种方案中再利用。
为了创建和使用Java软件组件,JavaBean被实现为一种独立于平台和结构的应用程序接口,它的实现可以忽略部的结构及细节问题,只需要定义其外部的特征及对外功能就行。
其中,属性、方法和事件三种接口可以独立对外进行开发。
JavaBean的实质就是一个.class文件,也可以成为类文件。
JavaBean以binary格式保存,可以保护Java源代码不容易被他人抄袭。
1.2.4JSP的运行环境
要运行Jsp,需要有支持Jsp的服务器。
这里分2种情况:
一种是自身就支持Jsp的服务器,如Jrun,Weblogic,JSWDK等;
而另一种则是在不支持Jsp的服务器上安装Jsp引擎的插件,如在IIS,Apache等服务器上安装WebSphere,tomcat,Resin等插件。
其中主流服务器是Weblogic和tomcat.
Weblogic是一款功能强大的服务器软件,配置比较简单,而且Jsp的扩展功能较多,附带了数据库的JDBC驱动程序。
,支持JHTML(一种与Jsp十分相似的技术),是目前市场占有率最高的服务器。
Tomcat服务器是ApacheGroupJakarta小组开发的一个免费服务器软件,适合于嵌入Apache中使用,而且,它的源代码可以免费获得,你可以自由地对它进行扩充。
访问的地址jakarta.apache.org/tomacat/index.html,Tomcat服务器的兼容性很好,如WebLogic服务器采用其为Web服务器引擎,Jbuilder将其作为标准的测试服务器,Sun公司也将其作为JSP技术应用的示例服务器
第二章需求分析
2.1系统说明
本系统是一个中小型的电子商务系统----网上书店,可以为各类用户提供方便的在线买书环境,符合目前国流行的电子商务模式。
用户可以在系统中实现注册、浏览商品、搜索查询商品、下定单、处理定单等功能;
管理员可以通过用户管理、定单管理、商品管理、评论管理等管理功能来对系统进行维护更新。
2.2系统功能简介
2.2.1基本功能
●游客可以浏览
●用户登陆
●用户能够浏览
●提供搜索引擎,使用户能够按特定的条件对所需商品进行搜索
●用户下定单购买商品
2.2.2用户界面设计
第三章系统设计
3.1系统设计思想
本系统采用三层架构设计,它的工作原理如图3-1所示。
图3-1
采用三层构架以后,用户界面层通过统一的接口向业务层发送请求,业务层按自己的逻辑规则将请求处理之后进行数据库操作,然后将数据库返回的数据封装成类的形式返回给用户界面层。
这样用户界面层甚至可以不知道数据库的结构,它只要维护与业务层之间的接口即可。
3.2系统功能模块化
如图3-2为本系统的功能模块图。
用户登录
在线购书
查看购物车
察看订单信息
察看图书详细
购买
图书查询
察看图书详细资料
查看订单详细
继续购书
清空购物车
提交购物车
删除已经选购的图书
修改购买数量
图3-2
3.3数据库设计
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率,以及实现的效果产生影响。
合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。
3.3.1数据库需求分析
针对一般在线书店的需求,得出如下需求信息。
▪用户分为游客和已注册用户。
▪订单分为单详细订单和总订单。
▪一个用户可以购买多本图书。
▪一个用户对应一订单。
▪一个列表对应多订单。
针对本系统功能分析,总结出如下的需求信息。
▪用户,包括数据项:
用户ID、用户名、密码。
▪图书,包括数据项:
图书编号、图书名、价格、图书介绍。
▪订单列表,包括数据项:
订单编号、图书编号、购书数量。
▪订单,包括数据项:
订单编号、用户编号、下单时间。
3.3.2数据库概念结构
从本系统中规划出的实体有:
用户实体、图书实体、订单实体、订单列表实体。
用户信息实体的E-R图如图3-4所示。
图书实体的E-R图如图3-5所示。
订单实体的E-R图如图3-6所示。
订单列表实体的E-R图如图3-7所示。
3.3.3数据库逻辑机构设计
在线书店数据库中各个表的设计结果如下面的标和所示。
表3-8为图书信息列表。
表3-8
表3-9为用户信息列表。
表3-9
表3-10为订单总表,记录某个用户的订单信息。
表3-10
表3-11为订单表,记录但订单的具体信息。
表3-11
第四章详细设计
4.1系统概述
我设计的这个系统是一个由JSP实现的网上购书系统。
它实现了基本的登录验证、查询商品、分页处理、购物车处理以及订单处理功能,其主要界面见图4-1:
图4-1
4.2系统主要文件
这个购书系统主要有2类文件,一类是Bean文件,我把它们统一放在了cart文件夹里,保存在jakarta-tomcat-5.0.27\common\classes\cart下,(这是tomcat要求的默认存放Bean的路径);
另一类是jsp文件,保存在jakarta-tomcat-5.0.27\webapps\ROOT。
(这是tomcat的默认工作环境)
Bean文件:
CartManager.java,OrderEntity.java,OrderItemEntity.java
ProductEntity.java,UserEntity.java
Jsp文件:
cart.jsp
4.3详细代码及说明
4.3.1实现用户实体的Bean
1)用户作为实体,我把他的id,,密码作为其属性在Bean里面做了定义,它们都是和数据库里的user表相对应的,在这个Bean里封装的方法也主要是对这个表进行操作.这个几个属性都被定义为类的私有成员,外界不可访问
privateStringid;
privateStringuserName;
privateStringuserPassword;
2)构造函数里做了2件事情,第一:
寻找数据库连接驱动;
第二:
对上面的3个私有成员初始化:
publicstaticStringsDBDriver="
sun.jdbc.odbc.JdbcOdbcDriver"
;
publicstaticStringsConnStr="
jdbc:
odbc:
cart"
publicstaticConnectionconn=null;
publicUserEntity(Stringid,StringuserName,StringuserPassword)
{
try{
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundExceptione){
System.err.println("
UserEntity:
"
+e.getMessage());
this.id=id;
this.userName=userName;
this.userPassword=userPassword;
}
3)这个类我封装了2类方法:
一是查找特定用户名的所有记录,代码如下:
publicstaticUserEntityqueryUser(StringuserName)throwsSQLException
{
catch(java.lang.ClassNotFoundExceptione){
Stringsql="
selectid,user_name,user_passwordfromuserwhereuser_name=?
ResultSetrs=null;
try{
conn=DriverManager.getConnection(sConnStr);
PreparedStatementprepStmt=conn.prepareStatement(sql);
prepStmt.setString(1,userName);
rs=prepStmt.executeQuery();
}
catch(SQLExceptionex){
OrderItemEntityexecuteQuery:
+ex.getMessage());
}
UserEntityuser=null;
if(rs.next())
user=newUserEntity(rs.getString
(1),rs.getString
(2),rs.getString(3));
returnuser;
该类封装的另一种方法是:
用户名和密码的获得。
这个主要是为了方便后面验证用户合法性使用
publicStringgetUserName(){
returnuserName;
}
publicStringgetUserPassword(){
returnuserPassword;
4.3.2实现商品实体的Bean
虽然我做的是一个购书系统,但考虑到系统的可扩展性,我把书当作一种商品来进行定义。
同样,参照数据库里的product表,我给商品这个类定义了如下4个属性,商品id,商品名称,商品价格,商品note,其类型同样是该类的私有属性:
privateStringproductName;
privateStringproductPrice;
privateStringproductNote;
1)其构造函数和用户实体类基本上一致,所以代码及其说明我在这里就省略了。
2)对商品的操作也主要是2类,一类是对特定商品的查询,其原理和查询用户是一样的,但是有一点小小的区别,即查询商品可以使查询所有的商品,或者是查询特定id的商品,我通过以下代码把这2种查询合在了queryProduct这个函数里:
Stringsql="
selectid,product_name,product_price,product_notefromproduct"
if(productIpareTo("
"
)!
=0)
sql=sql+"
whereid=?
Vectorv=newVector();
其关于连接数据库,查询记录的代码和上面的大致雷同,所以在这里就省略了。
显示商品是分页显示的,其代码如下:
while(rs.next()){
++i;
if(i>
pageCount*pageSize){
if(i<
=(pageCount+1)*pageSize)
v.add(newProductEntity(rs.getString
(1),rs.getString
(2),rs.getString(3),rs.getString(4)));
else
break;
}
这一段代码的主要功能是:
每一页最多显示pageSize个商品,如果超过pageSize个,就分页显示。
PageSize在后面将会定义,其值我设置为10。
3)第二类方法是查询商品的id,全称,价格和note.例如查找商品的ID:
publicStringgetProductId()
{returnid;
}
4.3.3实现订购单实体的Bean
客户每次购买一种商品都会产生一次订购单,它包括订单号,所购买的书号,所购买这种书的数量,这些构成了这个类的私有属性:
privateStringorderId;
privateStringproductId;
privateStringproductNum;
1)客户每次选中一种商品后,点击放入购物车,就会产生一个订单,其实现代码如下:
insertintoorder_item(order_id,product_id,product_num)values(?
?
)"
prepStmt.setString(1,orderId);
prepStmt.setString(2,productId);
prepStmt.setString(3,productNum);
prepStmt.executeUpdate();
订购单,书号,购买数量都是作为参数传过来的。
很明显,新建一订购单其实就是在order_item表里插入一条新纪录就可以了。
其原理已经在上面说过来了,就不在此重复了。
2)在后面的购物车里,一名顾客的最终消费总额就是根据这里一的订购单得到的,所以查找特定订单号的订购单是这个类里面不可缺少的方法,它的算法实质上就是条件查询,和前面的无条件查询相比,我只把sql语句作了改动:
selectid,order_id,product_id,product_numfromorder_itemwhereorder_id=?
3)第3个被封装的方法是设置,获得订购单号,书号,定购数量,并且还可以获得sessionprice.
4.3.4实现购物车实体的Bean
在现实生活中,人们去超市买东西,都是把商品放在一个购物篮里,等到把所有要买的东西选购完毕后,一起拿到收银台前付钱。
我在程序里定义的购物车实体就是模拟这个功能.作为购物车,购物人,购物时间,所购书的总价格都是必不可少的:
privateStringorderDate;
privateStringorderPrice;
我觉得在这个Bean里面主要要解决的一个问题,如何解决一个新的购物车。
当一个顾客买完书提交购物车后,我们必须插入一个新的购物车纪录,这是由insertOrder()方法来实现的:
其插入代码如下:
conn=DriverManager.getConnection(sConnStr);
PreparedStatementprepStmt=conn.prepareStatement(sql);
StringcurDate=(java.util.Calendar.getInstance().getTime()).toString();
prepStmt.setString(1,userName);
prepStmt.setString(2,curDate);
prepStmt.setString(3,orderPrice);
prepStmt.executeUpdate();
这里,插入的原理和前面是相同的,但是有一个地方需要解释:
即购物时间字段,是采用的java.util.Calendar.getInstance().getTime(),这是一个库函数,被封装在java.util,在这个类定义的开头,我把这个库文件包含进来:
importjava.util.*;
这个方法返回的结果必须把转化成String,否则后面插入数据库时会出现类型不匹配的错误。
toString()就是用来实现类型转换的。
为了方便后面对这个购物车进行操作,我在这个方法里还获得了该购物车的id:
StringselectStatement="
selectid"
+"
fromorderlistwhereuser_name=?
orderbyiddesc"
PreparedStatementprepStmt=conn.prepareStatement(selectStatement);
prepStmt.setString(1,userName);
ResultSetrs=prepStmt.executeQuery();
rs.next();
Stringresult=rs.getString
(1);
returnresult;
在sql里,查询特定用户购物车的id号,并且按照降序排列。
是因为,针对一个网上购书系统,顾客可以多次在这里购书,那么在购物车表单里,针对一个顾客会有很多条他的购物纪录,而在数据库里,各条记录的id是安装时间先后顺序逐渐递增的,如果安装降序排列,那么得到的第一条记录则是最新插入的纪录。
result=rs.getString
(1)表示只把该条记录的第一个字段传给result,即把购物车的id号传给result。
4.3.5实现购物实体的Bean
1)买书的第一步便是用户登录,现在购书都要