我正在重写一些老化的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