2012-03-07 78 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 
相关问题