楊 帆,沈來信,2
(1.黃山學(xué)院 信息工程學(xué)院, 安徽 黃山245041;2.同濟(jì)大學(xué) 電子與信息工程學(xué)院, 上海201804)
在軟件工程教學(xué)過程中,以案例驅(qū)動展開教學(xué),以規(guī)范的軟件開發(fā)過程為引導(dǎo),包括軟件的需求分析、總體設(shè)計與詳細(xì)設(shè)計、系統(tǒng)編碼與實現(xiàn)、系統(tǒng)測試與維護(hù)等,注重培養(yǎng)學(xué)生熟練掌握軟件工程過程中所使用到的技術(shù)、方法和工具,可以促進(jìn)學(xué)生軟件開發(fā)能力培養(yǎng)和現(xiàn)代最新技術(shù)的掌握能力。
隨著移動設(shè)備、互聯(lián)網(wǎng)絡(luò)的發(fā)展,基于網(wǎng)絡(luò)支付的網(wǎng)上購物平臺應(yīng)用越來越廣泛。平臺可以提供方便、可靠和實惠的服務(wù),用戶有了更多的選擇機(jī)會,提高了購物形式的多樣性,促進(jìn)了消費。
購物網(wǎng)站設(shè)計既要注重功能性,分類豐富準(zhǔn)確、方便用戶瀏覽、查詢和購物,又要注重性能需求,快速、準(zhǔn)確的響應(yīng)是吸引用戶的關(guān)鍵,同時系統(tǒng)要具有良好的接口,如支付接口要求安全性很高,物流查詢接口要求準(zhǔn)確、及時、方便等。
購物系統(tǒng)采用MVC架構(gòu)實現(xiàn)[1-5],一般分為3部分:前臺頁面顯示層(View,頁面視圖顯示與響應(yīng))、后臺業(yè)務(wù)管理層(Controller,業(yè)務(wù)邏輯實現(xiàn))和數(shù)據(jù)庫管理層(Model,數(shù)據(jù)層與數(shù)據(jù)持久層)。前臺頁面顯示層是用戶可以瀏覽和響應(yīng)的到web頁面,包括商品分類、商品介紹、商品查詢、商品訂購、購物車、訂單提交、在線支付等功能;后臺業(yè)務(wù)管理層主要負(fù)責(zé)將客戶端提交信息與數(shù)據(jù)庫層和數(shù)據(jù)核心處理層連接,進(jìn)行數(shù)據(jù)處理和存儲,主要包括欄目管理(增加、刪除與修改,以下類似)、商品管理、用戶管理、員工管理、權(quán)限管理和部門管理等。數(shù)據(jù)庫管理層主要管理具體的數(shù)據(jù)庫表操作,接受管理層業(yè)務(wù)請求,完成具體的數(shù)據(jù)讀出與寫入等。
SS2H為Spring+Struts2+Hibernate集成框架[6-10],其中Struts負(fù)責(zé)Web頁面層實現(xiàn),Spring負(fù)責(zé)業(yè)務(wù)邏輯層實現(xiàn),Hibernate負(fù)責(zé)數(shù)據(jù)管理層實現(xiàn),分層實現(xiàn),結(jié)構(gòu)清晰,三層可以獨立開發(fā)。以XML文件為核心配置文件,配置靈活,方便修改,提高了系統(tǒng)的可復(fù)用性、可擴(kuò)展性和可修改性。
按照標(biāo)準(zhǔn)軟件工程開發(fā)過程,包括系統(tǒng)需求分析、系統(tǒng)設(shè)計、編碼實現(xiàn)、系統(tǒng)測試等,下面依次對每個環(huán)節(jié)主要部分加以說明。
主要包括系統(tǒng)的功能需求、性能需求和接口需求。功能需求主要包括3個部分:
1.頁面視圖部分:用戶通過瀏覽器訪問,展現(xiàn)給用戶UI界面,要求設(shè)計簡潔,樣式統(tǒng)一,使用方便,能夠吸引用戶,響應(yīng)迅速,與其他系統(tǒng)的接口使用方便,便于查詢、瀏覽和購物等。
2.數(shù)據(jù)庫數(shù)據(jù):存儲的網(wǎng)站相關(guān)信息數(shù)據(jù),比如產(chǎn)品信息,用戶信息,管理員信息等。系統(tǒng)的數(shù)據(jù)庫數(shù)據(jù)主要來源于后臺數(shù)據(jù)中心,該數(shù)據(jù)由管理員或者有產(chǎn)品添加權(quán)限的員工統(tǒng)一添加管理;產(chǎn)品添加成功后先寫入數(shù)據(jù)庫,然后顯示給會員和游客瀏覽,必須注冊會員后才可以購買產(chǎn)品。數(shù)據(jù)庫是產(chǎn)品模塊和前臺頁面的核心點。
3.數(shù)據(jù)核心處理部分:包括商品分類管理、商品管理、用戶管理、購物車管理、訂單管理、物流管理等,在后臺管理中對這些信息進(jìn)行增加、刪除與修改操作,把更新后的數(shù)據(jù)寫入到數(shù)據(jù)庫中,前臺頁面將從數(shù)據(jù)庫中讀取最新的分類信息、商品信息等,系統(tǒng)整體架構(gòu)如圖1所示。
圖1 系統(tǒng)總體架構(gòu)
主要對系統(tǒng)的功能需求、性能需求和接口需求進(jìn)行模塊劃分,模塊劃分講究適當(dāng)原則,一般劃分?jǐn)?shù)為3-7個為宜,設(shè)計每個子模塊的功能以及模塊之間接口等,每個子模塊要求獨立性強(qiáng),便于并行開發(fā)。設(shè)計每個子模塊的流程圖或順序圖,便于后期的編碼實現(xiàn)。我們以購物車模塊開發(fā)為例說明。
1.購物車模塊
主要處理用戶購買商品、購物車、生成訂單、訂單生成、發(fā)貨等。購物車流程如圖2所示。
圖2 購物車流程
注冊后的會員將商品加入購物車后,填寫地址、聯(lián)系方式、付款方式等相關(guān)信息。后臺管理員審核訂單信息、配貨、發(fā)貨、確認(rèn)收貨、確認(rèn)收款等。
2.數(shù)據(jù)庫設(shè)計
根據(jù)SS2H框架的創(chuàng)建JPA實體和創(chuàng)建Java類,沒有任何限制,只需要使用javax.persistence.Entity注明,JPA的設(shè)計是基于非侵入性的原則,容易與其他框架進(jìn)行整合。
JPA能夠支持面向?qū)ο蟮奶匦裕珙惖募?,多態(tài)和類之間的復(fù)雜關(guān)系之間的繼承,這種支持使開發(fā)人員能夠最大限度地利用面向?qū)ο蟮哪P驮O(shè)計企業(yè)應(yīng)用,不需要程序員去思考這些在關(guān)系數(shù)據(jù)庫持久化功能。
訂單表order存儲用戶下的訂單,及其后臺管理員操作訂單的流轉(zhuǎn),各字段分別為:ordered為訂單號,createDate為訂單創(chuàng)建時間,deliverFee為配送費,paymentWay是支付方式,paymentstate是訂單配送信息,payablefee為應(yīng)付款,lockuser 是對訂單進(jìn)行加鎖的用戶,值為null代表訂單未被加鎖,否則訂單被加鎖,contact_id是存儲聯(lián)系人的主鍵id,deliver_id是存儲配送信息的主鍵id等。其他表如訂單的訂購者信息表ordercontactinfo、管理員admin表、商品表、分類表等不再一一介紹。
3.JPA配置
數(shù)據(jù)庫操縱交給JPA (Java Persistence API)管理,JPA框架中支持大數(shù)據(jù)集、事務(wù)、并發(fā)等容器級事務(wù),配置persistence.xml為控制臺輸出數(shù)據(jù)庫語句,以及對Jdbc操作控制等,配置如下所示:
<provider >org.hibernate.ejb.HibernatePersistence </provider>
<properties><! --配置Hibernate-->
<property name="hibernate.dialect" value="org.hibernate.dialect.Mysql5Dialect"/>
<! --設(shè)置外連接抓取樹的最大深度-->
<property name="hibernate.max_fetch_depth" value="3"/>
<! --加載hibernate自動更新數(shù)據(jù)庫結(jié)構(gòu)-->
<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"/>
<! --是否輸出數(shù)據(jù)庫語句-->
<property name="hibernate.show_sql" value="false"/>
</properties>
配置數(shù)據(jù)的賬戶密碼,數(shù)據(jù)庫連接池,緩沖池,最大連接數(shù)等。數(shù)據(jù)庫鏈接如下:
<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>
使用數(shù)據(jù)源和指定persistence.xml位置的方式創(chuàng)建entityManagerFactory,如果使用的不是hibernate JPA實現(xiàn),需要在tomcat作一些特殊配置。
Hibernate配置文件通過entity注解這樣就可以映射到數(shù)據(jù)庫表中,生成相應(yīng)實體類的表結(jié)構(gòu),上面的配置就會生成message這樣表,字段是message屬性的名字一一對應(yīng),如下所示:
@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;}
}
.../*每個屬性對應(yīng)一個get和set方法*/
獲取EntityManager實例,EntityManager是用來對實體Bean進(jìn)行操作的輔助類、可以實體Bean進(jìn)行clear(分離所有當(dāng)前正在被管理的實體)、remove(刪除對象)、find (查找bean, 若實體Bean不存在return null)、persist(添加實體Bean)等一些提供對數(shù)據(jù)庫的基礎(chǔ)操作,還擴(kuò)充了createQuery執(zhí)行Sql語句,可以很方便操作數(shù)據(jù)庫。
主要針對系統(tǒng)設(shè)計中的模塊進(jìn)行編碼實現(xiàn),每個模塊對應(yīng)一個或多個類,便于重復(fù)調(diào)用使用,提高系統(tǒng)的可擴(kuò)展性。我們以購物車實現(xiàn)為例,加以說明。
購物車采用Session記錄數(shù)據(jù),由類(BuyCart)request.getSession().getAttribute("buyCart")進(jìn)行購物車數(shù)據(jù)讀取,讀取用戶本地數(shù)據(jù)。在會員登錄的時候獲取request將購物車的數(shù)據(jù)寫入本地,這樣可以減輕服務(wù)器的負(fù)擔(dān),提高服務(wù)器的性能。
購物車中可以刪除商品,更改商品數(shù)量,更新購買商品。填寫用戶信息和選擇支付方式等流程節(jié)點的時候,可以退回上一個流程節(jié)點,修改確認(rèn)后可以直接返回修改的節(jié)點。(采用了當(dāng)前URL返回狀態(tài)記錄在BuyCartForm模型中的directUrl,當(dāng)鏈接跳轉(zhuǎn)時候首頁獲取directUrl 值如果有直接跳轉(zhuǎn)到directUrl所指向的頁面; 需要對url進(jìn)行Base64加密處理以防泄露用戶詳細(xì)信息)
1.JPA配置與實現(xiàn)
本系統(tǒng)中就使用了Spring+Hibernate3 (JPA)+compass與paoding分詞器進(jìn)行商品搜索管理。使用Lucene進(jìn)行搜索,能夠在JSP搜索結(jié)果頁面,高亮顯示檢索內(nèi)容而且把匹配度高的相關(guān)數(shù)據(jù)拍在最前面,比數(shù)據(jù)中的like搜索性能要高效果更直觀。
配置compass檢索entity映射的實體,建立索引的存儲空間為了優(yōu)化搜素速度可以將索引建立在內(nèi)存中,但是考慮到高并發(fā)量的問題,把索引建立在外存中相對而言比較好。
將compass與paoding分詞結(jié)合,提高商品搜索的性能。配置compass操作bean交給spring統(tǒng)一管理(索引的添加/更新/刪除操作)。
采用配置entity搜索實體注解方式開發(fā), 該實體跟索引的document進(jìn)行映射,提高代碼低耦合高內(nèi)聚。
設(shè)置最大檢索條數(shù),和檢索關(guān)鍵詞的高亮顯示執(zhí)行compassTemplate.execute (new QueryCallback(String keyword, String firstResult, String maxResult))開始搜索。
Compass架包高效率管理索引建立過程,借助lucene建立索引的過程是自己用JDBC跑SQL獲得ResultSet,遍 歷ResultSet 建 立Document 對 象 并 用IndexWriter寫入文件目錄。
在ApplicationContext.xml定義了Compass與Spring的集成,配置參數(shù),并讓GPS隨ApplicationContext啟動開始監(jiān)控Hibernate的DataChange。
2.購物車實現(xiàn)
購物車類包含有:購物項,收貨人配送信息,訂購者聯(lián)系信息,收獲地址,支付方式,配送費用,留言等信息。
獲取用戶本地的cookie中購物車的數(shù)據(jù),初始化購物車,當(dāng)將物品添加到購物車或者更新購物車數(shù)據(jù)時,服務(wù)器將這些數(shù)據(jù)以cookie的形式寫入瀏覽器中,保存在用戶本地。設(shè)定有效的cookie保存時間,過期后自動清空購物車數(shù)據(jù)。
3.系統(tǒng)管理權(quán)限的設(shè)計
使用3種方式完成系統(tǒng)的權(quán)限設(shè)計。
a.使用JSP的filter過濾器進(jìn)行粗粒度管理。取出session中的員工信息,判斷是否有該頁面路徑的訪問權(quán)限,如果有正常瀏覽該頁面,如果沒有跳轉(zhuǎn)到登錄頁面。
b.通過struts2自帶的權(quán)限的攔截進(jìn)行細(xì)粒度管理
第一步:配置struts2中的默認(rèn)攔截器
<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>
添加自己新建的攔截器作為第一個過濾器。
第二步:自主開發(fā)一個攔截器,通過HttpServletRequest對象的getRequest()方法獲得請求命令,判斷是否以"/control" 開始,如果是再判斷是否有效,即validate(action.getClass(),methodName,request),如 果返回True,則有效,否則無效。
通過注解Action層中的執(zhí)行方法。在配置相應(yīng)的權(quán)限,在攔截器中首頁獲取到該方法執(zhí)行時需要的權(quán)限,在獲取該管理員所擁有的權(quán)限進(jìn)行比較,如果有正常執(zhí)行,如果無提示沒有該操作權(quán)限。
c.使用自定義jstl控制view層
應(yīng)用JSTL標(biāo)簽檢測view頁面上是否有相應(yīng)的標(biāo)簽顯示,如果沒有對應(yīng)管理權(quán)限,則不顯示在對應(yīng)的頁面上,由此可以實現(xiàn)對沒有權(quán)限的用戶的不可見控制。
JSP前臺頁面調(diào)用方法如下所示:
<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種權(quán)限的管理,就可以有效的管理整個網(wǎng)站后臺的權(quán)限。
系統(tǒng)測試主要是根據(jù)需求分析產(chǎn)生的需求規(guī)格說明書,對系統(tǒng)的功能、性能和接口進(jìn)行測試,如系統(tǒng)響應(yīng)時間、查詢結(jié)果的準(zhǔn)確性、購物流程的合理性、訂單交付的安全性、用戶信息的保密性等,同時還要開啟很多個客戶端進(jìn)行頁面壓力測試、測試系統(tǒng)的吞吐量等。
通過規(guī)范的軟件工程過程實現(xiàn),可以熟知軟件開發(fā)流程,熟練掌握每個環(huán)節(jié)使用的技術(shù)、方法和工具,可以培養(yǎng)學(xué)生的規(guī)范軟件開發(fā)能力,同時掌握最新的技術(shù),SS2H框架是目前比較流行的開發(fā)架構(gòu),具有很好的可擴(kuò)展性、可重用性、可維護(hù)性等,基于SS2H框架的標(biāo)準(zhǔn)軟件開發(fā)過程具有一定的示范作用,對學(xué)生的軟件開發(fā)能力具有很好的提高作用。
[1]王瑾,王鑫.基于SSH框架下的校園網(wǎng)上交易平臺[D].北京:電子科技大學(xué)碩士學(xué)位論文,2014.
[2]師溫馨.基于SSH框架的電子商務(wù)購物網(wǎng)站的研究與設(shè)計[J],電子測試,2014(8):10-12.
[3]張曉孿.基于SSH的團(tuán)購網(wǎng)站的設(shè)計與實現(xiàn)[J].電子設(shè)計工程,2012,20(21):122-125.
[4]米奕杭,袁丁.基于SSH框架的網(wǎng)絡(luò)購物電子商務(wù)平臺的設(shè)計與實現(xiàn)[D].成都:四川師范大學(xué)碩士學(xué)位論文,2010.
[5]謝曉燕,武友新.基于信息發(fā)布平臺的網(wǎng)上購物系統(tǒng)的設(shè)計與實現(xiàn)[D].南昌:南昌大學(xué)碩士學(xué)位論文,2011.
[6]張建浩,騰桂法.基于SSH框架的網(wǎng)上訂餐系統(tǒng)的設(shè)計與實現(xiàn)[D].石家莊:河北農(nóng)業(yè)大學(xué)碩士學(xué)位論文,2013.
[7]于湛麟,李仲秋,任永昌.SSH框架實現(xiàn)MVC架構(gòu)的電子商務(wù)軟件平臺[J].計算機(jī)技術(shù)與發(fā)展,2012,22(10):169-172.
[8]龔尚福,龔琴,馮健.基于SSH框架的EPON性能管理系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機(jī)應(yīng)用,2013,33(2):571-574.
[9]徐黎明,李志蜀,宋飛.基于SSH和ExtJSP的Web應(yīng)用框架的設(shè)計與實現(xiàn)[J].數(shù)字技術(shù)與應(yīng)用,2010(4):14-17.
[10]林萍.基于SSH+DWR的高??蒲泄芾硐到y(tǒng)研究與實現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2011,31(7):66-68.
[11]張建軍,劉虎,倪芳英.基于SSH與High charts整合架構(gòu)的Web應(yīng)用研究[J].計算機(jī)技術(shù)與發(fā)展,2013,23(9):245-251.