代码之家  ›  专栏  ›  技术社区  ›  user7094

模块化Web应用程序

  •  31
  • user7094  · 技术社区  · 16 年前

    我一直在调查 OSGi 最近,它看起来像是一个很好的模块化Java应用程序的想法。

    然而,我想知道OSGi如何在Web应用程序中工作,在那里您不仅需要担心代码——还有HTML、图像、CSS之类的东西。

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

    我不确定是否有什么区别,但我们使用的是JSF和 IceFaces (这增加了另一层问题,因为您有导航规则,并且必须在web.xml中指定所有faces配置文件…多哈!

    编辑:根据 this thread ,faces-config.xml文件可以从jar文件中加载,因此实际上可以在不修改web.xml的情况下包含多个faces-config.xml文件,前提是将这些文件拆分为jar文件。

    如有任何建议,我们将不胜感激:—)

    8 回复  |  直到 11 年前
        1
  •  36
  •   Arjan Tijms UML GURU    11 年前

    您认为这里存在协同效应是非常正确的,我们有一个模块化的Web应用程序,在这个应用程序本身由独立的组件(OSGi包)自动组装而成,每个包贡献自己的页面、资源、CSS和可选的javascript。

    我们不使用JSF(这里是SpringMVC),所以我不能在OSGi上下文中评论该框架增加的复杂性。

    现在的大多数框架或方法仍然坚持“旧”的思维方式:一个war文件代表您的webapp,然后是许多osgi包和服务,但几乎没有人关心GUI本身的模块化。

    设计的先决条件

    对于OSGi,要解决的第一个问题是:您的部署场景是什么,主容器是谁?我的意思是,您可以在OSGi运行时上部署您的应用程序,并使用它的基础设施来完成所有工作。或者,您可以将OSGi运行时嵌入到传统的应用服务器中,然后需要重新使用一些基础结构,特别是要使用AppServer的servlet引擎。

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

    SpringMVC+OSGi模块化webapp的架构示意图

    因此,我们的目标不仅是通过OSGi为Web应用程序提供服务,而且要将OSGi的组件模型应用到Web UI本身,使其具有可组合性、可重用性和动态性。

    这些是系统中的组件:

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

      httpservice.registerresources()。 和 httpservice.registerservlet()。

    当Web UI贡献包激活并发布其控制器时,它们会自动被我们的中央Web UI包接收,并且上述自定义URL映射器收集这些控制器服务并保持到控制器实例的最新URL映射。

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

    控制器执行其业务,然后返回应呈现的任何数据 视图的名称(在我们的例子中是一个JSP)。这个JSP位于控制器的包中,并且可以由中央Web UI包访问和呈现,这正是因为我们在httpservice中注册了资源位置。然后,我们的中心视图解析器将这个JSP与我们的中心SiteMesh装饰器合并,并将生成的HTML输出给客户机。

    据了解,这是相当高的水平,但如果没有提供完整的实现,就很难完全解释。

    我们学习的重点是 what Bernd Kolb did 通过他的示例jpetstore转换到OSGi并使用这些信息来设计我们自己的体系结构。

    IMHO目前有太多的炒作和重点是如何使OSGi不知何故嵌入在传统的基于Java EE的应用程序中,并且很少考虑实际使用OSGi成语及其优秀的组件模型来真正允许组件化Web应用程序的设计。

        2
  •  2
  •   glyn    15 年前

    退房 SpringSource dm Server -完全基于OSGi构建并支持模块化Web应用程序的应用服务器。它提供免费、开源和商业版本。

    您可以首先部署一个标准的war文件,然后逐步将应用程序分解为OSGi模块,或者在OSGi语言中称为“bundles”。正如您对SpringSource所期望的那样,服务器对Spring框架和相关的Spring产品组合提供了极好的支持。

    免责声明:我致力于此产品。

        3
  •  2
  •   MikeNereson    15 年前

    了解Springdm服务器 licensing .

        4
  •  1
  •   jamesh    16 年前

    我们一直在使用 Restlet 有了OSGi,嵌入的HTTP服务效果很好(在封面下,它实际上是Jetty,但Tomcat也可用)。

    restlet有零到最小的XML配置需求,我们所做的任何配置都在bundleaactivator(注册新服务)中。

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

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

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

        5
  •  1
  •   Pavol Juhos    15 年前

    SpringSource似乎正在开发一个基于OSGi的有趣的模块化Web框架 泉源切片 . 更多信息可在以下博客文章中找到:

        6
  •  0
  •   David    16 年前
        7
  •  0
  •   Gerd Ziegler    16 年前

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

        8
  •  0
  •   Declan Cox    15 年前

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