当前位置: 首页 > 面试题库 >

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

尹赞
2023-03-14
问题内容

我正在使用将Spring用于DI / bean管理的超大型JSF /
Facelets应用程序。我的应用程序具有模块化结构,我目前正在寻找使模块化标准化的方法。

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

  • 类;
  • 静态资源(图像,CSS,脚本);
  • Facelet模板;
  • 托管Bean-具有请求,会话和应用程序范围的Bean的Spring应用程序上下文(或者是JSF托管Bean);
  • Servlet API内容-Servlet,过滤器,侦听器(这是可选的)。

我要避免的(几乎不惜一切代价)是需要将模块资源(例如Facelets模板)复制或提取到WAR或扩展web.xmlfor模块的servlet,过滤器等。添加模块必须足够(JAR,捆绑,伪影,…)到web应用(WEB- INF/libbundlesplugins,…)来延伸,以与该模块的Web应用程序。

当前,我使用定制的模块化解决方案来解决此任务,该解决方案很大程度上基于使用类路径资源:

  • 特殊资源servlet从类路径资源(JAR)提供静态资源。
  • 特殊的Facelets资源解析器允许从类路径资源加载Facelet模板。
  • Spring通过模式 classpath*:com/acme/foo/module/applicationContext.xml加载应用程序上下文-这将加载模块JAR中定义的应用程序上下文。
  • 最后,一对委托servlet和过滤器将请求处理委托给模块中在Spring应用程序上下文中配置的servlet和过滤器。

最近几天,我读了很多关于OSGi的文章,我正在考虑如何(以及是否)可以将OSGi用作标准化的模块化方法。我在考虑如何使用OSGi解决单个任务:

  • 静态资源-想要导出静态资源的OSGi捆绑包会ResourceLoader在捆绑包上下文中注册一个实例。中心ResourceServlet使用这些资源加载器从捆绑软件加载资源。
  • Facelet模板-与上面类似,中心ResourceResolver使用捆绑软件注册的服务。
  • 托管豆- 我不知道 如何使用的语句,比如#{myBean.property},如果myBean在束的一个定义。
  • Servlet API内容-使用WebExtender / Pax Web之类的东西注册Servlet,过滤器等。

我的问题是:

  • 我在这里发明自行车吗?有标准的解决方案吗?我找到了有关Spring Slices的信息,但找不到有关它的大量文档。
  • 您认为OSGi是完成上述任务的正确技术吗?
  • 我对OSGI应用程序的了解大致正确吗?
  • 应该如何处理托管bean(尤其是请求/会话范围)?

对于您的评论,我将不胜感激。


问题答案:

您要做的事情听起来可行,但有一些警告:

View层:
首先,您的View层听起来有点过硬。还有其他使用自定义组件来模块化JSF组件的方法,这些方法可以避免尝试创建与后期绑定托管Bean一样引人注目的内容所带来的麻烦。

模块本身:
第二,您的模块似乎并不是特别模块化。您的第一个项目符号列表听起来像是您在尝试创建可互操作的Web应用程序,而不是模块本身。我对模块的想法是,每个组件都有明确的目的,或多或少是离散的。怎么样
underlies 。如果您沿着OSGi路线走,那么我们应该这样定义模块化: 出于讨论的目的,模块化意味着组件可以热插拔-
也就是说,可以在 不破坏应用程序的情况下添加 和删除组件

依赖关系: 您对模块的描述“可能彼此 依赖”,
我对此有些担心。您可能(我希望)已经知道这一点,但是您的依存关系应该形成有向无环图。一旦引入了循环依赖关系,就要求对应用程序的最终可维护性造成伤害。OSGi的最大弱点之一是它
不能 防止循环依赖,因此要由您来强制执行此操作。否则,您的依赖关系将像葛根一样增长,并逐渐阻塞系统的其余生态系统。

Servlet: Fuhgeddaboudit。您不能将Servlet后期绑定到Web应用程序中,除非Servlet
3.0规范正式投入生产(如Pascal所指出)。要启动一个单独的实用程序servlet,您需要将其放入自己的应用程序中。

好的,需要多加注意。让我们考虑一下这可能如何工作:

您已经定义了自己的JSF模块来执行…到底是什么?让我们给它一个定义的,相当琐碎的目的:一个登录屏幕。因此,您创建了登录屏幕,然后使用OSGi将其后期绑定到您的应用程序中,然后呢?如果您尚未在.jspx页面中定义登录功能,应用程序如何知道该功能?应用程序如何知道导航到它不知道的地方?

有多种方法可以使用条件包含等(例如`<c:if

您可以在其中一个模块中定义一个API。
您打算在模块之间共享的所有托管bean必须在此API层中指定为接口。并且您的所有模块都必须具有要使用的任何这些接口的默认实现。并且此API必须在所有可互操作的模块之间共享。然后,您可以使用OSGi和Spring将指定的bean及其实现连接在一起。

我需要花点时间指出这不是我要解决的问题。
一点也不。给定像登录页面一样简单,甚至像股票图表一样复杂的东西,我个人更喜欢创建一个自定义JSF组件。但是,如果要求是“我希望我的托管bean是模块化的(例如,可热插拔等),”这是我知道使其工作的唯一方法。我什至不能完全确定它是否
起作用。这次电子邮件交流表明,这是JSF开发人员才刚刚开始研究的问题。

我通常认为托管bean是视图层的一部分,因此,我仅将它们用于视图逻辑,并将其他所有内容委托给服务层。在我看来,使托管bean后期绑定是将它们提升到视图层之外并进入业务逻辑。所有这些教程都如此专注于服务是有原因的:因为大多数时候,您都想考虑应用程序“无头”运行所需要的时间,以及如果“换肤”您的视图很容易,例如,您希望它及其所有功能都可以在Android手机上运行。

但这听起来像是您正在使用的很多东西本身就是视图逻辑-例如,需要交换其他视图模板。OSGi /
Spring应该能够提供帮助,但是您需要在应用程序中进行一些选择才能在可用的实现之间进行选择:几乎是OSGi的Service Registry要做的。

剩下静态资源。您可以对它们进行模块化,但是请记住,您需要定义一个接口来检索这些资源,并且需要提供默认的实现,因此您的应用程序不会因缺少资源而阻塞。如果考虑使用i18n,这可能是个不错的选择。如果您想
真正
冒险,那么可以将静态资源放入JNDI。这将使它们完全可热交换,并避免尝试以编程方式解决要使用的实现的麻烦,但是存在一些弊端:任何失败的查找都将导致您的应用抛出NamingException。而且这太过分了。JNDI通常在Web应用程序中用于应用程序配置。

至于您剩下的问题:

我在这里发明自行车吗?有标准的解决方案吗?

你有一点。我见过执行 此类操作 的应用程序,但您似乎偶然发现了一组相当独特的要求。

您认为OSGi是完成上述任务的正确技术吗?

如果您需要可热交换的模块,则可以选择OSGi和更轻便的ServiceLocator界面。

我对OSGI应用程序的了解大致正确吗?

我真的不能不知道更多关于组件边界的信息。目前看来,您可能正在推动OSGi做更多的事。

但是不要相信我。我
在这些地方找到了
其他阅读材料。

而且,既然您询问有关Spring
Slices的信息,这应该足以让您入门。您将需要一个Git客户端,并且看起来您将通过查看源代码来在应用程序上训练自己。这是非常早期的原型代码。



 类似资料:
  • 问题内容: 我有一个定义明确的界面的应用程序。它使用CDI解析模块(具体地说,它使用API​​接口上的Instance <>注入点来解析模块),并通过接口将各种数据传回第四个,而不会出现问题。我故意将API和实现分开,并且模块仅从API继承以避免紧密耦合,并且应用程序仅通过运行时相关性以及通过API完成的数据传递来了解模块。应用程序在没有模块的情况下运行良好,只需将jar放到WEB- INF /

  • 问题内容: 我一直在寻找创建模块化Web应用程序的解决方案,该模块是模块化的,即用户可以以简单jar的形式提供自己的插件,然后将其自身的数据提供给我的Web应用程序,而我的webapp将负责用于显示它。 现在的问题是,我希望我的Web应用程序尽可能通用,而不依赖于j2ee Web容器来支持任何内容。即,我不能依靠我的Web容器来提供osgi支持并将Web应用程序作为osgi捆绑包本身部署(这确实使

  • 问题内容: 我想使用Spring Security Facelets标记库来保护我的JSF 2页面中的UI组件 我对Spring Security版本3.0.5具有以下依赖性: 我配置了applicationSecurity.xml以进行Spring安全性登录,并且它可以与UserDetailsS​​ervice一起正常工作,并且在尝试添加安全性定义时: 当运行该应用程序时,出现以下错误: 问题答

  • 主要内容:模板标签,创建Facelets模板模板是提供实现用户界面的工具的工具。 模板化是一个有用的功能,允许您创建一个页面,作为应用程序中其他页面的基础。 通过使用模板,您可以重用代码,并避免重复类似的页面。模板化还有助于简化在具有大量页面的应用程序中维护标准外观和感觉。 下表包含用于创建模板的Facelets标签。 模板标签 标签 功能 它用于定义创建并添加到组件树的组件。 它用于定义可选地使用模板的页面组合,此标记之外的内容将被忽略。

  • 我试图使我的Java应用程序模块化,这样就会有一个核心的基础模块,一个客户端将不得不aqcuire,但他/她将能够添加额外的功能/插件,因为他们出现了,或者她的需求扩展。 我计划在客户端pc中有一个名为modules/plugins的子目录,任何插件应用程序都将作为一个目录包含在内。jar文件。当用户启动应用程序时,主模块将在最后一项中包含这些其他插件,例如,一个舞台将在同一场景中包含来自主模块和

  • 我有1个应用程序和2个模块 框架结构 但我不能在MyApp中使用MyModule的文件。IDE显示我“无法访问”错误,我想扩展一个MyModule类的类。而且它不是从MyModule创建类的,有人对此有想法吗?怎么了?