1. 程式人生 > >Spring與Struts2整合

Spring與Struts2整合

Struts2與Spring整合後,可以使用Spring的配置檔案applicationContext.xml來描述依賴關係,在Struts2的配置檔案struts.xml來使用Spring建立的bean。

1、匯入依賴包

除了匯入Struts2和Spring的核心庫之外,還要匯入commons-logging和struts2-spring-plugin包,否則啟動會出異常

2、web.xml的配置

既然有Struts2,核心攔截器的配置是不可少的

<filter>
     <filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

通過配置ContextLoaderListener監聽器,使容器啟動時,自動載入applicationContext配置,

因為它實現了ServletContextListener這個介面,容器啟動時會自動執行它實現的方法。

<listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

預設情況下,會載入WEB-INF/applicationContext.xml這個檔案,我們可以通過配置contextConfigLocation引數改變配置檔案的路徑

<context-param
> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/classes/applicationContext.xml</param-value> </context-param>

以上配置均在web.xml檔案的<web-app></web-app>區域

3、測試類

在瀏覽器請求一個Action方法,在Action方法內向一個物件請求一個List,然後轉到index.jsp頁面,在頁面中輸出Action請求到的List。

通過Spring依賴配置,控制Action請求的物件。

首先要編寫一個介面,Action方法依賴這個介面,通過呼叫介面中的方法獲取List

public interface IocTestInterface {
     public List getList();
}

下面編寫Action類,這個類繼承ActionSupport類,並覆蓋其中的execute方法,

execute方法執行時,呼叫實現了上述介面物件的getList方法獲取List

public class IocAction extends ActionSupport {
	private IocTestInterface iti;
	private List list;
	
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public IocTestInterface getIti() {
		return iti;
	}
	public void setIti(IocTestInterface iti) {
		this.iti = iti;
	}
	
	public String execute() throws Exception {
		this.setList(iti.getList());
		return super.execute();
	}
}

編寫用來顯示執行結果的jsp檔案

遍歷list,並將每個元素作為一行來顯示

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
  <body>
    This is my JSP page. <br><br>
    
    <s:iterator value="list" id="current">
    	<li><s:property value="current"/></li>
    </s:iterator>
    
  </body>
</html>

系統的結構就是這樣。下面編寫兩個實現IocTestInterface介面的類,用來提供資料

public class IocTestImpl implements IocTestInterface {
	public List getList() {
		List l = new ArrayList();
		l.add("abc");
		l.add("def");
		l.add("hig");
		return l;
	}
}
public class IocTest2Impl implements IocTestInterface {
	public List getList() {
		List l = new ArrayList();
		l.add("123");
		l.add("456");
		l.add("789");
		return l;
	}
}

4、編寫applicationContext.xml配置依賴關係

<beans xmlns ="http://www.springframework.org/schema/beans" 
    xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation ="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    
    <bean name="IocAction" class="sy.struts2.ioc.IocAction">
    	<property name="iti">
    		<bean class="sy.struts2.ioc.IocTestImpl"></bean>
    	</property>
    </bean>
    
</beans>

檔案配置了id為IocAction的bean,路徑為剛剛編寫的Action類的路徑,其中iti物件(請求資料的物件)配置為IocTestImpl(這裡使用了匿名bean)

5、編寫struts.xml配置檔案

首先要告知Struts 2執行時使用Spring來建立物件

在<struts></struts>區域加入以下配置

<constant name="struts.objectFactory" value="spring" />

建立package並配置Action

<package name="hs" extends="struts-default">
     <action name="ioc" class="IocAction">
          <result>/index.jsp</result>
     </action>
</package>

6、釋出並執行

image

修改spring配置檔案applicationContext.xml中配置

<bean name="IocAction" class="sy.struts2.ioc.IocAction">
     <property name="iti">
          <bean class="sy.struts2.ioc.IocTest2Impl"></bean>
     </property>
</bean>

只是將注入到IocAction中的IocTestImpl修改為IocTest2Impl,也就是使用了另一個實現了IocTestInterface介面的類

重啟伺服器,再次開啟剛才的地址

image

這也就是spring的“控制反轉”