Java 模块化web应用程序

Java 模块化web应用程序,java,web-applications,jsf,modularity,Java,Web Applications,Jsf,Modularity,我最近一直在研究模块化Java应用程序,并认为这是一个非常好的想法 然而,我想知道OSGi如何在web应用程序中工作,在web应用程序中,您不仅需要担心代码,还需要担心HTML、图像、CSS之类的东西 在工作中,我们正在构建一个具有多个“选项卡”的应用程序,每个选项卡都是应用程序的一部分。我认为,采用OSGi方法确实可以带来好处,但我真的不确定处理所有常见web应用资源的最佳方式是什么 我不确定这是否有什么不同,但我们使用的是JSF和(这又增加了一层问题,因为您有导航规则,必须在web.xml…

我最近一直在研究模块化Java应用程序,并认为这是一个非常好的想法

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

在工作中,我们正在构建一个具有多个“选项卡”的应用程序,每个选项卡都是应用程序的一部分。我认为,采用OSGi方法确实可以带来好处,但我真的不确定处理所有常见web应用资源的最佳方式是什么

我不确定这是否有什么不同,但我们使用的是JSF和(这又增加了一层问题,因为您有导航规则,必须在web.xml…doh!中指定所有面配置文件)

编辑:根据,faces-config.xml文件可以从JAR文件加载,因此实际上可以包含多个faces-config.xml文件,而无需修改web.xml,只要将其拆分为JAR文件


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

您认为这里有协同作用是非常正确的,我们有一个模块化的web应用程序,其中应用程序本身由独立组件(OSGi捆绑包)自动组装而成,每个捆绑包提供自己的页面、资源、css和可选的javascript

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

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

设计的先决条件 对于OSGi,首先要解决的问题是:您的部署场景是什么,谁是主要容器?我的意思是,您可以在OSGi运行时上部署应用程序,并将其基础设施用于所有事情。或者,您可以在传统的应用程序服务器中嵌入OSGi运行时,然后需要重用一些基础设施,特别是您希望使用应用程序服务器的servlet引擎

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

SpringMVC+OSGi模块化webapp的架构草图 因此,我们的目标不仅仅是通过OSGi为web应用程序提供服务,而是将OSGi的组件模型应用到web UI本身,使其具有可组合性、可重用性和动态性

这些是系统中的组件:

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

    httpService.registerResources() 和 httpService.registerServlet()

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

然后,当某个URL的HTTP请求传入时,它会找到关联的控制器并将请求分派到该控制器

控制器执行其业务,然后返回任何应该呈现的数据和视图的名称(在本例中是JSP)。这个JSP位于控制器的捆绑包中,可以由中央WebUI捆绑包访问和呈现,这正是因为我们使用HTTPService注册了资源位置。然后,我们的中心视图解析器将此JSP与我们的中心Sitemesh装饰器合并,并将生成的HTML输出到客户端

在我看来,这是一个相当高的层次,但如果不提供完整的实现,很难完全解释

我们在这方面的关键学习点是通过他的示例JPetstore转换为OSGi,并使用这些信息来设计我们自己的体系结构

我想,目前有太多的炒作和关注让OSGi以某种方式嵌入到传统的基于Java EE的应用程序中,很少有人考虑实际使用OSGi习惯用法及其优秀的组件模型来真正允许设计组件化的web应用程序。

我们一直在使用OSGi,并取得了良好的效果嵌入式Http服务(在封面下它实际上是Jetty,但tomcat也可用)

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

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

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

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

看看RAP

看看哪个简单易学。这一个允许您放置所有相关的模板,javascript和