基於Spring框架的WebSphere套用開發2

<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了。

另外在使用這些框架的時候要解決的一個問題是上下文的裝載。比如使用struts,可以使用contextloaderplugin來裝載web上下文。這個contextloaderplugin替換了原來通過dispacherservlet裝載的方式。需要在struts-config.xml檔案中添加如下條目:<plug-in classname="org.springframework.web.struts.contextloaderplugin"/>。這種方式可以使spring的web上下文隨著struts actionservlet的初始化而裝載。

因此,如果用戶已有的套用是基於某個mvc框架,或者用戶熟悉某個框架,那么可以利用spring對這些框架的支持結合使用。因為我們的目的本來就是為了解決問題而不是為了使用某種技術。但是對其它用戶而言,如果不是對已有的一些mvc框架比較熟悉的話,那就直接使用spring的mvc框架就可以了。

web context設定

對於不依賴於套用伺服器的spring 上下文(context)設定,通常在套用代碼中通過filesystemxmlapplicationcontext或classpathxmlapplicationcontext來獲取。比如使用這樣的代碼來得到上下文:

applicationcontext ctx = new filesystemxmlapplicationcontext("config.xml");
但是按照控制反轉的原則,應用程式代碼應該儘可能少的知道上下文的設定。因此,在基於spring的web套用中,這樣的代碼也可以省去。spring可以通過配置讓web容器自動裝載上下文配置檔案。從本質上講,web套用的servletcontext就是spring用來存放套用上下文的地方。spring中與web context裝載相關的有幾個類:

1. contextloaderlistener:一般的套用伺服器如was都能先裝載listener,如果不是的話,那么只能使用contextloaderservlet。

2. contextloaderservlet:需要配置<load-on-startup>使得它率先裝載。真正裝載context的類是contextloader,上面兩個類只是兩種調用contextloader的不同途徑。contextloader內部實際調用的是xmlwebapplicationcontext,其預設配置檔案為/web-inf/applicationcontext.xml。

如果使用contextloaderlistener,其在web.xml中的配置一般如下:

<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>
數據持久化層

雖然使用j2ee技術的web套用可以連線多種不同的企業信息系統(eis),但是毫無疑問資料庫是其中最為重要和常見的一種。正因如此,spring對資料庫訪問提供了非常完備的支持。數據訪問對象(dao)模式是j2ee模式中非常重要的一種。它的主要目的是使得持久化層與業務邏輯層分離,從而禁止持久化層的具體實現。我們可以把spring的dao支持分為兩大類,一是直接基於spring jdbc模板的數據訪問,另一類是基於某種o/r映射框架的數據訪問。這裡剛好可以使用spring的控制反轉特性,通過外部配置檔案來定義dao接口和實際實現類之間的關係。spring框架目前支持的o/r映射框架包括hibernate、jdo、toplink、ibatis等。

假設我們定義了一個userdao。當使用jdbc來實現這個dao的時候,定義的類可以如下所示:

public class userdaojdbc extends jdbcdaosupport implements userdao{ … }
如果使用hibernate來實現這個dao的時候,定義的類如下:

public class userdaohibernate extends hibernatedaosupport implements userdao { … }
spring對於其它的o/r映射機制都有相應的抽象類供套用使用,比如對於ibatis有sqlmapclientdaosupport,對於jdo有jdodaosupport等。

下面我們看一下如何在spring的配置檔案中定義上述dao與具體實現的關係。假設我們的userdao具體實現是通過hibernate,那么在applicationcontext.xml中的一個dao可以定義如下:

<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實現,屬性就定義成相應的數據源。