在类似的Web应用程序之间共享Web层代码(控制器和JSP)的最佳实践

时间:2012-03-07 06:26:55

标签: java spring maven spring-mvc sitemesh

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

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

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

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

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

我认为根据环境变量或来自不同数据库的设置,只能将相同的WAR文件作为“模式”运行。其中一个差异是完全不同的Spring Security配置。最好将其他网站的登录和结帐控制器从组件扫描中移除,这样任何人都无法通过URL操作以某种方式错误地转换到错误的控制器。

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

有更好的方法吗? Maven WAR Overlays怎么样?我看到人们谈论使用叠加来共享CSS,JS,图像甚至一些常见的JSP等公共资源。但我没有看到有人提到像控制器这样的方式共享类。

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

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

我必须相信其他人之前已经处理过此事。我想错了吗?这种事情有共同的解决方案吗?

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

这是完美的答案。你必须参考以下网址,它可以解雇你。

click here

在网址页面中,属性内容框的示例并不准确,您关注我:

如果需要共享文件:

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

如果需要共享文件夹:

xml  svn://myhome.com/svn/myproject/trunk/xml