Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用OSGi模块化JSF/Facelets/Spring应用程序?_Java_Spring_Osgi_Modularization - Fatal编程技术网

Java 如何使用OSGi模块化JSF/Facelets/Spring应用程序?

Java 如何使用OSGi模块化JSF/Facelets/Spring应用程序?,java,spring,osgi,modularization,Java,Spring,Osgi,Modularization,我正在使用非常大的JSF/Facelets应用程序,这些应用程序使用Spring进行DI/bean管理。 我的应用程序具有模块化结构,我目前正在寻找标准化模块化的方法 我的目标是由多个模块(可能相互依赖)组成一个web应用程序。每个模块可能包含以下内容: 班级 静态资源(图像、CSS、脚本) Facelet模板 托管bean—Spring应用程序上下文,包含请求、会话和应用程序范围的bean(另一种选择是JSF托管bean) ServletAPI的东西-Servlet、过滤器、监听器(这是可选

我正在使用非常大的JSF/Facelets应用程序,这些应用程序使用Spring进行DI/bean管理。 我的应用程序具有模块化结构,我目前正在寻找标准化模块化的方法

我的目标是由多个模块(可能相互依赖)组成一个web应用程序。每个模块可能包含以下内容:

  • 班级
  • 静态资源(图像、CSS、脚本)
  • Facelet模板
  • 托管bean—Spring应用程序上下文,包含请求、会话和应用程序范围的bean(另一种选择是JSF托管bean)
  • ServletAPI的东西-Servlet、过滤器、监听器(这是可选的)
我想避免的是(几乎不惜一切代价)需要将模块资源(如Facelets模板)复制或提取到WAR中,或者为模块的servlet、过滤器等扩展
web.xml
。将模块(JAR、bundle、artifact等)添加到web应用程序中就足够了(
WEB-INF/lib
bundles
插件
,…)使用此模块扩展WEB应用程序

目前,我使用自定义模块化解决方案解决此任务,该解决方案主要基于使用类路径资源:

  • 特殊资源servlet服务于类路径资源(JAR)中的静态资源
  • 特殊的Facelets资源解析器允许从类路径资源加载Facelets模板
  • Spring通过模式
    classpath*:com/acme/foo/module/applicationContext.xml
    加载应用程序上下文-加载模块JAR中定义的应用程序上下文
  • 最后,一对委托servlet和过滤器从模块中将请求处理委托给在Spring应用程序上下文中配置的servlet和过滤器
前几天我读了很多关于OSGi的书,我在考虑如何(如果)将OSGi作为标准化的模块化方法。我在考虑如何使用OSGi解决单个任务:

  • 静态资源—要导出静态资源的OSGi捆绑包在捆绑包上下文中注册
    ResourceLoader
    实例。中央
    ResourceServlet
    使用这些资源加载器从捆绑包加载资源
  • Facelet模板-与上面类似,中央
    ResourceResolver
    使用捆绑包注册的服务
  • 托管bean-如果在其中一个bundle中定义了
    myBean
    ,我不知道如何使用类似
    {myBean.property}
    的表达式
  • ServletAPI的东西-使用WebExtender/PaxWeb之类的东西来注册Servlet、过滤器等等

我的问题是:

  • 我在这里发明了一辆自行车吗?有没有标准的解决方案?我发现了弹簧片,但找不到太多关于它的文档
  • 您认为OSGi是完成所述任务的合适技术吗
  • 我的OSGI应用程序草图是否正确
  • 如何处理托管bean(特别是请求/会话范围)

我非常感谢您的评论。

您应该研究Spring DM Server(它正在转换为Eclipse Virgo,但尚未发布)。最近发布的OSGi enterprise规范中有很多好东西

我想,一些Spring DM教程会有所帮助。但是,是的,可以使用标准模块化从web包外部加载资源和类。在这方面,它非常适合

至于会话上下文,它的处理方式与您在会话中所期望的一样。但是,在web捆绑包之间共享该会话时,您可能会遇到问题,甚至无法确定这是否可行


您也可以考虑使用一个web捆绑包,然后使用Eclipse扩展注册表来扩展web应用程序的功能。

企业OSGi是一个相当新的领域,因此不要认为您将获得一个直接满足您需要的解决方案。这就是我在Equinox中发现的缺失之一(eclipse背后的osgi引擎,因此也是拥有最大用户群的引擎!)是一个一致的配置/DI服务

模块化应用程序固有的问题之一是DI,因为模块可见性在某些情况下可能会阻止类访问。我们使用注册伙伴策略解决了这一问题,该策略虽然不太理想,但很有效

除了配置之外,您还可以查看最近发布的Equinox书籍,了解如何使用OSGi作为创建模块化应用程序的基础。这些示例可能特定于Equinox,但这些原则适用于任何OSGi框架。链接-

web模块部署描述符片段(又称web fragment.xml)在这里由用户介绍会更好。规范将其定义为:

web片段是一个逻辑片段 在这种情况下对web应用程序进行分区 使用框架的方式 在web应用程序中,可以定义所有 未经开发者许可的工件 在中编辑或添加信息 web.xml


不过,Java EE 6目前可能不是您的选择。尽管如此,它仍将是标准化的解决方案。

您的目标听起来是可行的,但有几点需要注意:

视图层:首先,您的视图层听起来有点臃肿。还有其他方法可以通过使用自定义组件来模块化JSF组件,这将避免尝试创建像后期绑定托管bean这样引人注目的组件所带来的麻烦

模块本身:其次,您的模块似乎不是特别模块化的。您的第一个项目符号列表听起来好像您在尝试创建可互操作的web应用程序,而不是每个模块