struts和spring整合創建Action對象的問題?

 SpringStruts2的整合只需一個插件包,不過筆者在練習的過程中,被一個小問題給鬱悶了好久。

按道理來說SpringStruts2整合之後,Action的創建以及屬性注入是有Spring來管理的,是否由Spring來管理Action的創建與屬性注入還是要取決於我們的配置,如下爲ModulAction的配置:

 

  1. <action name="modul" class="com.spl.action.ModulAction">  
  2.             <result name="index">/modul/index.jsp</result>  
  3.         </action>  

    眨眼一看沒有什麼錯誤,不過要是和Spring整合之後就會發現Class處應爲Spring中相應Actionid,不錯,是這樣的。那麼要是我們的Class直接寫成Action的全路徑會有什麼問題嗎?問題是有的,慢慢分析。我們先試着在applicationContext.xml中配置上Action:

  1. <bean id="modulAction" class="com.spl.action.ModulAction" scope="prototype">  
  2.             <property name="service">  
  3.                 <ref bean="businessService"/>  
  4.             </property>          
  5.         </bean>  

   在Spring中是有配置businessService的,然後ModulAction屬性:

 

  1. BusinessService service;  
  2.     public BusinessService getService() {  
  3.         return service;  
  4.     }  
  5.     public void setService(BusinessService service) {  
  6.         this.service = service;  
  7.     }  

   啓動工程,運行ModulAction,會發現servicenull,爲什麼呢?上面的applicationContext.xml不是已經爲Action注入了businessService麼?問題就出在這了,這裏的Action的控制權是由sturts掌管着,因爲在struts.xml配置Action的時候爲其指定Class的是類全名,而不是SpringAcitonid。所以當我們訪問Action的時候首先由struts創建Action,然後在跟據Action的屬性servicespring容器中去找idservicebean,因爲在spring容器中我們配置的是businessService名,所以struts會找不到他想要的bean,故爲空,要是把action中的屬性改爲businessService那麼就不會出null異常。

   相反,要是把struts中action的class設置爲spring容器中的bean的id時,action的創建及屬性注入式有spring來管理的。


轉載自:http://blog.csdn.net/ms2146/article/details/5546741

發佈了39 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章