10

我正在重写一些老化的 Web 应用程序。特别是有两个非常非常相似,但今天没有共享代码,我的目标是解决这个问题。

这些项目正在使用 Maven、Spring MVC 和 Sitemesh 进行重写。

模型层代码很容易使用 JAR 共享。但我不知道在类似应用程序之间共享通用 Web 层代码(JSP 和控制器)的任何好方法。

这里有一些背景。这些应用程序是网上商店。一个是普通商店(想想 amazon.com),用户可以登录、搜索产品、添加到购物车并结账。另一个基本上是一样的,只是它是一个punchout站点。产品浏览和购物车部分是相同的。但是,登录和结帐是完全不同的。

我过于简单化了,但这足以说明问题。产品浏览和购物车部分中有很大一部分网络层代码应该能够在两者之间共享。

我认为不可能简单地将相同的 WAR 文件作为基于环境变量的“模式”或来自不同数据库的设置运行。其中一个区别是完全不同的 Spring Security 配置。最好将其他站点的登录和结帐控制器排除在组件扫描之外,这样没有人可以通过 URL 操作以某种方式越过错误的控制器。

我最初开始使用 Maven 配置文件和过滤来在同一个 WAR 项目中保留两个不同的配置集(web.xml、spring 配置等)。根据选择的 Maven 配置文件,生成的 WAR 使用不同的配置集构建(为了清楚起见,使用不同的名称)。这违反了一个 pom 产生一个工件的 Maven 原则。

有一个更好的方法吗?Maven WAR Overlays 呢?我看到人们谈论使用覆盖来共享常见资源,如 CSS、JS、图像,甚至一些常见的 JSP。但我没有看到任何人提到以这种方式共享控制器之类的类。

我可以将 Controller 类推到 JAR 中,但从逻辑上讲,它们似乎应该保留在各自的 JSP 中。并且 JSP 也不能下推到 JAR(对吗?)。

我还考虑使它成为一个包含多个 WAR 文件的 EAR——一个 WAR 用于常见的购物体验,另一个 WAR 用于适当的登录和结帐。我相信会话可以在同一个 EAR 中的两个 WAR 之间共享,但我不确定它是否与 Spring 的会话范围 bean 配合得很好。我听说它们并没有真正存储在会话中。我还必须弄清楚如何处理用于页眉/页脚的 Sitemesh 装饰器。需要将相同的 Sitemesh 配置及其资源复制到两个 WAR 中,对吗?所以最终,购物 WAR 神器在每种情况下仍然会有所不同。

我必须相信其他人之前已经处理过这个问题。我想错了吗?这种事情有一个通用的解决方案吗?

4

4 回答 4

1

与复制粘贴作斗争的好工作。为什么你说很难共享 JSP?您可以使用 maven 依赖插件将它们从共享 jar 中复制出来:

 <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>
于 2012-03-07T06:47:48.990 回答
0

Sinuhepop 是对的,但他的回答并不完美。

这是完美的答案。您必须参考以下网址,它可以帮助您。

点击这里

在url页面中,属性内容框的例子不准确,你跟我来:

如果需要共享文件:

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

如果需要共享文件夹:

xml  svn://myhome.com/svn/myproject/trunk/xml
于 2013-03-14T08:37:56.090 回答
0

我们在这里使用 Subversion,并使用 svn:externals(有点像符号链接)以便在项目之间共享某些公共代码(主要是 .jsp 文件)。工作得相当好,我们使用的是 OC4J,它实际上有一种在多个项目之间共享 .jsp 的方法,但是由于我们目前正在转向 Tomcat(或其他东西),所以我想提出一种与容器无关的方法来做到这一点。

于 2012-04-20T13:33:44.503 回答
0

在这种情况下,我的首选选项是将所有相关文件(控制器、js、图像......)放在一个 jar 中。但是这里的问题是JSP文件的使用:如果它们在 jar 中,就没有简单的方法来使用它们。但使用VelocityFreemarker等其他视图技术,这可以通过简单的方式实现,并具有其他优势。我不知道这是否会导致你做太多的工作,但对于有这些需求的新项目来说,这是最好的选择。

于 2012-03-07T09:01:58.320 回答