模块化网络应用程序

时间:2008-09-24 08:46:05

标签: java web-applications jsf modularity

我最近一直在研究OSGi,并认为它对于模块化Java应用来说是一个非常好的主意。

但是,我想知道OSGi如何在Web应用程序中运行,在那里你不仅要担心代码 - 还有HTML,图像,CSS等等。

在工作中,我们正在构建一个具有多个“标签”的应用程序,每个标签都是应用程序的一部分。我认为这可以从采用OSGi方法中获益 - 但是我真的不确定什么是处理所有常用Web应用程序资源的最佳方式。

我不确定它是否有任何区别,但我们正在使用JSF和IceFaces(因为你有导航规则而又增加了另一层问题,你必须在网络中指定所有面部配置文件.xml ... doh!)

编辑:根据this thread,faces-config.xml文件可以从JAR文件中加载 - 因此实际上可以包含多个faces-config.xml文件而无需修改web.xml,前提是你分成JAR文件。

我们将非常感谢任何建议: - )

8 个答案:

答案 0 :(得分:36)

你认为这里有协同作用是非常正确的,我们有一个模块化的网络应用程序,其中应用程序本身是从独立组件(OSGi包)自动组装的,其中每个包提供自己的页面,资源,css和可选的javascript。 / p>

我们不使用JSF(Spring MVC),所以我不能评论OSGi上下文中该框架的复杂性。

大多数框架或方法仍然遵循“旧的”思维方式:一个WAR文件代表您的webapp,然后是许多OSGi捆绑和服务,但几乎没有任何关注GUI本身的模块化。

设计的先决条件

使用OSGi,首先要解决的问题是:您的部署方案是什么,谁是主要容器?我的意思是您可以在OSGi运行时上部署应用程序并将其基础结构用于所有内容。或者,您可以在传统的应用服务器中嵌入OSGi运行时,然后您将需要重新使用某些基础结构,特别是您希望使用AppServer的servlet引擎。

我们的设计目前基于OSGi作为容器,我们使用OSGi提供的HTTPService作为我们的servlet容器。我们正在考虑在外部servlet容器和OSGi HTTPService之间提供某种透明的桥接,但这项工作正在进行中。

Spring MVC + OSGi模块化webapp的架构草图

因此,目标不仅仅是通过OSGi提供Web应用程序,还要将OSGi的组件模型应用于Web UI本身,使其可组合,可重用,动态。

这些是系统中的组件:

  • 1个中心包,负责使用OSGi桥接Spring MVC,特别是使用code by Bernd Kolb允许您将OSDi注册为Spring DispatcherServlet作为servlet。
  • 1个自定义URL映射器,它被注入到DispatcherServlet中,并提供传入HTTP请求到正确控制器的映射。
  • 1个基于Sitemesh的中心装饰器JSP,用于定义站点的全局布局,以及我们希望提供的默认中央CSS和Javascript库。
  • 每个想要向我们的Web UI提供页面的包必须发布一个或多个控制器作为OSGi服务,并确保注册自己的servlet和自己的资源(CSS,JSP,图像等) )使用OSGi HTTPService。注册是通过HTTPService完成的,关键方法是:

    httpService.registerResources() 和 httpService.registerServlet()

当web ui贡献包激活并发布其控制器时,它们会被我们的中心web ui包自动选取,前面提到的自定义URL Mapper会收集这些Controller服务并保存到Controller实例的URL的最新映射。

然后当HTTP请求进入某个URL时,它会找到关联的控制器并在那里发送请求。

Controller完成其业务,然后返回应该呈现视图名称的任何数据(在我们的示例中为JSP)。这个JSP位于Controller的包中,可以由中央web ui bundle完全访问和呈现,因为我们使用HTTPService注册了资源位置。然后,我们的中心视图解析器将此JSP与我们的中心Sitemesh装饰器合并,并将生成的HTML吐出到客户端。

知道这是相当高的水平,但没有提供完整的实施,很难完全解释。

我们的关键学习点是用他的示例JPetstore转换为OSGi来查看what Bernd Kolb did,并使用该信息来设计我们自己的架构。

恕我直言,目前有太多的炒作,并专注于让OSGi以某种方式嵌入传统的基于Java EE的应用程序中,并且很少考虑实际使用OSGi成语及其出色的组件模型来真正允许组件化Web的设计应用

答案 1 :(得分:2)

查看SpringSource dm Server - 完全根据OSGi构建并支持模块化Web应用程序的应用程序服务器。它有免费,开源和商业版本。

您可以从部署标准WAR文件开始,然后逐渐将应用程序分解为OSGi模块,或者在OSGi中说“捆绑”。正如您对SpringSource的期望一样,服务器对Spring框架和相关Spring组合产品提供了出色的支持。

免责声明:我使用此产品。

答案 2 :(得分:2)

请注意Spring DM服务器licensing

答案 3 :(得分:1)

我们一直在使用Restlet和OSGi一起使用嵌入式Http服务(实际上是Jetty,但tomcat也可用)。

Restlet对XML配置的需求为零,我们所做的任何配置都在BundleActivator中(注册新服务)。

在构建页面时,我们只处理相关的服务实现以生成输出,装饰器样式。插入的新捆绑包将在下次渲染时添加新的页面装饰/小部件。

REST为我们提供了干净,有意义的URL,同一数据的多个表示,并且似乎是一个可扩展的隐喻(很少有动词,很多名词)。

我们的一个额外功能是对缓存的广泛支持,特别是ETag。

答案 4 :(得分:1)

SpringSource似乎正在开发一个基于OSGi构建的有趣的模块化Web框架,名为 SpringSource Slices 。更多信息可以在以下博客文章中找到:

答案 5 :(得分:0)

答案 6 :(得分:0)

看一下简单易学的http://www.ztemplates.org。这个允许您将所有相关模板,javascript和css放入一个jar中并透明地使用它。意味着您甚至不必关心在使用提供的组件时在页面中声明所需的javascript,因为框架会为您完成。

答案 7 :(得分:0)

有趣的帖子。我有一个基于每个客户定制的Web应用程序。每个客户都会根据他们注册的内容获得一组核心组件和其他组件。对于每个版本,我们必须“组装”正确的服务集,并根据客户应用正确的菜单配置(我们使用struts菜单),这至少可以说是乏味的。基本上它是相同的代码库,但我们只是自定义导航以显示或隐藏某些页面。这显然不太理想,我们希望利用OSGi来组件化服务。虽然我可以看到这是如何为服务API完成的,并且有点理解如何将CSS和java脚本和控制器(我们使用Spring MVC)等资源捆绑在一起,你将如何处理像页面导航这样的“交叉”问题和一般工作流程,尤其是在您想要动态部署新服务并需要向该服务添加导航的场景中。可能还有其他“跨领域”问题,例如跨越其他服务的服务。 谢谢, 德克兰。