MVC對(duì)于我們來(lái)說(shuō),已經(jīng)不陌生了,它起源于20世紀(jì)80年代針對(duì)smalltalk語(yǔ)言的一種軟件設(shè)計(jì)模式,現(xiàn)在已被廣泛應(yīng)用。近年來(lái),隨著java的盛行,MVC的低耦合性、高重用性、可維護(hù)性、軟件工程的可管理性等諸多優(yōu)點(diǎn)使其在java平臺(tái)中很受歡迎,其間,也誕生了許多優(yōu)秀的MVC框架,如專(zhuān)注于控制層的Struts、WebWork, Struts2, JSF等框架,專(zhuān)注于業(yè)務(wù)邏輯方面的Spring框架、專(zhuān)注于持久層的Hibernate、iBatis、Castor、JORM等框架。由于最近用了一次SSI框架,因此本文主要是對(duì)Strtus2、Spring、iBatis三個(gè)開(kāi)源的MVC框架進(jìn)行一個(gè)小結(jié)。
Struts2主要來(lái)源于webwork框架,與Struts1相比,在數(shù)據(jù)傳遞方面,Struts2提供了更加強(qiáng)大OGNL標(biāo)簽功能,使其能夠通過(guò)在action中定義變量來(lái)直接與jsp頁(yè)面中的數(shù)據(jù)進(jìn)行相互傳值,省去了Struts1中的formbean;而在跳轉(zhuǎn)控制方面,Struts2簡(jiǎn)化了配置文件的信息量,使頁(yè)面和action之間的交換更加的簡(jiǎn)潔和直觀,便于開(kāi)發(fā)人員的管理。
Spring功能非常的強(qiáng)大,比如它的控制反轉(zhuǎn)/依賴(lài)注入機(jī)制,省去了我們自己書(shū)寫(xiě)工廠模式的工作,實(shí)現(xiàn)類(lèi)對(duì)我們將要用到控制類(lèi)、業(yè)務(wù)邏輯類(lèi)、數(shù)據(jù)訪問(wèn)類(lèi)、以及JNDI或者JDBC數(shù)據(jù)源的托管;Spring對(duì)AOP支持使我們?cè)谟脩?hù)chmod.html‘ target=’_blank‘》權(quán)限控制、事務(wù)處理方面節(jié)省了很多工作量;
iBatis則是一種輕量級(jí)的OR Mapping框架,與Hibernate相比,iBatis提供了半自動(dòng)化對(duì)象關(guān)系 映射的實(shí)現(xiàn),開(kāi)發(fā)人員需要編寫(xiě)具體的sql語(yǔ)句,為系統(tǒng)設(shè)計(jì)提供了更大的自由空間,為sql語(yǔ)句優(yōu)化提供了便利。
下面這張圖就是我們所用到的這三種框架的結(jié)合體,下面對(duì)其作以簡(jiǎn)單介紹。
在控制層,利用Strtus2標(biāo)簽功能,在Action中直接與jsp頁(yè)面上的數(shù)據(jù)進(jìn)行交互。在調(diào)用業(yè)務(wù)邏輯層應(yīng)用時(shí),Struts2提供了對(duì)Sping的支持。開(kāi)發(fā)人員需要完成對(duì)struts.xml的配置工作和對(duì)各個(gè)Action類(lèi)的編寫(xiě)。
在業(yè)務(wù)邏輯層,利用Spring框架的依賴(lài)注入實(shí)現(xiàn)對(duì)業(yè)務(wù)邏輯類(lèi)和DAO類(lèi)的實(shí)例托管;在事務(wù)處理方面,利用Spring提供的面向切面的事務(wù)處理功能,使對(duì)數(shù)據(jù)的事務(wù)控制脫離于數(shù)據(jù)訪問(wèn)接口實(shí)現(xiàn);在對(duì)象關(guān)系映射方面,利用Spring對(duì)數(shù)據(jù)庫(kù)連接池的托管和對(duì)iBatis框架的支持。開(kāi)發(fā)人員需要完成對(duì)數(shù)據(jù)源的配置、對(duì)不同模塊所對(duì)應(yīng)的application*.xml文件的配置,以及對(duì)業(yè)務(wù)邏輯接口的定義和業(yè)務(wù)邏輯實(shí)現(xiàn)的編寫(xiě)。
在持久層,利用iBatis提供的半自動(dòng)化對(duì)象關(guān)系映射的實(shí)現(xiàn),開(kāi)發(fā)人員需要編寫(xiě)具體的sql語(yǔ)句,為系統(tǒng)設(shè)計(jì)提供了更大的自由空間。另外,開(kāi)發(fā)人員需要完成對(duì)SqlMapConfig.xml和*SqlMap.xml的配置,以及對(duì)DAO接口的定義和DAO接口的實(shí)現(xiàn)。
在各層之間進(jìn)行交換的過(guò)程中,利用數(shù)據(jù)傳輸類(lèi)進(jìn)行數(shù)據(jù)的傳遞和交互。其中,數(shù)據(jù)傳輸類(lèi)與數(shù)據(jù)庫(kù)表一一對(duì)應(yīng)。
SSI框架能夠降低我們代碼的耦合度,增強(qiáng)了代碼的健壯性和可重用性,加快了開(kāi)發(fā)速度,但是也有一些不足之處,比如由于三種框架的配置文件較多,也給我們帶來(lái)了一些不便,特別是對(duì)于較小的應(yīng)用來(lái)說(shuō)更是如此。
一:首先引入struts2 spring ibatis 各自的jar包 在此就不一一羅列了。
二:添加配置文件
我們首先從web.xml文件說(shuō)起
web.xml加載過(guò)程:
1 啟動(dòng)WEB項(xiàng)目的時(shí)候,容器(如:Tomcat)會(huì)讀他的配置文件web.xml讀兩個(gè)節(jié)點(diǎn)
《listener》《/listener》和《context-param》《/context-param》
2 緊接著,容器創(chuàng)建一個(gè)ServletContext(上下文) 這個(gè)WEB項(xiàng)目所有部分都將共享這個(gè)上下文
3 容器將《context-param》《/context-param》轉(zhuǎn)化為鍵值對(duì)并交給ServletContext
4 容器創(chuàng)建《listener》《/listener》中的類(lèi)的實(shí)例,即創(chuàng)建監(jiān)聽(tīng)
5 在監(jiān)聽(tīng)中會(huì)有contextInitialized(ServletContextEvent args)初始化方法,在這個(gè)方法中獲得:
ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter(“context-param的鍵”);
web.xml節(jié)點(diǎn)加載順序
節(jié)點(diǎn)的加載順序與它們?cè)趙eb.xml文件中的先后順序無(wú)關(guān)。即不會(huì)因?yàn)閒ilter寫(xiě)在listener的前面而會(huì)先加載filter最終得出的結(jié)論是:listener-》filter-》servlet
同時(shí)還存在著這樣一種配置節(jié)點(diǎn):context-param,它用于向 ServletContext 提供鍵值對(duì),即應(yīng)用程序上下文信息。我們的 listener, filter 等在初始化時(shí)會(huì)用到這些上下文 的信息,那么context-param 配置節(jié)是不是應(yīng)該寫(xiě)在 listener 配置節(jié)前呢?實(shí)際上 context-param 配置節(jié)可寫(xiě)在任意位置,因此真正的加載順序?yàn)椋?/p>
context-param -》 listener -》 filter -》 servlet
加載spring
《listener》
《listener-class》
org.springframework.web.context.ContextLoaderListener
《/listener-class》
《/listener》
最終結(jié)論:
web.xml 的加載順序是:[context-param -》 listener -》 filter -》 servlet -》 spring] ,而同類(lèi)型節(jié)點(diǎn)之間的實(shí)際程序調(diào)用的時(shí)候的順序是根據(jù)對(duì)應(yīng)的 mapping 的順序進(jìn)行調(diào) 用的。
打開(kāi)web.xml文件,根據(jù)實(shí)際需要添加如下內(nèi)容
《!--上下文參數(shù)用于log4j以及spring中使用--》
《context-param》
《param-name》webAppRootKey《/param-name》
《param-value》/WEB-INF/log4j.properties《/param-value》
《/context-param》
《!--應(yīng)用程序上下文參數(shù),指定spring配置文件位置--》
《context-param》
《param-name》contextConfigLocation《/param-name》
《param-value》/WEB-INF/beans.xml《/param-value》
《/context-param》
《listener》
《listener-class》org.springframework.web.util.Log4jConfigListener《/listener
-class》
《/listener》
《!--監(jiān)聽(tīng)器 用于初始化spring框架--》
《listener》
《listener-
class》org.springframework.web.context.ContextLoaderListener《/listener-class》
《/listener》
在這說(shuō)說(shuō)SSI整合時(shí)的一些配置文件:
1,contextConfigLocation:Spring容器啟動(dòng)時(shí)需要加載Spring的配置文件。默認(rèn)是/WEB-INF目錄下的applicationContext.xml文件
當(dāng)然也可以放在classpath下,可以包括多個(gè)spring配置文件,這就得依靠contextConfigLocation
《!-- 加載spring的配置文件 如果文件名為applicationContext.xml并且是在WEB-INF目錄下 則無(wú)需此配置 --》
《context-param》
《param-name》contextConfigLocation《/param-name》
《param-value》/WEB-INF/beans.xml《/param-value》
《/context-param》
如果web.xml中沒(méi)有配置context-param,spring的配置就像如上這段代碼示例一下,自動(dòng)去WEB-INF目錄下尋找applicationContext.xml。此時(shí),如果你修改applicationContext.xml的名稱(chēng),或者移除它,再啟動(dòng)服務(wù)器,你會(huì)得到如下異常信息:
1.nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
這證實(shí)了其默認(rèn)配置。默認(rèn)配置情況下spring只會(huì)去WEB-INF目錄下尋找配置文件,而不會(huì)去classpath下尋找。
如果我們不想將配置文件放在WEB-INF目錄下呢?開(kāi)發(fā)中經(jīng)常在src下面創(chuàng)建一個(gè)config目錄,用于存放配置文件。此時(shí),對(duì)應(yīng)的param-value改為:classpath:config/applicationContext.xml。
一定要加上classpath,這告訴spring去classes目錄下的config目錄下面尋找配置文件。
2,如何啟動(dòng)Spring容器
兩種方法,一種以listener啟動(dòng) 一種以load-on-startup Servlet。
《!-- 配置spring監(jiān)聽(tīng)器 --》
《listener》
《listener-class》org.springframework.web.context.ContextLoaderListener《/listener-class》
《/listener》
第二種
《servlet》
《servlet-name》context《/servlet-name》
《servlet-class》org.springframework.web.context.ContextLoaderServlet《/servlet-class》
《load-on-startup》1《/load-on-startup》
《/servlet》
3,整合Struts2
《filter》
《filter-name》struts2《/filter-name》
《filter-class》org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter《/filter-class》
《/filter》
《filter-mapping》
《filter-name》struts2《/filter-name》
《url-pattern》/*《/url-pattern》
《/filter-mapping》
4,Spring整合ibatis配置文件
《bean id=“sqlMapClient” class=“org.springframework.orm.ibatis.SqlMapClientFactoryBean”》
《property name=“configLocation”》
《value》classpath:SqlMapConfig.xml《/value》
《/property》
《/bean》
5,Struts.xml
《constant name=“struts.objectFactory” value=“spring” /》
constant配置struts的常量(也可在struts.properties)文件中配置,將struts的對(duì)象工廠托由spring管理。
評(píng)論