1. 程式人生 > >spring與struts2整合方式

spring與struts2整合方式

有兩種整合方式:
(1) 把Action配置在beans.xml裡,利用Spring初始化Action的bean:
將Struts的業務邏輯控制器類配置在Spring的配置檔案中,Action中引用的業務類一併注入。
(這樣的處理,必須將action類的scope配置成property)
Xml程式碼
<bean id="LoginAction" class="yaso.struts.action.LoginAction">
<property name="loginDao" ref="LoginDao"/>
</bean>
接著,在struts.xml或者等效的Struts2配置檔案中配置Action時,指定<action>的class屬性為Spring配置檔案中相應bean的id或者name值。示例如下:
Xml程式碼
<action name=”LoginAction” class=”LoginAction”>
<result name=”success”>/index.jsp</result>
</action>

(2) 不需要在beans.xml裡配置Action,利用Struts-Spring_Plugin外掛自動初始化Action:
業務類在Spring配置檔案中配置,Action不需要配置,Struts2的Action像沒有整合Spring之前一樣配置,<action>的class屬性指定業務邏輯控制器類的全限定名。
Action中引用的業務類不需要自己去初始化,Struts2的Spring外掛會使用bean的自動裝配將業務類注入進來,其實Action也不是Struts2建立的,而是Struts2的Spring外掛建立的。預設情況下,外掛使用by name的方式裝配,可以通過增加Struts2常量來修改匹配方式:設定方式為:struts.objectFactory.spring.autoWire = typeName,可選的裝配引數如下:
name:相當於spring配置的autowrie="byName"(預設)
type:相當於spring配置的autowrie="byType"
auto:相當於spring 配置的autowrie="autodetect"
constructor: 相當於spring配置的autowrie="constructor"
這裡說了配置部分,但是,這裡有一個問題, 就是Spring管理Action,如果按照第一方式,那麼只要通過scope="property"來配置為每個請求建立一個Action例項。 那麼第二種方式,並沒有指定Action的作用域。
<!-- 在Service層注入DAO -->
	<bean id="bookService" class="com.service.BookService">
		<property name="bookDAO" ref="bookDAO"></property>
	</bean>
這裡有點要注意,業務層物件bookService要提供setter方法,不然還是注入不了,沒寫set會導致空指標異常。
//注入service,匯入外掛包就開戶了按名字自動注入
	private BookService bookService;
	
	public void setBookService(BookService bookService) {
		this.bookService = bookService;
	}


action不用在Spring中配置,仍按照沒整合之前配置
<struts>
    <package name="default" namespace="/" extends="struts-default">
                <!-- 第一種 將Action 交給Spring管理 -->
		<!--bookaddAction並不是真實類名,只是指向Spring管理Action Bean的id   -->
		<action name="bookadd" class="bookaddAction"></action>

  <!-- 第二種 struts2 整合spring 方式, struts2自己管理Action,利用外掛包實現 --><!-- <action name="bookadd" class="com.action.BookAction"></action> --> </package></struts> 第一種方式時applicationContext.xml的配置,與上面action在struts.xml中配置的class屬性一樣
        <!-- action是多例項的,scope須改成prototype,切記 -->
	<bean id="bookaddAction" class="com.action.BookAction" scope="prototype">
		<property name="bookService" ref="bookService"></property>
	</bean>