朱運(yùn)喬
摘要:首先對Spring+SpringMVC+hibernate框架模型作了簡單介紹,對其結(jié)構(gòu)組成和基本工作原理進(jìn)行了簡要分析。然后以一個(gè)商品出庫系統(tǒng)模塊的為例,展示了如何使用Spring+SpringMVC+hibernate框架搭建層次清晰的程序結(jié)構(gòu)。并給出了商品出庫模塊在該框架下的功能實(shí)現(xiàn)和關(guān)鍵代碼。
關(guān)鍵詞:Spring;SpringMVC;hibernate;Web系統(tǒng);功能實(shí)現(xiàn)
中圖分類號:TP311.52 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)26-0066-03
1 概述
當(dāng)前,JavaWeb開發(fā)技術(shù)繁多,但為開發(fā)團(tuán)隊(duì)選擇一款優(yōu)秀的框架非常重要,一個(gè)好的框架決定了開發(fā)團(tuán)隊(duì)的軟件開發(fā)周期、開發(fā)成本、維護(hù)成本甚至于軟件的生命周期。在選擇一個(gè)可行的方案時(shí),一般要從穩(wěn)定成熟性、可擴(kuò)展性及靈活等多方面綜合考慮。本文將以一個(gè)商品出庫模塊為例,詳細(xì)介紹由Spring、SpringMVC、hibernate幾種技術(shù)構(gòu)成的軟件架構(gòu)的搭建技術(shù)要點(diǎn)和以此為平臺的功能模塊實(shí)現(xiàn)過程。
2 Spring+SpringMVC+hibernate技術(shù)架構(gòu)
Spring+SpringMVC+hibernate不同于之前流行的Spring+struts2+hibernate(ssh2)技術(shù)架構(gòu),該架構(gòu)是將后者最重要的前端控制部分struts2(mvc)替換成用SpringMVC,同時(shí)將Spring和hibernate多種開源技術(shù)有機(jī)結(jié)合在一起,從而構(gòu)建出一個(gè)健壯可靠、高效成熟的JavaWeb應(yīng)用程序技術(shù)架構(gòu)。
2.1 SpringMVC簡介
SpringMVC是當(dāng)前非常流行的一種MVC框架,而MVC是我們開發(fā)WEB應(yīng)用程序的通用框架,MVC的核心思想是業(yè)務(wù)邏輯和業(yè)務(wù)數(shù)據(jù)呈現(xiàn)相分離,使程序分層、分工合作,既相互獨(dú)立,又協(xié)同合作。其中:
M(Model):業(yè)務(wù)邏輯的描述和業(yè)務(wù)數(shù)據(jù)的信息表示。
V(View):為用戶呈現(xiàn)數(shù)據(jù)的頁面。
C(Controller):調(diào)用模型層(Model)的業(yè)務(wù)邏輯產(chǎn)生合適的數(shù)據(jù)模型,同時(shí)傳遞數(shù)據(jù)模型給視圖層(View)呈現(xiàn)給用戶。
Spring MVC是一個(gè)設(shè)計(jì)優(yōu)良的MVC框架,是Spring下的一個(gè)開源項(xiàng)目,可以跟Spring無縫接合,自從Spring 2.5版本發(fā)布后,由于支持注解配置,易用性有了大幅度的提高,實(shí)現(xiàn)了對Struts 2的超越?,F(xiàn)在越來越多的開發(fā)團(tuán)隊(duì)選擇了Spring MVC。
2.2 Hibernater的作用
Hibernate是一個(gè)開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝,它將POJO與數(shù)據(jù)庫表建立映射關(guān)系,是一個(gè)全自動的orm框架,hibernate可以自動生成SQL語句,自動執(zhí)行,使得Java程序員可以使用對象編程思維來操縱數(shù)據(jù)庫。
2.3 Spring框架的作用
Spring框架是系統(tǒng)的核心部分,系統(tǒng)各部分的整合由它來完成。Spring提供的Ioc容器是業(yè)務(wù)邏輯組件和DAO組件的工廠,它負(fù)責(zé)生成并管理這些實(shí)例。
借助于Spring的依賴注入,各組件以松耦合的方式組合在一起,組件與組件之間的依賴正是通過Spring的依賴注入管理的。其Service組件和DAO對象都采用面向接口編程方式,從而降低了系統(tǒng)重構(gòu)的成本,極好地提高了系統(tǒng)的可維護(hù)性、可擴(kuò)充性。
事務(wù)管理采用Spring的聲明式事務(wù)框架,通過聲明式事務(wù),而只需要容器中加以配置,在業(yè)務(wù)邏輯層中加上相應(yīng)的注解即可,使業(yè)務(wù)組件只專注于業(yè)務(wù)本身,從而簡化了開發(fā)。
一個(gè)典型的使用了Spring+SpringMVC+hibernate架構(gòu)的應(yīng)用,其結(jié)構(gòu)如下圖所示。
由圖所示,SpringMVC實(shí)現(xiàn)整體結(jié)構(gòu)及前端控制,Hibernate主要負(fù)責(zé)數(shù)據(jù)訪問,Spring負(fù)責(zé)將各大組件粘合在一起組成一個(gè)完整的軟件架構(gòu)。
3 系統(tǒng)實(shí)現(xiàn)
下面以一個(gè)商品出庫模塊為例來展現(xiàn)Spring+SpringMVC+hibernates架構(gòu)的具體設(shè)計(jì)與實(shí)現(xiàn)。
3.1 功能描述
商品出庫模塊首先由商品出庫界面(outwarehouse.jsp)提交出庫表單請求(/outwarehouse)到控制器,請求方法根據(jù)出庫表單數(shù)據(jù)調(diào)用業(yè)務(wù)邏輯層,由業(yè)務(wù)邏輯層返回的信息決定返回哪個(gè)視圖:如出庫失敗,返回error.jsp顯示出錯原因;如出庫成功,返回showResult.jsp頁面視圖,展示成功出庫的商品情況。通過showResult.jsp頁面可進(jìn)一步向控制器提交請求(/history),從而獲取所有商品的出庫歷史記錄。
3.2 數(shù)據(jù)庫設(shè)計(jì)
數(shù)據(jù)庫涉及到兩個(gè)表:商品表(ShopInfo),出庫歷史表(Storage)。
3.3 關(guān)鍵代碼
關(guān)鍵代碼涉及四個(gè)包:
bean包,主要包含有兩個(gè)ORM對象(ShopInfo.java、Storage.java)。
dao包,主要包含兩個(gè)DAO類(ShopInfoDAO.java、StorageDAO.java)。
service.impl包及子包,主要包含業(yè)務(wù)邏輯接口實(shí)現(xiàn)類(ShopInfoService.java、StorageService.java)。
controller包,主要包含控制器(OutwareHouseController.java)。
代碼實(shí)現(xiàn)過程中用了注解方式創(chuàng)建和注入javabean,下面主要展示主要代碼及相關(guān)注解。
1) ORM對象ShopInfo.java代碼及注解如下:
@Entity //實(shí)體注解說明
@Table(name="ShopInfo") //映射表
public class ShopInfo implements java.io.Serializable {
@Id //標(biāo)識列
@GeneratedValue(strategy=GenerationType.IDENTITY) //標(biāo)識值自動生成方式
private Integer id;
/*一對多關(guān)系注解*/
@OneToMany(cascade={CascadeType.ALL},mappedBy="shopInfo",fetch=FetchType.LAZY)
private Set
/*以下其它屬性定義*/
}
2) DAO類ShopInfoDAO.java關(guān)鍵代碼及注解如下:
@Repository //加載DAO類到spring容器注解
public class ShopInfoDAO {
@Autowired //自動裝配sesseionFactory
@Qualifier("sessionFactory")
privateSessionFactorysessionFactory;
/*以下CRUD方法定義*/
}
3) Service接口實(shí)現(xiàn)類(ShopInfoService.java)關(guān)鍵代碼及注解:
@Service //加載Service類到spring容器的注解
public class ShopInfoService implements IShopInfoService {
@Autowired //spring容器自動裝配shopInfoDAO
privateShopInfoDAOshopInfoDAO;
@Override
@Transactional //在業(yè)務(wù)方法實(shí)現(xiàn)加上事務(wù)管理注解
/*以下為業(yè)務(wù)方法定義,每個(gè)需要事務(wù)管理方法之前加@Transactional注解*/
}
4) 控制器類(OutWareHouseController.java)關(guān)鍵代碼及注解如下:
@Controller //加載Controller類到spring容器的注解
public class OutWareHouseController {
@Autowired //spring容器自動裝配shopInfoService
privateIShopInfoServiceshopInfoService;
@Autowired //spring容器自動裝配storageService
privateIStorageServicestorageService;
@RequestMapping(value="/outwarehouse") //出庫請求注解
public String outwarehouse(String shopId,intstorageQuantity,Model model){…}
@RequestMapping(value="/history") //顯示歷史記錄請求注解
public String history(Model model){…}
3.4 配置說明
配置正解如否至關(guān)重要,整個(gè)系統(tǒng)通過相關(guān)配置將各組件有機(jī)組織在一起。
1) web.xml主要配置
<!—加載spring容器—>
<!—配置springmvc前端控制器—>
<!— hibernate延遲(LAZY)加載問題的處理,因?yàn)樵陉P(guān)系映射中用到了延遲加載 —>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
2) spring容器配置文件applicationContext.xml
<!— spring可以自動去掃描base-pack下面的包或者子包下面的java文件,
如果掃描到有Spring的相關(guān)注解的類,則把這些類注冊為Spring的bean —>
<!—啟動事務(wù)注解的(@Transactional) —>
…
…
3) SpringMVC配置文件springmvc-config.xml
<!— spring可以自動去掃描controller包或者子包下面有的@Controller注解的類 —>
<!—啟動MVC相關(guān)注解 —>
<!—視圖解析器 —>
4 結(jié)束語
SpringMVC為JAVAWeb應(yīng)用提供優(yōu)了性能優(yōu)異的MVC框架,可擴(kuò)展性強(qiáng);Hibernate的ORM對JDBC進(jìn)行了精美封裝,極大地簡化了數(shù)據(jù)持久化操作,提高了編碼效率,加速了項(xiàng)目進(jìn)度;Spring的IoC和aop技術(shù),將各組件以松耦合的方式組合在了一起。三個(gè)子框架各司其職,完美結(jié)合。本文以一個(gè)商品出庫模塊為例,詳細(xì)地介紹了Spring+SpringMVC+hibernate架構(gòu)搭建的技術(shù)要點(diǎn)和主要實(shí)現(xiàn)過程,雖然是一個(gè)最小原型系統(tǒng),但是該框架擴(kuò)展性強(qiáng),易于維護(hù),結(jié)合實(shí)際的功能需求,分別在Controller層,Service層,持久層等各層面上擴(kuò)充添加相應(yīng)的組件,即可實(shí)現(xiàn)一個(gè)完整系統(tǒng)。
參考文獻(xiàn):
[1] 深入理解Spring MVC 思想[EB/OL]. [2014-07-31]. https://www.cnblogs.com/baiduligang/p/4247164.html.
[2] SpringMVC[EB/OL]. [2018-05-29]. https://blog.csdn.net/luciferlongxu/article/details/80460580.
[3] 何信,杜江,龐海艷.基于SSH2框架的Web系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 石家莊:統(tǒng)計(jì)與管理,2015(1):49-53.
[4] 瘋狂軟件.Spring MVC+MYBatis企業(yè)應(yīng)用實(shí)戰(zhàn)[M]. 北京:電子工業(yè)出版社,2017.
[通聯(lián)編輯:王力]