JSP实训大作业_网上书店

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《JSP实训》
课程大作业
专业:
班级:
学号:
姓名:
指导教师姓名: 张文胜报告日期:2012年6月
【摘要】随着网络技术的发展,Internet已成为最具市场潜力的技术领域,使用Web技术设计的数据库应用软件,是目前Internet市场的技术中坚,各种Web 应用如电子商务,网上购物等都采用这种方式实现。

网上购书系统,是一个立足于网络、以书籍为商品的专业性网上购物网站。

系统同时具有买卖书籍等功能,为书籍的流通提供了一个高效的交易平台。

本论文中介绍了本系统开发时所用到的环境、工具及技术,然后是网站的系统结构设计、需求分析、网站流程设计、数据库设计。

最后是系统各模块介绍。

本系统前台功能主要有注册、登陆、书籍浏览、书籍查询、订单查询、购物车、购书、特价书籍、推荐书籍、新书上架等。

后台功能主要有书籍管理、用户管理、书籍分类管理、图书货源地管理等。

【关键词】网上书店JAVA Servlet JSP MVC 模式;
网上书店
因特网的迅猛发展正以前所未有的深度和广度影响和改变着人类生活的各个方面。

Internet带给我们的不仅是无穷的信息,更是商业模式和消费观念的变迁,因图书信息易于判断和选择而独具优势,最适合于网上交易,所以网上书店成了热门的行业。

而且网络的最大优势在于开展信息服务,但在国内网上书店中信息服务具有“不完善”和“低质量”。

经营者往往过于注重图书数量的丰富,而对图书及其相关知识和信息的提供、介绍不够。

比如,书籍介绍不足或是过于简明扼要,书评太少,相关新闻严重匮乏等。

这些都是需要我们去改进和完善的。

所以在此我们更要不断优化网上书店系统,尽量给用户提供方便且更好的服务。

1系统开发技术综述
JAVA开发语言的选择
Java是一种跨平台,适合于分布式计算环境的面向对象编程语言。

具体来说,它具有如下特性:简单性、面向对象、分布式、解释型、可靠、安全、平台无关、可移植、高性能、多线程、动态性等。

面向对象
所有面向对象编程语言都支持三个概念:封装、多态性和继承,Java也不例外。

封装就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。

Java语言的封装性较强,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。

而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。

多态性就是多种表现形式,具体来说,可以用“一个对外接口,多个内在实现方法”表示。

运算符重载(operator overload)一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变得难以理解,所以Java最后还是把它取消了。

继承是指一个对象直接使用另一对象的属性和方法。

事实上,我们遇到的很多实体都有继承的含义。

例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。

这些子实体都具有汽车的特性,因此,汽车是它们的“父亲”,而这些子实体则是汽车的“孩子”。

与另外一些面向对象编程语言不同,Java
只支持单一继承。

平台无关性
Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。

JVM是一种抽象机器,它附着在具体操作系统之上,本身具有一套虚机器指令,并有自己的栈、寄存器组等。

但JVM通常是在软件上而不是在硬件上实现。

分布式
分布式包括数据分布和操作分布。

数据分布是指数据可以分散在网络的不同主机上,操作分布是指把一个计算分散在不同主机上处理。

可靠性和安全性
首先,Java是强类型的语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠;其次,Java不支持指针,这杜绝了内存的非法访问;第三,Java的自动单元收集防止了内存丢失等动态内存分配导致的问题;第四,Java解释器运行时实施检查,可以发现数组和字符串访问的越界,最后,Java提供了异常处理机制,程序员可以把一组错误代码放在一个地方,这样可以简化错误处理任务便于恢复。

由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。

如果没有安全保证,用户从网络下载程序执行就非常危险。

多线程
C和C++采用单线程体系结构,而Java却提供了多线程支持。

Java在两方面支持多线程。

一方面,Java环境本身就是多线程的;另一方面,Java语言内置多线程控制,可以大大简化多线程应用程序开发。

2. MVC设计模式
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。

使用MVC应用程序被分成三个核心部件:模型、视图、控制器。

视图是用户看到并与之交互的界面。

对Web应用程序来说,视图主要包括HTML、JSP等界面。

模型表示业务规则。

在MVC的三个部件中,模型拥有最多的处理任务。

例如它可能用象EJB和ColdFusion Components这样的构件对象来处理数据库。

由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

控制器接受用户的输入并调用模型和视图去完成用户的需求。

所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。

只是接收请求并决定调用哪个模型构件处理请求,然后确定用哪个视图来显示模型处理返回的数据。

MVC的处理过程:首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

下图描述了一个MVC应用程序中模型、视、控制器三部分的关系:
模型、视、控制器三部分的关系
MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。

同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。

每个构件在使用之前都需要经过彻底的测试。

一旦你的构件经过了测试,你就可以毫无顾忌的重用它们了。

这样好像工作量增加了,但是这比起它所能带来的好处是不值一提的。

MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

2.1 Struts技术
Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。

除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。

Taglib是Struts的标记库,灵活动用,能大大提高开发效率。

关于页面导航将是今后的一个发展方向。

通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。

尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。

缺点:初学者需要一个持续学习的过程,甚至还会打乱你网页编写的习惯;
Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。

Struts已逐步运用于越来越多的商业软件。

虽然它现在还有不少缺点,但它是一种非常优秀的J2EE MVC实现方式。

Struts 控制器组件主要包括:充当Struts框架的中央控制器的ActionServlet组件、充当每个子应用模块的请求处理器的RequestProcessor 组件、负责处理一项具体的业务的Action组件。

其工作流程如图。

Struts工作流程
3需求分析
系统概述
主要功能:
浏览网站的图书信息,注册为网站的会员,购买图书,结算,创建订单,查看订购图书的订单的状况,修改个人信息,管理图书信息,管理订单信息,发送邮件和上传文件。

其中,一般的游客能够在网站上进行浏览,查看详细的图书信息,也可以注册为网站的会员;会员登录后可以修改以往提交的个人信息,和购买图书,系统根据用户购买的商品信息形成订单;订单形成后会员可以登录网
站,查看订单的状况—订单是否已确认,图书是否已经发货;系统的管理员登录后,可以对网站信息实施管理,包括对图书信息的管理和对用户提交的订单的处理,可以添加、修改和删除图书信息,确认订单,并发送邮件通知订货会员。

系统运行环境
1. 硬件环境
处理器: Inter Pentium 166 MX 或更高
内存: 32M
硬盘空间:1GB
显卡: SVGA显示适配器
2. 软件环境
操作系统:Windows 98/2000/XP
客户端:IE 5.0 或以上版本
开发语言:JSP、Java
功能需求描述
本系统的主要目的是为用户提供一个购买图书的商务网站,在为用户提供一个方便易用的界面的同时,也要为具有管理权限的系统管理用户提供添加、删除、修改图书信息和订单信息的系统维护功能。

4总体设计
系统的总体设计原则
网上书店系统面向各个层次的网络用户,因此系统的界面设计应该尽量做到简洁、友好、方便、易用,用户不需专门的学习便可熟练操作。

本系统采用B/S模式,服务器端使用JSP进行动态网页以及JavaBean技术开发。

系统模块结构图
5数据库设计
本系统涉及六张数据库表,分别为会员信息表(userinfo),图书信息表(bookinfo),管理员信息表(manager),订单信息表(indent),订单项信息表(itemindent)。

数据库代码
import java.sql.*;
//连接数据库的工具类。

public class DataBaseConnection
{
/**
*一个静态方法,返回一个数据库的连接。

*这样达到了对数据库连接统一控制的目的。

*/
public static Connection getConnection()
{
Connection con=null;
String CLASSFORNAME="com.mysql.jdbc.Driver";
String serverInfo="jdbc:mysql://127.0.0.1:3306/jsp_db?user=r oot&password=1234&useUnicode=true&characterEncoding=gb2312";
try
{
Class.forName(CLASSFORNAME);
con = DriverManager.getConnection(serverInfo);
}
catch(Exception e)
{
e.printStackTrace();
}
return con;
}
}
6系统实现以及运行
封装数据信息的JavaBean
封装数据信息的JavaBean用于保存一些要存储于数据库中的数据,这些数据来源于界面,将其封装到JavaBean中然后对其进行业务操作,符合软件设计的信息隐藏原则。

UserInfo.java,Indent.java,ItemIndent.java,BookInfo.java 等,就是此类JavaBean,其属性和数据库中的字段定义相同,方法主要是访问器方法。

封装业务逻辑的JavaBean
封装业务逻辑的JavaBean,主要实现对封装数据的JavaBean的一些业务逻辑处理。

包括数据库的连接和操作,以及网站其它的功能实现的业务逻辑如购物车。

实现界面显示的JSP文件
JSP文件主要是实现所有和用户交互的界面,这里以其中的一个JSP页面booklist.jsp为例来说明JSP页面与JavaBean之间怎么协同完成显示数据库中图书信息的功能。

7关键功能实现
分页功能
分页功能有两种实现方式:一种方法是,一次将数据库中的信息全部取出,然后显示用户指定页码的那部分图书信息;第二种方法是,先获得用户指定的页码,然后从数据库中取出这部分图书信息,显示于页面上。

本实例中的分页技术属于第二种。

购物车
会员
发邮件功能
发邮件的功能是通过JavaMail实现的。

JavaMail是Sun发布的用来处理email 的API,它可以方便地执行一些常用的邮件传输。

在实现发送邮件的功能时主要用到的JavaMail中以下几个类:属性类(javax.mail.Properties)、会话类(javax.mail.Session)、信息类(javax.mail.MimeMessage)、传输类(javax.mail.Transport)。

上传功能
上传功能是管理员在进行图书注册的时候上传图书的封面图片。

这样会员能够在图书的详细信息中看到图书的封面。

该功能的实现需要jspSmartUpload组件,它是网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。

8源代码(部分)
package ch10;
import ch10.*;
import java.util.*;
import java.math.*;
public class Cart
{
private Map itemMap=new HashMap();
private Collection items;
public Map getItemMap()
{
return itemMap;
}
public Collection getItems()
{
return itemMap.values();
}
public void setItems(Collection c)
{
items=c;
}
public int getItemSize()
{
return itemMap.size();
}
public boolean containsItemId(long bookNo)
{
return itemMap.containsKey(bookNo);
}
/*清空购物车*/
public void clear()
{
itemMap.clear();
}
/*向购物车中增加一个item*/
public void addItem(Item item)
{
Item tempItem=(Item)itemMap.get(item.getBookNo()); if(tempItem==null)
{
//item.setAmount(1);
itemMap.put(item.getBookNo(),item);
items=itemMap.values();
}
else
{
int n=item.getAmount()+tempItem.getAmount();
item.setAmount(n);
itemMap.put(item.getBookNo(),item);
items=itemMap.values();
}
}
/*删除购物车中指定的item*/
public Item removeItem(long bookNo)
{
Item tempItem =(Item) itemMap.remove(bookNo);
if(tempItem==null)
return null;
else
{
items=itemMap.values();
return tempItem;
}
}
/*重新设置购物车中的商品数量*/
public void setItemAmount(long bookNo, int amount)
{
Item tempItem = (Item)itemMap.get(bookNo);
tempItem.setAmount(amount);
}
public BigDecimal getTotalPrice()
{
BigDecimal totalPrice=new BigDecimal("0");
Iterator items=itemMap.values().iterator();
BookInfo abook=null;
while(items.hasNext())
{
Item item=(Item)items.next();
BookDB bookdb=new BookDB();
try{
abook= bookdb.getBookInfo(item.getBookNo());
}
catch(Exception e)
{}
BigDecimal price=new BigDecimal(abook.getPrice());
BigDecimal amount=new BigDecimal(item.getAmount());
totalPrice=totalPrice.add(price.multiply(amount));
}
return totalPrice;
}
}
package ch10;
public class BookInfo
{
private long id;
private String bookName;
private int bookClass;
private String author;
private String publisher;
private String isbn ;
private String content ;
private float price ;
private int stock ;
private String regTime ;
private String picture;
public void setId(long newId)
{
this.id = newId;
}
public long getId()
{
return id;
}
public void setBookName(String newBookName) {
this.bookName = newBookName;
}
public String getBookName()
{
return bookName;
}
public void setBookClass(int newBookClass) {
this.bookClass = newBookClass;
}
public int getBookClass()
{
return bookClass;
}
public void setAuthor(String newAuthor)
{
this.author = newAuthor;
}
public String getAuthor()
{
return author;
}
public void setIsbn(String newIsbn)
{
this.isbn = newIsbn;
}
public String getIsbn()
{
return isbn;
}
public void setPublisher(String newPublisher) {
this.publisher = newPublisher;
}
public String getPublisher()
{
return publisher;
}
public void setContent(String newContent) {
this.content= newContent;
}
public String getContent()
{
return content;
}
public void setPrice(float newPrice)
{
this.price = newPrice;
}
public float getPrice()
{
return price;
}
public void setStock(int newStock)
{
this.stock = newStock;
}
public int getStock()
{
return stock;
}
public void setRegTime(String newRegTime) {
this.regTime = newRegTime;
}
public String getRegTime()
{
return regTime;
}
public void setPicture(String newPicture)
{
this.picture = newPicture;
}
public String getPicture()
{
return picture;
}
}
package ch10;
import ch10.*;
import java.util.*;
import java.math.*;
public class Cart
{
private Map itemMap=new HashMap();
private Collection items;
public Map getItemMap()
{
return itemMap;
}
public Collection getItems()
{
return itemMap.values();
}
public void setItems(Collection c)
{
items=c;
}
public int getItemSize()
{
return itemMap.size();
}
public boolean containsItemId(long bookNo) {
return itemMap.containsKey(bookNo); }
/*清空购物车*/
public void clear()
{
itemMap.clear();
}
/*向购物车中增加一个item*/
public void addItem(Item item)
{
Item tempItem=(Item)itemMap.get(item.getBookNo());
if(tempItem==null)
{
//item.setAmount(1);
itemMap.put(item.getBookNo(),item);
items=itemMap.values();
}
else
{
int n=item.getAmount()+tempItem.getAmount(); item.setAmount(n);
itemMap.put(item.getBookNo(),item);
items=itemMap.values();
}
}
/*删除购物车中指定的item*/
public Item removeItem(long bookNo)
{
Item tempItem =(Item) itemMap.remove(bookNo);
if(tempItem==null)
return null;
else
{
items=itemMap.values();
return tempItem;
}
}
/*重新设置购物车中的商品数量*/
public void setItemAmount(long bookNo, int amount)
{
Item tempItem = (Item)itemMap.get(bookNo);
tempItem.setAmount(amount);
}
public BigDecimal getTotalPrice()
{
BigDecimal totalPrice=new BigDecimal("0");
Iterator items=itemMap.values().iterator();
BookInfo abook=null;
while(items.hasNext())
{
Item item=(Item)items.next();
BookDB bookdb=new BookDB();
try{
abook= bookdb.getBookInfo(item.getBookNo());
}
catch(Exception e)
{}
BigDecimal price=new BigDecimal(abook.getPrice());
BigDecimal amount=new BigDecimal(item.getAmount());
totalPrice=totalPrice.add(price.multiply(amount));
}
return totalPrice;
}
}
成绩评定。

相关文档
最新文档