<bean id="viewresolver" class="org.springframework.web.servlet.view.freemarker.freemarkerviewresolver"> <property> <value>><value>.ftl</value></property> </bean> <bean id="freemarkerconfig" class="org.springframework.web.servlet.view.freemarker.freemarkerconfigurer"> <property> <value>/view/</value> </property> </bean>
如果不使用spring的mvc框架而想結合已有的一些mvc框架,spring也是支持的。spring對於常見的mvc框架都提供了支持,包括struts,webwork,tapestry和jsf等。結合使用這些框架的一個好處是可以使用一些已有的熟悉的技術,另外結合spring的aop攔截器可以相對比較容易地處理框架動作共有的事情,比如動作的日誌處理等。如果選擇這些mvc框架,那么在使用框架的配置檔案和套用的spring配置檔案都需要做相應的修改。比如使用struts的時候,struts-config.xml配置檔案中的映射動作類型一般會設定成org.springframework.web.struts.delegatingactionproxy,或者設定控制器為org.springframework.web.struts.delegatingrequestprocessor。然後需要在相應應的webapplicationcontext中定義與struts action對應的bean。這樣就可以充分利用spring的控制反轉技術來管理struts的action了。
applicationcontext ctx = new filesystemxmlapplicationcontext("config.xml");
但是按照控制反轉的原則,應用程式代碼應該儘可能少的知道上下文的設定。因此,在基於spring的web套用中,這樣的代碼也可以省去。spring可以通過配置讓web容器自動裝載上下文配置檔案。從本質上講,web套用的servletcontext就是spring用來存放套用上下文的地方。spring中與web context裝載相關的有幾個類:
<listener> <listener-class> org.springframework.web.context.contextloaderlistener </listener-class> </listener>
如果使用contextloaderservlet,其在web.xml中的配置一般如下:
<servlet> <servlet-name>context</servlet-name> <servlet-class> org.springframework.web.context.contextloaderservlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
套用本身可能除了基於http的web渠道之外還通過別的渠道對外提供服務,因此,一個比較好的做法是把展示相關的配置與後面業務處理部分的配置分開。這樣如果更改了套用的訪問渠道,只需要修改對應的配置檔案即可。因此,spring提供了一個webapplicationcontext的概念。在webapplicationcontext中一般包含與web訪問相關的配置定義,包括各種控制動作的定義、界面展示的定義等等。webapplicationcontext一般由dispatcherservlet來初始化。在上下文層次結構上可以把它看成是applcationcontext的子上下文。在預設的情況下,dispatcherservlet裝載的配置檔案名稱稱為其servlet名稱-servlet.xml,但是可以通過contextconfiglocation參數來定製。dispatcherservlet在web.xml中的定義示例如下:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> <init-param> <param-name>contextconfiglocation</param-name> <param-value>/web-inf/context/webcontrollers.xml</param-value> </init-param>
數據持久化層
public class userdaojdbc extends jdbcdaosupport implements userdao{ … }
如果使用hibernate來實現這個dao的時候,定義的類如下:
public class userdaohibernate extends hibernatedaosupport implements userdao { … }
spring對於其它的o/r映射機制都有相應的抽象類供套用使用,比如對於ibatis有sqlmapclientdaosupport,對於jdo有jdodaosupport等。
<bean id="userdao" class="com.fgw.dao.hibernate.userdaohibernate"> <property> <ref local="sessionfactory"/> </property> </bean>
在這裡我們實際dao接口定義是:com.fgw.dao.userdao,而具體實現類為:com.fgw.dao.hibernate.userdaohibernate。顯然,對於其它dao的實現,我們只需要在配置檔案中修改相應的實現類(具體實現類當然是比不可少的)和屬性即可。比如對於jdbc的dao實現,屬性就定義成相應的數據源。