您认为这里有协同作用是非常正确的,我们有一个模块化的 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 模块化 webapp 的架构草图
因此,我们的目标不仅仅是通过 OSGi 为 Web 应用程序提供服务,还要将 OSGi 的组件模型应用于 Web UI 本身,使其可组合、可重用和动态。
这些是系统中的组件:
当一个 web ui 贡献包激活并发布它的控制器时,它们会被我们的中央 web ui 包自动拾取,并且前面提到的自定义 URL 映射器收集这些控制器服务并保持到控制器实例的 URL 的最新映射。
然后,当某个 URL 的 HTTP 请求进入时,它会找到关联的控制器并在那里分派请求。
控制器执行它的业务,然后返回任何应该呈现的数据和视图的名称(在我们的例子中是一个 JSP)。这个 JSP 位于 Controller 的 bundle 中,并且可以被中央 web ui bundle 访问和呈现,因为我们已经使用 HTTPService 注册了资源位置。然后,我们的中央视图解析器将此 JSP 与我们的中央 Sitemesh 装饰器合并,并将生成的 HTML 输出给客户端。
知道这是相当高的水平,但如果不提供完整的实现,很难完全解释。
我们的关键学习点是查看Bernd Kolb 对他的示例 JPetstore 转换为 OSGi 所做的工作,并使用该信息来设计我们自己的架构。
恕我直言,目前有太多的炒作和专注于让 OSGi 以某种方式嵌入到传统的基于 Java EE 的应用程序中,而很少考虑实际利用 OSGi 惯用语及其出色的组件模型来真正允许组件化 Web 应用程序的设计。