草庐IT

java - 模块化网络应用

coder 2023-05-15 原文

我最近一直在研究OSGi,认为对于模块化Java应用程序来说,这似乎是一个非常不错的主意。

但是,我想知道OSGi如何在Web应用程序中工作,而您不仅仅需要担心代码-HTML,图像,CSS之类的事情。

在工作中,我们正在构建一个具有多个“标签”的应用程序,每个标签都是应用程序的一部分。我认为这可以从采用OSGi的方法中真正受益-但是我真的不确定什么是处理所有常规Web应用程序资源的最佳方法。

我不确定这是否有任何区别,但是我们使用的是JSF和IceFaces(这又增加了另一层问题,因为您具有导航规则,并且必须在web.xml中指定所有face config文件... Doh! )

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

任何建议将不胜感激 :-)

最佳答案

您非常认为这里有协同作用,我们有一个模块化的Web应用程序,该应用程序本身是由独立组件(OSGi bundle 软件)自动组装而成的,每个 bundle 软件都贡献了自己的页面,资源,css和可选的javascript。

我们不使用JSF(此处为Spring MVC),因此我无法评论在OSGi上下文中该框架增加的复杂性。

那里的大多数框架或方法仍然遵循“旧的”思维方式:一个代表您的Web应用程序的WAR文件,然后是许多OSGi bundle 软件和服务,但几乎没有人关心GUI本身的模块化。

设计先决条件

使用OSGi,要解决的第一个问题是:您的部署方案是什么,谁是主要容器?我的意思是,您可以在OSGi运行时上部署应用程序,并使用其基础结构进行所有操作。另外,您可以将OSGi运行时嵌入到传统的应用服务器中,然后需要重新使用某些基础结构,特别是要使用AppServer的servlet引擎。

当前,我们的设计基于OSGi作为容器,并且我们使用OSGi提供的HTTPService作为我们的servlet容器。我们正在寻求在外部servlet容器和OSGi HTTPService之间提供某种透明的桥梁,但是这项工作仍在进行中。

Spring MVC + OSGi模块化Webapp的架构图

因此,目标不仅是通过OSGi服务Web应用程序,而且还将OSGi的组件模型应用于Web UI本身,以使其可组合,可重用,动态。

这些是系统中的组件:

  • 1个中央软件包,负责将Spring MVC与OSGi桥接,特别是它使用code by Bernd Kolb允许您将OSGi的Spring DispatcherServlet注册为Servlet。
  • 1个自定义URL映射器,已注入(inject)DispatcherServlet中,并提供将传入的HTTP请求映射到正确的 Controller 。
  • 1个基于Sitemesh的中央装饰器JSP,用于定义网站的全局布局以及我们要提供的默认CSS和Java中央库。
  • 每个要向我们的Web UI贡献页面的包都必须发布1个或多个Controller作为OSGi服务,并确保向OSGi HTTPService注册自己的servlet和自己的资源(CSS,JSP,图像等)。注册是通过HTTPService完成的,主要方法是:

    httpService.registerResources()

    httpService.registerServlet()

  • 当一个Web ui贡献 bundle 包激活并发布其 Controller 时,它们将由我们的中央Web ui bundle 包自动拾取,并且上述自定义URL映射器将收集这些Controller服务并保持URL到Controller实例的最新映射。

    然后,当针对某个URL的HTTP请求进入时,它会找到关联的 Controller 并将请求分派(dispatch)到那里。

    Controller完成其业务,然后返回应呈现为 View 名称的所有数据(在本例中为JSP)。此JSP位于Controller的 bundle 软件中,并且可以由中央Web ui bundle 软件访问和呈现此JSP,这恰恰是因为我们通过HTTPService注册了资源位置。然后,我们的中央 View 解析器将此JSP与我们的中央Sitemesh装饰器合并,并将生成的HTML吐出到客户端。

    众所周知,这是一个很高的层次,但是如果没有提供完整的实现,则很难完全解释。

    为此,我们的主要学习点是查看what Bernd Kolb did及其示例,该示例将JPetstore转换为OSGi,并使用该信息设计我们自己的体系结构。

    恕我直言,目前有太多的炒作,并且专注于以某种方式将OSGi嵌入到基于Java EE的传统应用程序中,几乎没有考虑过实际使用OSGi习惯用法及其出色的组件模型来真正允许设计组件化Web应用程序。

    关于java - 模块化网络应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/126073/

    有关java - 模块化网络应用的更多相关文章

    1. ruby - 在 Ruby 中使用匿名模块 - 2

      假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

    2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

      作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

    3. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    4. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

      我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

    6. ruby - 无法运行 Rails 2.x 应用程序 - 2

      我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

    7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

      刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

    8. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    9. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

      我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

    10. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

      我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

    随机推荐