IDEA下使用maven整合Struts2和Spring
初學java,在用struts做了幾個專案之後,覺得手動整合業務元件有些麻煩了,是時候上spring了。先把struts和spring整合下,體驗一把spring的IoC看看再說。
從網上找了不少資料,總感覺寫的不是很全面,對於我這個新手來說不是很友好。好在搗鼓了幾個小時之後,順利跑起來了一個簡單的demo。儘量詳細的記錄一下,以便和大家交流。
環境&版本
jdk:1.7
ide:IDEA 2016.02
tomcat:7
maven:3.3.9
由於這裡的IDE用的是IDEA,所以可能要熟悉一些基本操作,例如配置伺服器、啟動、除錯等。如果有不熟悉的,可以先看下這篇教程:
IDEA中建立maven工程
這裡簡單介紹下在IDEA中建立maven工程:一般的create project流程,只是在選擇型別的時候先勾選create from archetype,選擇maven中的maven-archetype-webapp,剩下的暫時隨便填填也可以。參考圖:
注意:這裡只是介紹在ide中如何建立maven工程,後面的測試工程會用到github上的工程。
匯入專案
struts為spring提供了示例工程,所以在此我就直接用示例工程了。傳送門:
這個工程裡面有很多子工程,我匯入IDEA後,按照上面的README沒有編譯成功。所以還是將裡面的spring-struts拷貝出來,單獨做成一個專案,然後跑成功的。將這個資料夾提出來後項目如下圖所示:
pom.xml
工程中的程式碼無需多改,唯一要改動的就是pom.xml了,我的大部分時間也是耗在了這個上面。下面給出經過嘗試之後可用的pom配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ebank.hfcenter.rel</groupId>
<artifactId>sprint-struts</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>sprint-struts Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<!--struts2-->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.1.2</version>
</dependency>
</dependencies>
<build>
<finalName>sprint-struts</finalName>
</build>
</project>
修改完成後,等待IDEA自動下載對應jar包即可。
啟動
正如上節所說,改了pom.xml之後,其他檔案不用修改,就可以直接啟動該專案了。啟動成功後的若干截圖如下:
首頁:
填寫資訊頁:
儲存成功頁:
粗淺理解
雖然沒有改動專案程式碼,但是還是需要理解一下的。對這個專案,我的大致理解如下:
1. 在web.xml中配置了啟動spring容器的listener:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
通過這個listener,在專案啟動時就會啟動spring容器,然後載入預設的配置檔案:/WEB-INF/applicationContext.xml;
2. 在applicationContext.xml中,配置了由spring容器管理的業務元件(JavaBean),例如在本工程中就配置了一個bean:
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
<bean id="editService" class="org.apache.struts.edit.service.EditServiceInMemory"/>
</beans>
配置了這個bean後,在後續的業務流程中,如果有和bean名相同的業務元件,就會有spring自動的管理,而不必使用硬編碼的方式寫在程式中。
3. 後續的流程就和單純的struts差不多了,http request-》action-》呼叫業務元件-》返回,只不過其中action中的業務組建由spring管理,會方便很多。
搞定!