1. 程式人生 > >Web專案同時使用Struts2和SpringMVC

Web專案同時使用Struts2和SpringMVC

接手公司歷史遺留的一個專案,要在原有系統中新增新的功能。原有系統只使用Struts2做Web MVC,沒有用Spring做解耦,資料持久層使用JDBC連線,資料庫連線池是c3p0。從設計上看,原有系統拋棄了獨立的服務層,把服務層和資料持久層合併,控制層(Struts2的Action)直接呼叫持久層物件。新增功能採用SpringMVC和Mybatis。

由於原系統和新功能的控制層使用不同的MVC,打算部署兩套獨立的系統,新功能作為獨立的應用,老系統通過URL呼叫新功能。該方案需要解決許可權問題,因為有些功能需要登陸才能使用,有些功能只開放給部分使用者使用。使用者在老系統登陸,新系統無法通過Session獲取使用者登陸資訊,需要解決Session共享以及同步問題。在網上搜羅一番,發現Session共享實現起來都比較複雜,於是放棄該方案。

回到原點,解決如何把新功能整合到系統中,主要還是解決Struts2和SpringMVC的共存,原系統中Struts2攔截的路徑如下

  1. <!-- Struts2配置 -->
  2. <filter>
  3.     <filter-name>struts2</filter-name>
  4.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  5. </filter>
  6. <filter-mapping
    >
  7.     <filter-name>struts2</filter-name>
  8.     <url-pattern>/</url-pattern>
  9. </filter-mapping>
  10. <!-- End Struts2配置 -->

從Web.xml的配置上看,Struts2把所有請求都攔截了,在struts.xml配置檔案中,實際上Struts2只處理do和action結尾的請求。
  1. <!-- 設定struts的Action請求的字尾,支援多個時以逗號隔開。 -->
  2. <constantname="struts.action.extension"
    value="do,action"/>

修改web.xml中的配置,讓Struts2過濾器只攔截do和action的路徑,修改後的struts2過濾器如下
  1. <!-- Struts2配置 -->
  2. <filter>
  3.     <filter-name>struts2</filter-name>
  4.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7.     <filter-name>struts2</filter-name>
  8.     <url-pattern>*.do</url-pattern>
  9. </filter-mapping>
  10. <filter-mapping>
  11.     <filter-name>struts2</filter-name>
  12.     <url-pattern>*.action</url-pattern>
  13. </filter-mapping>
  14. <!-- End Struts2配置 -->

修改SpringMVC的處理路徑,把SpringMVC的請求都改為以mvc結尾,web.xml中的配置如下
  1. <!-- SpringMVC配置 -->
  2. <servlet>
  3.     <servlet-name>springmvc</servlet-name>
  4.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5.     <init-param>
  6.         <param-name>contextConfigLocation</param-name>
  7.         <param-value>classpath:spring-mvc.xml</param-value>
  8.     </init-param>
  9.     <load-on-startup>1</load-on-startup>
  10. </servlet>
  11. <servlet-mapping>
  12.     <servlet-name>springmvc</servlet-name>
  13.     <url-pattern>*.mvc</url-pattern>
  14. </servlet-mapping>
  15. <!-- End SpringMVC配置 -->

經過以上配置,Struts2和SpringMVC分別處理不同的請求,實現了Struts2和SpringMVC共存。只需修改配置檔案和少量程式碼的情況,把新功能整合到老系統中。

完整的web.xml配置如下

  1. <!-- Spring配置 -->
  2.     <context-param>
  3.         <param-name>contextConfigLocation</param-name>
  4.         <param-value>classpath:spring-context.xml</param-value>
  5.     </context-param>
  6.     <listener>
  7.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  8.     </listener>
  9.     <!-- End Spring配置 -->
  10.     <!-- 編碼過濾 -->
  11.     <filter>
  12.         <filter-name>encodingFilter</filter-name>
  13.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  14.         <init-param>
  15.             <param-name>encoding</param-name>
  16.             <param-value>UTF-8</param-value>
  17.         </init-param>
  18.         <init-param>
  19.             <param-name>forceEncoding</param-name>
  20.             <param-value>true</param-value>
  21.         </init-param>
  22.     </filter>
  23.     <filter-mapping>
  24.         <filter-name>encodingFilter</filter-name>
  25.         <url-pattern>*.mvc</url-pattern>
  26.     </filter-mapping>
  27.     <filter-mapping>
  28.         <filter-name>encodingFilter</filter-name>
  29.         <url-pattern>*.do</url-pattern>
  30.     </filter-mapping>
  31.     <filter-mapping>
  32.         <filter-name>encodingFilter</filter-name>
  33.         <url-pattern>*.action</url-pattern>
  34.     </filter-mapping>
  35.     <filter-mapping>
  36.         <filter-name>encodingFilter</filter-name>
  37.         <url-pattern>*.jsp</url-pattern>