JAVAWEB应用开发与实践第13章:基于SSH的网上订餐系统梁胜彬乔保军主编清华大学出版社2清华大学出版社13-1、网上订餐系统简介:网上订餐系统是一个将餐饮和网络完美结合的B2C电子商务网站,它不但方便了用户足不出户就可订餐,而且有助于餐饮企业更好地服务客户、拓宽市场、科学管理及运营餐饮企业。该系统运用JSP+Struts2+Hibernate+Spring技术整合开发,利用DAO设计模式,面向接口编程,提高了开发效率,同时运用三大框架也使得系统的功能模块更加清晰,使得程序后期的系统维护变得更加简单。该系统主要包括两部分:(a)普通用户,可以查看菜单,选择菜品,用户注册,查看个人订单信息、查看购物车等功能。(b)管理员操作,包括菜单管理,订单管理,用户管理,留言管理,查看销售信息等功能。清华大学出版社113-2、技术实现方案网上订餐系统采用Struts2+Spring+Hibernate技术组合实现。在本系统中,Struts2用来完成显示、请求控制部分;Spring主要负责以IoC的方式实现对Bean的管理和实例化;Hibernate主要作为系统中间持久化层,充当数据访问组件。由于Spring对Hibernate具有良好的支持,由Spring容器完成DAO类的实例化操作,Hibernate关注的是ORM映射文件的配置,如级联关系、延迟加载等。清华大学出版社213-3、功能设计网上订餐系统主要包括两部分:前台部分和后台管理模块。(a)前台部分主要服务于普通用户,用户可以查看菜单,选择菜品,用户注册,查看个人信息、查看购物车等功能。(b)后台管理模块主要包括菜单管理,订单管理,用户管理,留言管理,查看销售信息等功能。关于网上订餐系统的功能模块如图所示。(网上订餐系统功能模块)清华大学出版社313-4、搭建开发环境本系统采用Eclipse3.6集成开发环境,后台数据库为MySQL5.5,Web服务器为Tomcat7.0。在Eclipse中新建一个动态Web项目,项目名称为online。具体创建步骤可参阅第1章使用Eclipse开发环境创建动态Web项目的步骤。使用MySQL创建一个名称为OnlineOrderdb的数据库,并按照要求创建订单表(tb_orders)、菜单表(tb_menu)、留言信息表(tb_message)、用户表(tb_user)、用户配送信息表(user_info),具体步骤此处不再详述。清华大学出版社413-4-1、创建项目清华大学出版社513-4-2、项目目录结构创建完项目之后,接下来就是为项目添加必需的库文件,如数据库JDBC库文件、Struts库文件、Hibernate库文件、Spring库文件、EL和JSTL库文件、JFreeChart库文件以及JavaMail库文件等。把这些JAR文件添加到项目的WebContent/WEB-INF/lib目录下,具体如右图。清华大学出版社613-4-2、项目目录结构(续)右图给出了项目源文件的目录结果,其中action包主要存放Struts的Action;common包主要存放系统的公共类;dao包存放DAO接口;impl包存放DAO接口的实现类;jfreechart存放报表类;vo包存放系统的JavaBean组件;javamail包存放发送邮件类;而junit包主要用于单元测试。此外,src目录下还包含了Spring的配置文件applicationContext.xml和Struts的配置文件struts.xml。而在WebContent目录下,主要包括了以下子文件夹:1.js:用于存放JavaScript源文件;2.css:存放CSS文件;3.image:存放系统中用到的图片文件;4.includeFile:存放使用include指令包含的页面;5.manage:存放后台管理模块页面;6.user:存放用户管理模块页面;7.message:存放留言管理模块页面;8.order:存放订单管理模块页面。13-5、主要模块实现:清华大学出版社713-5-1、配置数据源beanid=dataSourceclass=com.mchange.v2.c3p0.ComboPooledDataSourcedestroy-method=closepropertyname=driverClassvalue=com.mysql.jdbc.Driver/propertyname=jdbcUrlvalue=jdbc:mysql://localhost:3306/onlineorderdb?useUnicode=true&characterEncoding=utf-8/propertyname=uservalue=root/propertyname=passwordvalue=123/!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default:3--propertyname=initialPoolSizevalue=1/!--连接池中保留的最小连接数。--propertyname=minPoolSizevalue=1/!--连接池中保留的最大连接数。Default:15--propertyname=maxPoolSizevalue=300/!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default:0--propertyname=maxIdleTimevalue=60/!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:3--propertyname=acquireIncrementvalue=5/!--每60秒检查所有连接池中的空闲连接。Default:0--propertyname=idleConnectionTestPeriodvalue=60//bean连接数据库的配置信息保存在applicationContext.xml文件中,由Spring负责创建及管理数据源,配置数据源Bean的代码如下:清华大学出版社8此外,在applicationContext.xml文件中需要配SessionFactory,由Spring容器管理SessionFactory,无需人工管理,配置SessionFactory的代码如下:beanid=“sessionFactory”class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”propertyname=dataSourceref=dataSource/propertyname=mappingResourceslistvaluecn/soft/vo/MyMenu.hbm.xml/valuevaluecn/soft/vo/Person.hbm.xml/valuevaluecn/soft/vo/Orders.hbm.xml/valuevaluecn/soft/vo/UserInfo.hbm.xml/valuevaluecn/soft/vo/Message.hbm.xml/value/list/propertypropertyname=hibernatePropertiespropspropkey=hibernate.dialectorg.hibernate.dialect.MySQL5Dialect/prop/props/property/bean清华大学出版社913-5-2、设计VO类及映射文件数据库设计完毕,并且应用程序与数据库建立连结之后,下一步工作就是为每个数据表对应设计VO类,即JavaBean。由于本系统运用Hibernate框架进行数据库持久化操作,因此还需要为每个数据表和VO类之前配置映射关系。下面以订单表为例,介绍创建VO类和配置映射关系的方法,其他数据表限于篇幅,此处不再给出,读者可参阅具体的源代码。订单表对应的VO类Orders.javapublicclassOrders{privateintorder_id;privateintorder_num;privateStringorder_notice;privateStringother_notice;privatePersonuser;privateMyMenumenu;privateStringstates;privateStringorder_date;publicStringgetOrder_date(){returnorder_date;}publicvoidsetOrder_date(Stringorder_date){this.order_date=order_date;}//此处省略其他属性的setter和getter方法……}}清华大学出版社1013-5-2(续)、订单表对应的映射文件Orders.hbm.xmlclassname=Orderstable=ordersidname=order_idtype=integergeneratorclass=native//idpropertyname=order_num/propertyname=order_notice/propertyname=other_notice/propertyname=states/propertyname=order_date/many-to-onename=usercolumn=user_id/!--此处是为了配置订单对象orders和用户对象person的多对一的关系映射--many-to-onename=menucolumn=menu_idunique=true/!--此处配置的是订单对象orders和菜单对象mymenu对象的一对一的关系映射,采用外键关联的方式--/class清华大学出版社1113-5-3、公共类的实现该系统采用DAO设计模式,以面向接口的思想来编程,所以在设计所有其它实体类之前,首先设计了一个公共的DAO接口,同时通过DaoImpl类来实现了该接口,这个接口中定义了其他实体类都要用到的方法,如:增、删、改、查等操作。其它实体在创建实体对象后可以通过继承此接口来实现对该实体对象的增、删、改、查操作。DaoImpl.java@TransactionalpublicabstractclassDaoImplimplementsDao{@ResourceprotectedSessionFactorysessionFactory;//保存publicvoidsave(Objectentity){sessionFactory.getCurrentSession().save(entity);}//更新publicvoidupdate(Objectentity){sessionFactory.getCurrentSession().merge(entity);}//删除指定对象publicTvoiddelete(ClassTentityClass,Objectentityid){deletes(entityClass,newObject[]{entityid});//其余方法限于篇幅不予显示可直接查看源码}清华大学出版社12publicclassQueryResultT{privateListTresultSet;privatelongtotalRecord;publicListTgetResultSet(){returnresultSet;}publicvoidsetResultSet(ListTresultSet){this.resultSet=resultSet;}publiclonggetTotalRecord(){returntotal