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