2012-03-07 62 views
10

我正在重寫一些老化的Web應用程序。有兩個特別非常非常相似,但今天沒有共享代碼,我打算解決這個問題。在類似的Web應用程序之間共享Web層代碼(控制器和JSP)的最佳實踐

項目正在用Maven,Spring MVC和Sitemesh重寫。

模型層代碼很容易使用JAR進行共享。但我不知道有什麼好的方法可以在類似的應用程序之間共享通用的Web層代碼(JSP和控制器)。

這是一些背景。這些應用程序是webstores。一個是用戶可以登錄,搜索產品,添加到購物車,並簽出的普通商店(認爲amazon.com)。另一個基本上是一樣的東西,只是它是一個出色的網站。產品瀏覽和購物車部分是相同的。但登錄和結帳完全不同。

我簡直太簡單了,但它足以說明問題。產品瀏覽和購物車部分中有很大一部分Web層代碼應該能夠在這兩者之間共享。

我不認爲可以簡單地將基於環境變量或來自不同數據庫的設置運行的WAR文件作爲「模式」運行。其中一個區別是完全不同的Spring Security配置。最好將其他站點的登錄和簽出控制器從組件掃描中清除出去,以便任何人都無法通過URL操作將其交給錯誤的組件。

我最初開始使用Maven Profiles和過濾來在同一個WAR項目中保留兩個不同的配置集(web.xml,spring configs等)。基於選擇哪個Maven配置文件,生成的WAR將使用不同的配置集(爲了清楚起見,使用不同的名稱)。這違反了Maven的原則,即一個pom產生一件神器。

有沒有更好的方法來做到這一點?那麼Maven WAR Overlays呢?我看到有人在討論使用疊加層來共享像CSS,JS,圖像等常見資源,甚至是一些常見的JSP。但是我沒有看到有人像這樣提到像Controllers這樣的分享類。

我可以將Controller類推到JAR上,但從邏輯上看,它們應該保留在它們各自的JSP中。而且JSP也不能被推送到JAR中(對嗎?)。

我還想過讓它成爲一個包含多個WAR文件的EAR--一個用於常見購物體驗的WAR,另一個用於適當登錄和簽出的WAR。我相信會話可以在同一個EAR中的兩個WAR之間共享,但我不確定它是否適合Spring的會話範圍bean。我聽說他們沒有真正存儲在會話中。我還必須弄清楚如何處理用於頁眉/頁腳的Sitemesh裝飾器。需要將相同的Sitemesh配置及其資源複製到兩個WAR中,對嗎?所以最終,購物WAR神器在每種情況下都會有所不同。我不得不相信其他人已經處理過這個。我在想它是錯誤的嗎?這種事情有沒有共同的解決方案?

回答

1

做好對付複製粘貼的戰鬥。你爲什麼說很難分享JSP?您可以複製出來使用Maven的依賴插件共享罐子:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <version>2.4</version> 
     <executions> 
      <execution> 
      <id>unpack</id> 
      <phase>package</phase> 
      <goals> 
       <goal>unpack</goal> 
      </goals> 
      <configuration> 
       <artifactItems> 
       <artifactItem> 
        <groupId>com.example</groupId> 
        <artifactId>webapp-common</artifactId> 
        <version>1.0-SNAPSHOT</version> 
        <outputDirectory>[target jsp directory]</outputDirectory> 
        <includes>**/*.jsp</includes> 
       </artifactItem> 
       </artifactItems> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
+0

這是一個巧妙的把戲,我可能會結束它與sinc e我沒有看到我們放棄Maven。立即變得明顯的一個缺點是,如果從JAR中複製出來,開發人員不能再動態地更新JSP。它需要從IDE重建並重新部署才能看到簡單的編輯。我懷疑有什麼可以做的,但如果你有一個想法,我會全神貫注。 – KevinF 2012-03-07 19:04:03

+0

嗯......你可能會用符號鏈接做些骯髒的事情,這取決於你準備從最終的工件中製作你的開發環境的不同。或者,如果您使用的是WAR分解,那麼在每次JSP更改後,運行單個maven'unpack'目標並不需要很長時間。 – artbristol 2012-03-07 19:51:58

0

我在這個情況下,首選方案是把所有相關的文件(控制器,JS,圖片...)在一個罐子裏。但是這裏的問題是使用JSP文件:如果它們放在jar中,沒有簡單的方法來使用它們。但與其他視圖技術,如速度Freemarker這是可能的一個簡單的方法,除其他優點。我不知道這是否會導致你過多的工作,但對於滿足這些需求的新項目來說,這是最好的選擇。

+0

有意思......所以你說我們可以從/ WEB-INF/velocity或JAR中提取Velocity/Freemarker模板?這需要一個自定義的ViewResolver來完成Spring MVC嗎?我找到的所有示例都只是指/ WEB-INF。 – KevinF 2012-03-07 15:23:02

+0

在這裏你有一個很好的例子:http://www.springbyexample.org/examples/velocity-email-template.html – sinuhepop 2012-03-07 23:00:02

0

我們在這裏使用Subversion,並使用svn:externals(有點像符號鏈接)來共享項目之間的某些通用代碼(主要是.jsp文件)。工作得很好,我們使用的是OC4J,它實際上有一種方法可以在多個項目之間共享.jsp,但是由於我們正在向Tomcat(或其他方向)發展,我想提出一種容器不可知的方式來實現它。

0

Sinuhepop是對的,但他的回答並不完美。

這是最完美的答案。你必須參考下面的網址,它可以幫助你。

click here

在URL頁面

,該屬性的內容框中的例子是不準確的,你跟着我:

如果需要共享文件:

a.jsp svn://myhome.com/svn/myproject/trunk/a.jsp 

如果需要共享一個文件夾:

xml svn://myhome.com/svn/myproject/trunk/xml 
相關問題