楊 帆,沈來信,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.