杨 帆,沈来信,2
(1.黄山学院 信息工程学院, 安徽 黄山245041;2.同济大学 电子与信息工程学院, 上海201804)
在软件工程教学过程中,以案例驱动展开教学,以规范的软件开发过程为引导,包括软件的需求分析、总体设计与详细设计、系统编码与实现、系统测试与维护等,注重培养学生熟练掌握软件工程过程中所使用到的技术、方法和工具,可以促进学生软件开发能力培养和现代最新技术的掌握能力。
随着移动设备、互联网络的发展,基于网络支付的网上购物平台应用越来越广泛。平台可以提供方便、可靠和实惠的服务,用户有了更多的选择机会,提高了购物形式的多样性,促进了消费。
购物网站设计既要注重功能性,分类丰富准确、方便用户浏览、查询和购物,又要注重性能需求,快速、准确的响应是吸引用户的关键,同时系统要具有良好的接口,如支付接口要求安全性很高,物流查询接口要求准确、及时、方便等。
购物系统采用MVC架构实现[1-5],一般分为3部分:前台页面显示层(View,页面视图显示与响应)、后台业务管理层(Controller,业务逻辑实现)和数据库管理层(Model,数据层与数据持久层)。前台页面显示层是用户可以浏览和响应的到web页面,包括商品分类、商品介绍、商品查询、商品订购、购物车、订单提交、在线支付等功能;后台业务管理层主要负责将客户端提交信息与数据库层和数据核心处理层连接,进行数据处理和存储,主要包括栏目管理(增加、删除与修改,以下类似)、商品管理、用户管理、员工管理、权限管理和部门管理等。数据库管理层主要管理具体的数据库表操作,接受管理层业务请求,完成具体的数据读出与写入等。
SS2H为Spring+Struts2+Hibernate集成框架[6-10],其中Struts负责Web页面层实现,Spring负责业务逻辑层实现,Hibernate负责数据管理层实现,分层实现,结构清晰,三层可以独立开发。以XML文件为核心配置文件,配置灵活,方便修改,提高了系统的可复用性、可扩展性和可修改性。
按照标准软件工程开发过程,包括系统需求分析、系统设计、编码实现、系统测试等,下面依次对每个环节主要部分加以说明。
主要包括系统的功能需求、性能需求和接口需求。功能需求主要包括3个部分:
1.页面视图部分:用户通过浏览器访问,展现给用户UI界面,要求设计简洁,样式统一,使用方便,能够吸引用户,响应迅速,与其他系统的接口使用方便,便于查询、浏览和购物等。
2.数据库数据:存储的网站相关信息数据,比如产品信息,用户信息,管理员信息等。系统的数据库数据主要来源于后台数据中心,该数据由管理员或者有产品添加权限的员工统一添加管理;产品添加成功后先写入数据库,然后显示给会员和游客浏览,必须注册会员后才可以购买产品。数据库是产品模块和前台页面的核心点。
3.数据核心处理部分:包括商品分类管理、商品管理、用户管理、购物车管理、订单管理、物流管理等,在后台管理中对这些信息进行增加、删除与修改操作,把更新后的数据写入到数据库中,前台页面将从数据库中读取最新的分类信息、商品信息等,系统整体架构如图1所示。
图1 系统总体架构
主要对系统的功能需求、性能需求和接口需求进行模块划分,模块划分讲究适当原则,一般划分数为3-7个为宜,设计每个子模块的功能以及模块之间接口等,每个子模块要求独立性强,便于并行开发。设计每个子模块的流程图或顺序图,便于后期的编码实现。我们以购物车模块开发为例说明。
1.购物车模块
主要处理用户购买商品、购物车、生成订单、订单生成、发货等。购物车流程如图2所示。
图2 购物车流程
注册后的会员将商品加入购物车后,填写地址、联系方式、付款方式等相关信息。后台管理员审核订单信息、配货、发货、确认收货、确认收款等。
2.数据库设计
根据SS2H框架的创建JPA实体和创建Java类,没有任何限制,只需要使用javax.persistence.Entity注明,JPA的设计是基于非侵入性的原则,容易与其他框架进行整合。
JPA能够支持面向对象的特性,如类的集成,多态和类之间的复杂关系之间的继承,这种支持使开发人员能够最大限度地利用面向对象的模型设计企业应用,不需要程序员去思考这些在关系数据库持久化功能。
订单表order存储用户下的订单,及其后台管理员操作订单的流转,各字段分别为:ordered为订单号,createDate为订单创建时间,deliverFee为配送费,paymentWay是支付方式,paymentstate是订单配送信息,payablefee为应付款,lockuser 是对订单进行加锁的用户,值为null代表订单未被加锁,否则订单被加锁,contact_id是存储联系人的主键id,deliver_id是存储配送信息的主键id等。其他表如订单的订购者信息表ordercontactinfo、管理员admin表、商品表、分类表等不再一一介绍。
3.JPA配置
数据库操纵交给JPA (Java Persistence API)管理,JPA框架中支持大数据集、事务、并发等容器级事务,配置persistence.xml为控制台输出数据库语句,以及对Jdbc操作控制等,配置如下所示:
<provider >org.hibernate.ejb.HibernatePersistence </provider>
<properties><! --配置Hibernate-->
<property name="hibernate.dialect" value="org.hibernate.dialect.Mysql5Dialect"/>
<! --设置外连接抓取树的最大深度-->
<property name="hibernate.max_fetch_depth" value="3"/>
<! --加载hibernate自动更新数据库结构-->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<! --JDBC获取量大小-->
<property name="hibernate.jdbc.fetch_size" value="18"/>
<! --开启Hibernate批量更新-->
<property name="hibernate.jdbc.batch_size" value="10"/>
<! --是否输出数据库语句-->
<property name="hibernate.show_sql" value="false"/>
</properties>
配置数据的账户密码,数据库连接池,缓冲池,最大连接数等。数据库链接如下:
<bean id="dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driveClass" value="${driverClass}"/><property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
<property name="initialPoolSize" value="1"/>
<property name="minPoolSize" value="1"/>
<property name="maxPoolSize" value="300"/>
<property name="acquireIncrement" value="5"/>
<property name="idleConnectionTestPeriod" value="60"/>
</bean>
使用数据源和指定persistence.xml位置的方式创建entityManagerFactory,如果使用的不是hibernate JPA实现,需要在tomcat作一些特殊配置。
Hibernate配置文件通过entity注解这样就可以映射到数据库表中,生成相应实体类的表结构,上面的配置就会生成message这样表,字段是message属性的名字一一对应,如下所示:
@Entity /*客服留言*/
public class Message{
private Integer id;
private String content;
private Date createtime=new Date();
private String username;
private Order order;
public Integer getId(){ return id;}
public Integer setId(id){this.id=id;}
}
.../*每个属性对应一个get和set方法*/
获取EntityManager实例,EntityManager是用来对实体Bean进行操作的辅助类、可以实体Bean进行clear(分离所有当前正在被管理的实体)、remove(删除对象)、find (查找bean, 若实体Bean不存在return null)、persist(添加实体Bean)等一些提供对数据库的基础操作,还扩充了createQuery执行Sql语句,可以很方便操作数据库。
主要针对系统设计中的模块进行编码实现,每个模块对应一个或多个类,便于重复调用使用,提高系统的可扩展性。我们以购物车实现为例,加以说明。
购物车采用Session记录数据,由类(BuyCart)request.getSession().getAttribute("buyCart")进行购物车数据读取,读取用户本地数据。在会员登录的时候获取request将购物车的数据写入本地,这样可以减轻服务器的负担,提高服务器的性能。
购物车中可以删除商品,更改商品数量,更新购买商品。填写用户信息和选择支付方式等流程节点的时候,可以退回上一个流程节点,修改确认后可以直接返回修改的节点。(采用了当前URL返回状态记录在BuyCartForm模型中的directUrl,当链接跳转时候首页获取directUrl 值如果有直接跳转到directUrl所指向的页面; 需要对url进行Base64加密处理以防泄露用户详细信息)
1.JPA配置与实现
本系统中就使用了Spring+Hibernate3 (JPA)+compass与paoding分词器进行商品搜索管理。使用Lucene进行搜索,能够在JSP搜索结果页面,高亮显示检索内容而且把匹配度高的相关数据拍在最前面,比数据中的like搜索性能要高效果更直观。
配置compass检索entity映射的实体,建立索引的存储空间为了优化搜素速度可以将索引建立在内存中,但是考虑到高并发量的问题,把索引建立在外存中相对而言比较好。
将compass与paoding分词结合,提高商品搜索的性能。配置compass操作bean交给spring统一管理(索引的添加/更新/删除操作)。
采用配置entity搜索实体注解方式开发, 该实体跟索引的document进行映射,提高代码低耦合高内聚。
设置最大检索条数,和检索关键词的高亮显示执行compassTemplate.execute (new QueryCallback(String keyword, String firstResult, String maxResult))开始搜索。
Compass架包高效率管理索引建立过程,借助lucene建立索引的过程是自己用JDBC跑SQL获得ResultSet,遍 历ResultSet 建 立Document 对 象 并 用IndexWriter写入文件目录。
在ApplicationContext.xml定义了Compass与Spring的集成,配置参数,并让GPS随ApplicationContext启动开始监控Hibernate的DataChange。
2.购物车实现
购物车类包含有:购物项,收货人配送信息,订购者联系信息,收获地址,支付方式,配送费用,留言等信息。
获取用户本地的cookie中购物车的数据,初始化购物车,当将物品添加到购物车或者更新购物车数据时,服务器将这些数据以cookie的形式写入浏览器中,保存在用户本地。设定有效的cookie保存时间,过期后自动清空购物车数据。
3.系统管理权限的设计
使用3种方式完成系统的权限设计。
a.使用JSP的filter过滤器进行粗粒度管理。取出session中的员工信息,判断是否有该页面路径的访问权限,如果有正常浏览该页面,如果没有跳转到登录页面。
b.通过struts2自带的权限的拦截进行细粒度管理
第一步:配置struts2中的默认拦截器
<interceptor name="permission" class="cn.bamboo.web.action
.privilege.PermissionInterceptor"/>
<interceptor-stack name="employeePermissionStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="permission"/>
</interceptor-stack>
</interceptors>
<default -interceptor -ref name = "employeePermission-Stack"/>
<global-results>
<result name="message">
/WEB-INF/page/share/message.jsp</result>
<result name="directUrl">
/WEB-INF/page/share/directUrl.jsp</result>
</global-results>
添加自己新建的拦截器作为第一个过滤器。
第二步:自主开发一个拦截器,通过HttpServletRequest对象的getRequest()方法获得请求命令,判断是否以"/control" 开始,如果是再判断是否有效,即validate(action.getClass(),methodName,request),如 果返回True,则有效,否则无效。
通过注解Action层中的执行方法。在配置相应的权限,在拦截器中首页获取到该方法执行时需要的权限,在获取该管理员所拥有的权限进行比较,如果有正常执行,如果无提示没有该操作权限。
c.使用自定义jstl控制view层
应用JSTL标签检测view页面上是否有相应的标签显示,如果没有对应管理权限,则不显示在对应的页面上,由此可以实现对没有权限的用户的不可见控制。
JSP前台页面调用方法如下所示:
<bamboo:permission privilege="visible" module="product">
<input name="visible" type="button"
<c:if test="${fn:length(
pageView.records)<1}">disabled="disabled"</c:if>
class="frm_btn" onClick="javascript:
actionEvent('visible')" value="上架">  
<input name = "disable" type = "button" class = "frm_btn"
<c:if test="${fn:length(
pageView.records)<1}">disabled="disabled"</c:if>
onClick="javascript:actionEvent('disable')"
value="下架">
</bamboo:permission>
通过3种权限的管理,就可以有效的管理整个网站后台的权限。
系统测试主要是根据需求分析产生的需求规格说明书,对系统的功能、性能和接口进行测试,如系统响应时间、查询结果的准确性、购物流程的合理性、订单交付的安全性、用户信息的保密性等,同时还要开启很多个客户端进行页面压力测试、测试系统的吞吐量等。
通过规范的软件工程过程实现,可以熟知软件开发流程,熟练掌握每个环节使用的技术、方法和工具,可以培养学生的规范软件开发能力,同时掌握最新的技术,SS2H框架是目前比较流行的开发架构,具有很好的可扩展性、可重用性、可维护性等,基于SS2H框架的标准软件开发过程具有一定的示范作用,对学生的软件开发能力具有很好的提高作用。
[1]王瑾,王鑫.基于SSH框架下的校园网上交易平台[D].北京:电子科技大学硕士学位论文,2014.
[2]师温馨.基于SSH框架的电子商务购物网站的研究与设计[J],电子测试,2014(8):10-12.
[3]张晓孪.基于SSH的团购网站的设计与实现[J].电子设计工程,2012,20(21):122-125.
[4]米奕杭,袁丁.基于SSH框架的网络购物电子商务平台的设计与实现[D].成都:四川师范大学硕士学位论文,2010.
[5]谢晓燕,武友新.基于信息发布平台的网上购物系统的设计与实现[D].南昌:南昌大学硕士学位论文,2011.
[6]张建浩,腾桂法.基于SSH框架的网上订餐系统的设计与实现[D].石家庄:河北农业大学硕士学位论文,2013.
[7]于湛麟,李仲秋,任永昌.SSH框架实现MVC架构的电子商务软件平台[J].计算机技术与发展,2012,22(10):169-172.
[8]龚尚福,龚琴,冯健.基于SSH框架的EPON性能管理系统的设计与实现[J].计算机应用,2013,33(2):571-574.
[9]徐黎明,李志蜀,宋飞.基于SSH和ExtJSP的Web应用框架的设计与实现[J].数字技术与应用,2010(4):14-17.
[10]林萍.基于SSH+DWR的高校科研管理系统研究与实现[J].计算机应用与软件,2011,31(7):66-68.
[11]张建军,刘虎,倪芳英.基于SSH与High charts整合架构的Web应用研究[J].计算机技术与发展,2013,23(9):245-251.