Spring整合Struts的兩種方式介紹

2021-10-24 05:37:19 字數 4445 閱讀 6012

org.springframework.web.context.contextloaderlistener

如果有多個配置檔案需要載入,contextloaderlistener載入時,會查詢名為contextconfiglocation的初始化引數。

contextconfiglocation

/web-inf/daocontext.xml,

直接在web.xml檔案中配置建立spring容器。

利用第三方mvc框架的擴充套件點,建立spring容器。

該種方式就是將struts action也視為一種bean交給spring來進行託管,使用時struts的配置檔案中配置的action的classs屬性不再是具體action的實現類,而是在spring配置檔案中配置的beanid,也就是說具體是action實現類是在spring的配置檔案中進行配置的,struts的配置檔案中的class屬性只是spring檔案中bean的id。struts配置檔案如下示例:

/web-inf/content/login.jsp

/web-inf/content/manager/index.jsp

/web-inf/content/employee/index.jsp

/web-inf/content/login.jsp

同時需要在struts配置檔案中加入如下配置:

而spring的配置檔案中有如下配置:

可以看到,在spring中配置的bean的class屬性才是該action的具體實現類,而且還可以為該action設定其行為,該行為可以有singleton、prototype、request、session、global session幾個值(幾個值的詳細解釋請參考spring bean介紹),由於web環境下,action通常是無狀態的,即每個httprequest對應乙個action,請求完成後該action就應該進行釋放,而不是繼續保留供其他請求使用,因此,action的scope屬性的值通常設為prototype,表示每次請求都會產生乙個新的例項。

需要注意的是,為了完成spring託管struts action,必須加入乙個包,該包為:struts2-spring-plugin-2.2.1.jar,或者其他版本。如果系統中加入了該包,那麼就不需要在struts配置檔案中加入配置了,該常量配置是指示action的建立者由struts變為spring。為什麼加入了該包以後就不需要加入的配置了呢?這是由於在包內定義了乙個struts-plugin.xml的檔案,該檔案內容如下所示:

由於這種方式struts配置檔案中指定的action的class屬性並不是真實的實現類,因此破壞了struts配置檔案的原生性,並且需要在spring中新增action的配置檔案,造成大量的配置冗餘,因此更加推薦自動裝配的方式。

由spring託管struts action的方式(方式1)將action的建立者由struts改變為spring,action不再由struts核心進行建立,而是類似應用中的其他bean一樣由spring進行容器在初始化時進行建立。自動裝配則不然,它會用struts2配置檔案中的class屬性去和spring配置檔案中的id屬性進行關聯(存在乙個尋找過程),如果能找到則由spring建立,否則由struts2框架自身建立,然後由spring來裝配。所以action的實際建立者仍然是struts(沒人會拿包路徑當beanid),spring只是負責裝配。

同樣需要引入上面介紹的包(必須引入該包了),並且在struts.xml中加入如下常量屬性配置(必須):

但是struts配置檔案中action的class屬性不再是beanid,而是實際的action類。

/fpages/emperormain.jsp

/fpages/admin.jsp

/fpages/queenmain.jsp

/fpages/ministermain.jsp

/fpages/login.jsp

而在spring配置檔案中不需要再次配置該action。

方式一中加入額外外掛程式,可加可不加常量配置語句,action的建立者為spring,他會根據action的class屬性的值搜尋spring配置檔案,找到bean id為class屬性值的bean。action由spring在初始化時建立並完成後續的裝載(裝載:在action中使用的其他bean由spring容器生成,並注入到action中去。詳見4.4)。由於需要在兩個配置檔案中新增配置,因此容易造成配置冗餘。

方式二加入了額外外掛程式,以及在struts配置檔案中加入一條常量配置,action的實際建立者仍為struts,spring只是負責為建立好的action注入所需要的邏輯元件。

方式1方式2

使用方法

加入外掛程式;

加外掛程式,加常量配置

action的建立者

spring

在容器中尋找,找到則為spring,未找到則為struts

外掛程式中的元件裝配***是否起作用

外掛程式中的***起作用。spring負責注入邏輯元件。

外掛程式中的***起作用。spring負責注入邏輯元件。

使用自動裝配方式來整合spring和struts,struts的配置檔案—struts.xml中action的定義方式不需要做任何改變,但是需要在web.xml中配置spring的配置檔案,來載入bean的定義檔案,載入後容器就會託管已經定義好的bean,而在action中,只需要定義需要注入的bean,比如service等,同時設定好setter方法和getter方法,在execute方法中直接使用該bean的方法即可。

需要改變的地方有:

需要開啟spring託管struts的開關,該開關相當於是告知spring,要負責為定義的action注入所需的邏輯元件。在struts.xml中新增如下語句(方式2需要加入,如果是方式一不需要):

變數struts.objectfactory.spring.autowire的值設定為true即為標識自動裝配開啟,spring容器會自動根據在struts action類中定義的bean的名字查詢容器中是否有該容器的定義,如果有,就自動為該類(action)注入該bean,如果沒有那麼就無法完成注入。

這種策略下,struts的配置檔案和不整合spring時沒有區別(需要加入上面的語句)。區別在於如果是方式1,action的建立者是spring,那麼後續的裝配自然由spring容器完成。而方式2由於action的實際建立者仍然是struts,而spring容器只是負責為建立好的action例項注入所需要的邏輯元件而已。

struts.objectfactory這個屬性用於說明struts2的物件池建立工廠,struts2也有自己的物件池,就像spring那樣,在配置檔案中你可以引用物件池中的物件,你可以借助於spring中的物件池,當想要得到spring中的物件池時,申明struts.objectfactory為spring的物件池構建工廠。當指定struts.objectfactory為spring時,struts2框架就會把bean**給spring來建立,裝配,注入。但是bean建立完成之後,還是由struts容器來管理其生命週期。

在struts.xml中的**如下:

struts.objectfactory.spring.autowire是用spring外掛程式通過覆蓋(override)struts2的 objectfactory來增強核心框架物件的建立。當建立乙個物件的時候,它會用struts2配置檔案中的class屬性去和spring配置檔案中的id屬性進行關聯,如果能找到則由spring建立,否則由struts2框架自身建立,然後由spring來裝配。

spring外掛程式(struts2-spring-plugin-2.2.1.jar)具體有如下幾個作用:

1. 允許spring來建立action、interceptror和result;

2. 由struts建立的物件能夠被spring裝配;

3. 提供了2個***來自動裝配action;

Spring整合Struts詳解

spring雖然也提供了自已的mvc元件,但一來spring的mvc元件過於繁瑣,二來是struts的使用者眾多,因此,很多專案還是選擇使用spring整合struts框架,而且spring可以無縫的整合strtus框架,二者結合成乙個更實際的j2ee開發平台 使用spring的web應用時,不用手...

Struts與Spring的整合

struts核心是mvc,struts與spring的整合就是把struts的action交給spring去管理,從而達到簡化程式的目的 一 配置spring上下文和監聽 配置spring上下文和監聽有兩種方式 方式一 web.xml web主要配置檔案 而主要用於監聽web的上下文,可用下面 代替...

spring和struts的整合

struts 2框架整合spring很簡單,下面是整合的步驟。1.複製檔案。複製struts2 spring plugin x x x.jar和spring.jar到web inf lib目錄下。其中的x對應了spring的版本號。還需要複製commons logging.jar檔案到web inf...