Web專案同時使用Struts2和SpringMVC
阿新 • • 發佈:2019-01-02
接手公司歷史遺留的一個專案,要在原有系統中新增新的功能。原有系統只使用Struts2做Web MVC,沒有用Spring做解耦,資料持久層使用JDBC連線,資料庫連線池是c3p0。從設計上看,原有系統拋棄了獨立的服務層,把服務層和資料持久層合併,控制層(Struts2的Action)直接呼叫持久層物件。新增功能採用SpringMVC和Mybatis。
由於原系統和新功能的控制層使用不同的MVC,打算部署兩套獨立的系統,新功能作為獨立的應用,老系統通過URL呼叫新功能。該方案需要解決許可權問題,因為有些功能需要登陸才能使用,有些功能只開放給部分使用者使用。使用者在老系統登陸,新系統無法通過Session獲取使用者登陸資訊,需要解決Session共享以及同步問題。在網上搜羅一番,發現Session共享實現起來都比較複雜,於是放棄該方案。
回到原點,解決如何把新功能整合到系統中,主要還是解決Struts2和SpringMVC的共存,原系統中Struts2攔截的路徑如下
- <!-- Struts2配置 -->
- <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>
- <!-- End Struts2配置 -->
從Web.xml的配置上看,Struts2把所有請求都攔截了,在struts.xml配置檔案中,實際上Struts2只處理do和action結尾的請求。
- <!-- 設定struts的Action請求的字尾,支援多個時以逗號隔開。 -->
-
<constantname="struts.action.extension"
修改web.xml中的配置,讓Struts2過濾器只攔截do和action的路徑,修改後的struts2過濾器如下
- <!-- Struts2配置 -->
- <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>*.do</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
- <!-- End Struts2配置 -->
修改SpringMVC的處理路徑,把SpringMVC的請求都改為以mvc結尾,web.xml中的配置如下
- <!-- SpringMVC配置 -->
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-mvc.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <url-pattern>*.mvc</url-pattern>
- </servlet-mapping>
- <!-- End SpringMVC配置 -->
經過以上配置,Struts2和SpringMVC分別處理不同的請求,實現了Struts2和SpringMVC共存。只需修改配置檔案和少量程式碼的情況,把新功能整合到老系統中。
完整的web.xml配置如下
- <!-- Spring配置 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-context.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <!-- End Spring配置 -->
- <!-- 編碼過濾 -->
- <filter>
- <filter-name>encodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- <init-param>
- <param-name>forceEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>*.mvc</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>*.jsp</url-pattern>