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