我正在重寫一些老化的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神器在每種情況下都會有所不同。我不得不相信其他人已經處理過這個。我在想它是錯誤的嗎?這種事情有沒有共同的解決方案?
這是一個巧妙的把戲,我可能會結束它與sinc e我沒有看到我們放棄Maven。立即變得明顯的一個缺點是,如果從JAR中複製出來,開發人員不能再動態地更新JSP。它需要從IDE重建並重新部署才能看到簡單的編輯。我懷疑有什麼可以做的,但如果你有一個想法,我會全神貫注。 – KevinF 2012-03-07 19:04:03
嗯......你可能會用符號鏈接做些骯髒的事情,這取決於你準備從最終的工件中製作你的開發環境的不同。或者,如果您使用的是WAR分解,那麼在每次JSP更改後,運行單個maven'unpack'目標並不需要很長時間。 – artbristol 2012-03-07 19:51:58