你认为这里有协同作用是非常正确的,我们有一个模块化的Web应用程序,其中应用程序本身是从独立的组件(OSGi捆绑包)自动组装的,其中每个捆绑包都贡献自己的页面,资源,css和可选的javascript。
我们不使用JSF(这里的Spring MVC),所以我不能评论OSGi上下文中该框架增加的复杂性。
大多数框架或方法仍然遵循“旧”的思维方式:一个WAR文件代表你的webapp,然后是许多OSGi捆绑包和服务,但几乎没有一个关注GUI本身的模块化。
设计的先决条件
使用OSGi,要解决的第一个问题是:您的部署场景是什么,谁是主要容器?我的意思是,您可以在OSGi运行时上部署应用程序,并将其基础架构用于所有事情。或者,您可以在传统的应用程序服务器中嵌入OSGi运行时,然后您需要重用一些基础架构,特别是您想要使用AppServer的servlet引擎。
我们的设计目前基于OSGi作为容器,我们使用OSGi提供的HTTPService作为我们的servlet容器。我们正在考虑在外部 servlet 容器和 OSGi HTTPService 之间提供某种透明的桥梁,但这项工作正在进行中。
Spring MVC + OSGi 模块化 Web 应用程序的架构草图
因此,目标不仅仅是通过OSGi为Web应用程序提供服务,而且还将OSGi的组件模型应用于Web UI本身,使其可组合,可重用,动态。
这些是系统中的组件:
当 Web ui 贡献捆绑包激活并发布其控制器时,我们的中央 Web UI 捆绑包会自动选取它们,并且上述自定义 URL 映射器会收集这些控制器服务,并保持到控制器实例的 URL 的最新映射。
然后,当HTTP请求进入某个URL时,它会找到关联的控制器并在那里调度请求。
控制器执行其业务,然后返回应呈现的任何数据和视图的名称(在本例中为 JSP)。这个JSP位于控制器的捆绑包中,可以由中央Web ui捆绑包访问和呈现,因为我们去HTTPService注册了资源位置。然后,我们的中心视图解析器将此 JSP 与我们的中央 Sitemesh 装饰器合并,并将生成的 HTML 输出给客户端。
要知道这是相当高的水平,但如果没有提供完整的实现,就很难完全解释。
我们的关键学习点是看看Bernd Kolb用他的JPetstore转换为OSGi的例子做了什么,并使用这些信息来设计我们自己的架构。
恕我直言,目前有太多的炒作和关注,以某种方式将OSGi嵌入到传统的基于Java EE的应用程序中,而很少考虑实际使用OSGi习语及其出色的组件模型来真正允许组件化Web应用程序的设计。