第五章实训案例:网络书城系统_第1页
第五章实训案例:网络书城系统_第2页
第五章实训案例:网络书城系统_第3页
第五章实训案例:网络书城系统_第4页
第五章实训案例:网络书城系统_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章 实训案例:网络书城系统 ·235·第三篇 基于JSP+Struts2+Hibernate技术架构的开发本篇的目的n 掌握Struts技术n 掌握Hibernate技术n 掌握事务处理技术n 掌握购物车原理n 理解泛型的使用n 熟练使用JSP+Struts2+Hibernate技术架构第五章 实训案例:网络书城系统本章将基于JSP+Struts+Hibernate技术设计与实现网络书城系统。5.1 系统分析随着网络的广泛普及,网络支付手段的逐步完善,越来越多的人逐渐习惯于网上购物,习惯于鼠标点击下订单,送货上门的快捷便利的购物方式。传统书店的购书观念正在被网上方便快捷

2、的购书方式所冲击。网络书城就是借助于互联网,搭建读者和图书销售企业之间的桥梁,实现图书的快速查询和购买,既方便读者,也方便图书销售企业管理、宣传、推广和销售图书。5.1.1 需求描述网络书城的主要功能就是让用户能够足不出户就可以购买到自已想要的书籍,所以网络书城系统主要提供如下功能:l 用户能够使用本网站完成图书的浏览、查询和购买。l 普通用户只能浏览图书信息。浏览分为三种方式:按类别浏览、按条件浏览、查询图书。l 普通用户通过注册成为注册用户,注册后的用户可以登录,密码忘记后可以找回密码,登录后可以修改注册资料。l 注册用户登录后可以进行在线图书购买,购买的图书存放在购物车中;可以对购物车中

3、的商品数量进行修改、删除;调整好购物车中内容后,可进行结算,以将购买的图书保存到订单中。l 注册用户登录后可以浏览自己的订单,查看订单细目,对于没有得到商家处理的订单可以取消。l 管理员可分页浏览用户,可查看用户详细信息,可删除用户。l 管理员可管理图书分类、管理图书,添加图书时能够上传图书的图片。l 管理员可分页浏览订单、查看订单状态,处理订单,删除订单。5.1.2 用例分析用例图(Use-case Diagram)显示外部参与者与系统的交互,能够更直观地描述系统的功能。从角色来看,网络书城系统的用户分为用户(普通用户)、会员(注册用户)、管理员。图5-1和5-2是网络书城系统的两个用例图。

4、图5-1 客户端用例图图5-2 管理端用例图5.1.3 功能分类表5-1给出了网络书城的功能分类。表5-1 功能划分表模块名子功能描述前台功能用户登录提供用户名、密码后可以登录系统用户注册普通用户在注册页填写详细资料后成为正式注册用户个人修改用户登录后可以修改自己的注册资料找回密码忘记密码的用户可以通过email找回密码密码设置管理员可以修改自己的密码浏览图书以分页方式显示图书列表,并通过单击标题可查看书的详细信息;可进行分类浏览图书,并可按条件查询图书购物车登录用户在浏览图书时,可以把需要的图书添加到购物车中;可浏览购物车,修改购物车中图书的数量,删除购物车中的图书,清空购物车,或结算订单浏

5、览登录用户可以浏览自己的订单,查看状态,并可查看订单细目后台维护用户管理管理员可分页浏览用户、查看用户详细信息,可删除用户分类管理管理员进入浏览产品分类,可添加、修改或删除分类图书管理管理员可分页浏览图书、查看图书详细信息,可添加或修改图书订单管理管理员可分页浏览订单、查看订单状态、处理订单,删除订单5.1.4 其他需求系统的界面美观、简洁、菜单设置和布局合理,除图形外界面色彩不宜过多。页面具有明确的导航指示,且便于理解,方便用户使用。进入本系统进行任何操作的时候,系统应该及时的进行反应,反应的时间在5秒以内。系统应能监测出各种非正常情况,如与设备的通信中断,无法连接数据库服务器等,避免出现长

6、时间等待甚至无响应。系统有严格的权限管理功能,各功能模块需有相应的权限方能进入。系统需能够防止各类误操作可能造成的数据丢失,破坏。防止用户非法获取网页以及内容。5.2 系统设计5.2.1 系统功能结构系统的功能结构如图5-3所示。图5-3 网络书城的功能结构图5.2.2 数据库设计根据企业信息展示系统的要求,主要涉及的数据有用户、图书分类、图书、订单、订单细目。为此建立5个数据表来存储对应的数据。1. 数据库的逻辑设计用户表所包含的字段如表5-2所示。表5-2 用户表名称描述数据类型大小约束默认值user_id用户编号int/AI PKuser_name用户名称varchar50NNuser_

7、pwd密码varchar50NNuser_realname真实名varchar50NNuser_phone电话varchar50NNuser_email电子邮件varchar200NNuser_addr地址varchar200NNuser_datetime注册时间timestamp/NN当前时间user_right权限int/NN1图书分类表所包含的字段如表5-3所示。表5-3 图书分类表名称描述数据类型大小约束默认值cat_id分类编号int/AI PKcat_name分类名称varchar50NN UN图书表所包含的字段如表5-4所示。表5-4 图书表名称描述数据类型大小约束默认值book

8、_id图书编号int/AI PKcat_id分类编号int/NN FKbook_publisher出版社varchar200NNbook_isbn书号varchar50NNbook_name图书名称varchar200NNbook_picture图像varchar200NNbook_price价格float/NNbook_author作者varchar50book_desc简介text/book_num数量int/订单表所包含的字段如表5-5所示。表5-5 订单表名称描述数据类型大小约束默认值ord_id订单编号int/AI PKuser_id用户编号int/NN FKord_datetime

9、订货时间timestamp/NNord_state状态int/NN当前时间订单细目表所包含的字段如表5-6所示。表5-6 订单细目表名称描述数据类型大小约束默认值det_id细目编号int/PKord_id订单编号int/NN FKbook_id图书编号text/NN FKdet_num数量int/NN02. 数据库的物理设计系统数据库命名为bs,bs_category(图书分类),bs_book(图书),bs_user(用户)、bs_order(订单),bs_details(订单细目)。表之间的关系如图5-4所示。图5-4 网络书城系统数据表及其关系建立的数据库的SQL脚本如下所示。crea

10、te database bs;use bs ;create table bs_category(cat_id int auto_increment primary key,cat_name varchar(50) not null unique );create table bs_book(book_id int auto_increment primary key,cat_id int not null references bs_category(cat_id),book_publisher varchar (200) not null ,book_isbn varchar(50) not

11、 null,book_name varchar(50) not null,book_picture varchar(50) not null,book_price float not null,book_author varchar(50) not null,book_desc text not null,book_num int not null);create table bs_user (user_id int auto_increment primary key,user_name varchar(50) not null,user_pwd varchar(50) not null,u

12、ser_realName varchar(50) not null,user_phone varchar(50) not null,user_email varchar(200) not null,user_addr varchar(200) not null,user_datetime timestamp,user_right int default 1);create table bs_order (ord_id int auto_increment primary key,user_id int not null references bs_user(user_id),ord_datet

13、ime timestamp,ord_state int default 0);create table bs_details(det_id int auto_increment primary key,ord_id int not null references bs_order(ord_id),book_id int not null references bs_book(book_id),det_num float not null);5.2.3 架构及程序结构为了实现系统便于维护和扩展的目标,系统采用分层架构,整体上分四层:视图层、控制层、业务逻辑层和数据访问层。系统实现采用JSP+St

14、ruts+Hibernate技术。即视图层主要通过JSP实现,控制层通过Struts实现,数据层通过Hibernate实现。项目命名为bs。视图放在【Web页】文件夹下。为了便于管理,划分如下文件夹:user(用户),category(分类),book(图书),bookimages(图书图像),cart(购物车),order(订单),common(公共),css(样式表),images(图像),script(脚本)。如图5-5所示。其他层均放在源包下。在源包下建立bookstore.action(控制类包),bookstore.idao(数据访问接口包),bookstore.dao(数据访问实

15、现类包),bookstore.iservice(业务逻辑接口包),bookstore.service(业务逻辑实现类包),bookstore.model(数据模型或实体类包),mon(一些公共类包),bookstore.tag(自定义标签包)。如图5-6所示。 图5-5 文件夹划分 图5-6 包划分5.2.4 领域模型设计(实体、接口设计) 1实体模型类设计 系统主要包含如下实体模型类,也称为数据模型类: BsUser(用户)、BsCategory(分类)、BsBook(图书)、订单(BsOrder)、订单细目(Details)、购物车条目(BsCartItem)。这些类均存放在bs.mode

16、l包下。在NetBeans集成VP-UML环境下设计的类图如图5-7所示。图5-7 实体模型类类图(1)BsUser类public class BsUser implements java.io.Serializable private Integer userId; private String userName;private String userRealName; private String userPwd;private String userPhone; private String userEmail; private String userAddr; private Date

17、 userDatetime; private Integer userRight;/属性方法省略(2)BsCategory类public class BsCategory implements java.io.Serializable private Integer catId; private String catName;/属性方法省略(3)BsBook类public class BsBook implements java.io.Serializable private Integer bookId; private BsCategory category; private String

18、 bookPublisher; private String bookIsbn; private String bookName; private String bookPicture; private Float bookPrice; private String bookAuthor; private String bookDesc; private Integer bookNum;/属性方法省略(4)BsOrder类 public class BsOrder implements java.io.Serializable private Integer ordId; private Bs

19、User user; private Date ordDatetime; private Float ordTotal; private Integer ordState; private Set bsDetailses = new HashSet(0);/属性方法省略(5)BsDetails类public class BsDetails implements java.io.Serializable private Integer orddId; private BsBook bsBook; private BsOrder bsOrder; private Float orddPrice;

20、private Integer orddCount; /属性方法省略(6)BsCartItem类public class BsCartItem implements Serializable private Integer bookId; private String bookName; private Float bookPrice; private Integer num; /属性方法省略2业务逻辑层接口设计业务逻辑层接口体现了业务功能的需要,它反映了系统所具有的业务功能,业务逻辑接口放在bs.iservice包下。在NetBeans集成VP-UML环境下设计的接口图如图5-8所示。图5-

21、8 业务逻辑层接口图(1)用户业务逻辑层接口(IBsUserService)public interface IBsUserService void addUser(BsUser user); void editUser(BsUser user); void deleteUser(Integer userId); BsUser findUserById(Integer userId);BsUser findUser(String userName, String userPwd);String findUser(String userName, String userEmail); List&

22、lt;BsUser> findUsers(Integer pageNo, Integer pageSize); Integer findCount(); (2)分类业务逻辑层接口(IBsCategoryService)public interface IEpCategoryServicevoid addCategory(EpCategory category);void editCategory(BsCategory category);void deleteCategory(Integer catId);BsCategory findCategoryById(Integer catId

23、);List<EpCategory> findCategories();List<BsCategory> findCategories(Integer pageNo, Integer pageSize);int findCount();(3)图书业务逻辑层接口(IBsBookService)public interface IBsBookService void addBook(BsBook book); void editBook(BsBook book); void deleteBook(Integer bookId); BsBook findBookById(In

24、teger bookId); List<BsBook> findBooks(Integer catId, String bookName, String bookAuthor, Integer pageNo, Integer pageSize); int findCount(Integer catId, String bookName, String bookAuthor);(4)订单业务逻辑层接口(IBsOrderService)public interface IBsOrderService void addOrder(BsOrder order); void editOrde

25、r(BsOrder order); void deleteOrder(Integer ordId); BsOrder findOrderById(Integer ordId); List<BsOrder> findOrders(Integer userId, Integer pageNo, Integer pageSize); int findCount(Integer userId);(5)购物车业务逻辑接口(IBsCartService)public interface IBsCartService void addItem(Integer bookId); void edit

26、Item(Integer bookId, int num); void deleteItem(Integer bookId); void clear(); List<BsCartItem> findItems(); float findTotal();3建立数据访问层接口数据访问层实现对数据库的访问,其接口定义了数据访问的方法。先建立一个基接口IBsBaseDao封装共有的操作,该接口使用了泛型,泛型的两个参数T和ID分别表示操作的具体类和主键类型。其他接口继承基接口。数据访问层接口放在bs.idao下。在NetBeans集成VP-UML环境下设计的接口图如图5-9所示。图5-9

27、数据访问层接口图(1)数据访问层基接口(IBsBaseDao)public interface IBsBaseDao<T,ID extends Serializable> void insert(T obj); void update(T obj); void delete(ID id); T selectById(ID id); List<T> selectAll(); List<T> selectAll(Integer pageSize, Integer pageNo); int selectAllCount();(2)用户数据访问层接口(IBsUser

28、Dao)public interface IBsUserDao extends IBsBaseDao<BsUser, Integer> BsUser selectOne(String userName, String userEmail); String selectPwd(String userName, String userEmail);(3)分类数据访问层接口(IBsCategoryDao)public interface IBsCategoryDao extends IBsBaseDao<BsCategory, Integer> (4)图书数据访问层接口(IB

29、sBookDao)public interface IBsBookDao extends IBsBaseDao<BsBook,Integer> List<BsBook> selectSome(Integer catId, String bookName, String bookAuthor, Integer pageNo, Integer pageSize); int selectCount(Integer catId, String bookName, String bookAuthor);(5)订单数据访问层接口(IBsOrderDao)public interfa

30、ce IBsOrderDao extends IBsBaseDao<BsOrder, Integer> List<BsOrder> selectSome(Integer userId, Integer pageNo, Integer pageSize); int selectCount(Integer userId);(6)订单细目数据访问层接口(IBsDetailsDao)public interface IBsDetailsDao extends IBsBaseDao<BsDetails, Integer> void deleteSome(Integer

31、 ordId); 5.2.5 系统配置1添加所需JAR或框架 在【库】上单击鼠标右键,在弹出的菜单中选择【添加库】或者【添加JAR/文件夹】即可添加库或JAR文件。(1)在库中添加MySQL驱动程序直接使用Netbeans自带的MySQL驱动程序即可。(2)在库中添加Hibernate。Netbeans自带Hibernate3,若希望(3)在库中添加Struts2从网址下载Struts2,目前可下载到的最新版本是struts。下载后得到压缩包struts--all.zip文件。解压后的文件夹中包含一个“struts-

32、lib”文件夹,该文件夹包含了Struts2的类库。在库中添加如下jar文件:commons-fileupload-5.3.jar、commons-io-2.0.5.jar、common-lang3-3.5.jar、framearker-2.3.19.jar、ognl-3.0.6.jar、struts2-core-.jar、struts2-sping-plugin-.jar、xwork-core-.jar。(4)在库中添加标准标签库直接添加Netbeans自带的JSTL 1.1即可。2配置Struts2(1)建立标准部署描述符(w

33、eb.xml)文件。(2)在web.xml中加入如下Struts2核心控制器(过滤器)的配置。<filter> <filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts2</filter-name&g

34、t; <url-pattern>*.action</url-pattern></filter-mapping><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern></filter-mapping>(3)在【源包】下建立配置文件perties,其内容如下所示。struts.enable.DynamicMethodInvocation=truestruts.

35、locale=zh_CHstruts.i18n.encoding =utf-8struts.devMode=truestruts.ui.theme=simplestruts.multipart.maxSize=3221225472struts.multipart.saveDir=/Tempstruts.custom.i18n.resources=resources 3配置Hibernate配置文件hibernate.cfg.xml放在【源包】下,具体配置步骤如下:(1)切换到【服务】选项卡,先建立rc数据库的连接。(2)在【源包】上单击鼠标右键,在弹出的菜单中选择【新建】【其他】,打开【新建文

36、件】对话框。(3)在如图5-10所示的新建文件对话框中,先在类别列表中选择【Hibernate】,然后在文件类型列表中选择【Hibernate配置向导】,单击【下一步】按钮。图5-10 新建Hibenate配置文件(4)在如图5-11所示的对话框,名称和位置保留默认,直接单击【下一步】按钮。图5-11 设置名称和位置(5)在如图5-12所示的对话框,数据库连接选择第(1)步建立的连接,单击【完成】按钮。图5-12 选择数据源(6)在如图5-13所示的配置文件的【设计】界面,展开可选属性,单击【添加】按钮,添加hibernate.show_sql属性。设置此属性的目的是为了方便调试。图5-13

37、添加Hibernate属性配置后的文件内容如下所示。<?xml version="5.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-/Hibernate/Hibernate Configuration DTD 3.0/EN" "<hibernate-configuration> <session-factory> <property name="hibernate.dialect&quo

38、t;>org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:/localhost:3306/rc?zeroDateTimeBehavior=convertToNull</property&

39、gt; <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</property> <property name="hibernate.show_sql">true</property> </session-factory></hibernate-configuration

40、>5.2.6 公共类设计1分页工具类BsPageList在mon包下建立BsPageList类。该类主要用于封装当前页数据及生成分页棒。它根据记录总数、页的大小、页号、url类等数据,生成前后翻页和数字翻页两种翻页棒。具体设计可参考第三章。2工厂模式相关类为了减少各层之间的耦合,采用工厂模式来建立对象。按照这种模式,使用对象的类不由自己来建立对象,而是由一个工厂类来建立对象。以业务逻辑层为例,业务逻辑层需要使用数据访问层对象,但在业务逻辑类中不直接建立数据访问类对象,而是使用工厂类建立数据访问类对象。工厂类BsFactory放在mon包下,主要的原理是:在配置文件中描述实例,工厂类使用反

41、射机制建立对象。具体的方法是,工厂类根据逻辑名到配置文件中获得实际的类名,然后利用如下语句建立对象。实现代码如下所示。public class BsFactory public static Object getBean(String name) try String className = BsCp.getProperty(name); Object obj = Class.forName(className).newInstance(); return obj; catch (Exception ex) ex.printStackTrace(); return null;

42、 使用该类需要在WEB-INF文件夹下建立配置文件perties,还需要建立用于存储配置信息的类BsConfig。其代码如下所示。public class BsConfig public static Properties prop = new Properties();此外,需要使用一个Servlet类BsStartServlet在应用启动时,加载配置数据。public class BsStartServlet extends HttpServlet Override public void init() throws ServletException try Strin

43、g path = this.getServletContext().getRealPath("/WEB-INF/perties"); InputStream in = new FileInputStream(path); BsCp.load(in); catch (Exception ex) throw new ServletException(ex.getMessage(); 在web.xml对这个Servlet类进行配置,具体配置如下所示。<servlet> <servlet-name>StartServle

44、t</servlet-name> <servlet-class>mon.BsStartServlet</servlet-class> <load-on-startup>0</load-on-startup></servlet><servlet-mapping> <servlet-name>StartServlet</servlet-name> <url-pattern>/StartServlet</url-pattern></servlet-mapping&

45、gt;3Hiberntae工具类BsHibernateUtil该封装建立SessionFactory、Session等操作。在该类中使用了ThreadLocal。ThreadLocal为每一个使用某变量的线程都提供一个该变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量,这就解决了Servlet非线程安全的问题。public class BsHibernateUtil /线程本地,用于保存session,保证为每个线程序只建立一个sesison private static final ThreadLocal&

46、lt;Session> threadLocal = new ThreadLocal<Session>(); /线程本地,用于保存Transaction,保证为每个线程序只建立一个Transactionprivate static final ThreadLocal<Transaction> transLocal = new ThreadLocal<Transaction>(); /定义一个sessionFactory private static org.hibernate.SessionFactory sessionFactory; static t

47、ry sessionFactory = new Configuration().configure().buildSessionFactory(); catch (Exception ee) ee.printStackTrace(); / 获得session public static Session getSession() throws HibernateException Session session = (Session) threadLocal.get(); if (session = null | !session.isOpen() session = (sessionFacto

48、ry != null) ? sessionFactory.openSession(): null; threadLocal.set(session); return session; / 启动事务 public static void beginTransaction() throws HibernateException Transaction tr = (Transaction) transLocal.get(); if (tr = null) Session session = getSession(); tr = (session != null) ? session.beginTra

49、nsaction() : null; transLocal.set(tr); /提交事务 public static void commitTransaction() Transaction tr = (Transaction) transLocal.get(); if (tr != null && tr.isActive() mit(); transLocal.set(null); /提交事务 public static void rollbackTransaction() Transaction tr = (Transaction) transLocal.get(); if

50、 (tr != null && tr.isActive() tr.rollback(); transLocal.set(null); / 关闭session public static void closeSession() throws HibernateException Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null && session.isOpen() session.close(); public static org.

51、hibernate.SessionFactory getSessionFactory() return sessionFactory; 4. 用于事务处理的拦截器设计一个Strust2拦截器BsTransactionInterceptor来维护事务,以简化事务处理,并解决延迟加载的问题。public class BsTransactionInterceptor extends AbstractInterceptor private String msg; public String getMsg() return msg; public void setMsg(String msg) this

52、.msg = msg; Override public String intercept(ActionInvocation invocation) throws Exception ActionContext as = invocation.getInvocationContext(); try BsHibernateUtil.beginTransaction(); return invocation.invoke(); catch (Exception e) BsHibernateUtil.rollbackTransaction(); as.put("msg", msg); return "msg" finally try BsHibernateUmitTransaction(); catch (Exceptio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论