当多个bundle使用相同的ServletContextHelper时,我需要一些关于与Http白板规范相关的ServletContextHelper行为的精确度
规范说:
Http Whiteboard实现必须创建一个单独的 每个ServletContextHelper服务的ServletContext实例。 白板服务可以与Servlet Context Helper相关联 使用osgi.http.whiteboard.context.select属性。如果这 未设置property,使用默认的Servlet Context Helper。
如果我理解正确,使用相同ServletContextHelper引用的所有Servlet或Filter都绑定到相同的ServletContext'
然后:
可以实现ServletContextHelper的一些实现 例如,使用服务工厂来提供资源 关联的bundle,作为默认实现。因此 白板实现必须使用Servlet Context Helper 注册白板的捆绑包的捆绑上下文 服务。
因此,如果bundle A使用ServletContextHelper X注册Servlet,而bundle B使用相同的ServletContextHelper引用注册一个Filter,那么Servlet和Filter将注册到同一个ServletContext,但是它们的init方法被调用为两个ServletContext的不同实例(为了以不同的方式实现getClassLoader()方法)?
此外,"默认"的行为是什么? ServletContextHelper?总是存在"默认" ServletContextHelper注册了吗?它是在bundle之间共享还是bundle只有一个实例?
答案 0 :(得分:1)
我在 Pax Web 8 上工作,我真的很想在那里获得正确的行为。
OSGi CMPN 规范的140.2.7 Relation to the Servlet Container chapter 展示了一张图片,其中实际上有 3 个 layers javax.servlet.ServletContext
对象:
ServletContext
实现。在 Pax Web 中,它是以下之一:
org.eclipse.jetty.servlet.ServletContextHandler.Context
org.apache.catalina.core.ApplicationContext
io.undertow.servlet.spec.ServletContextImpl
ServletContext
实现与 org.osgi.service.http.context.ServletContextHelper
OSGi 服务的 1:1 关系ServletContext
,其中除 getClassLoader()
之外的所有方法都委托给上述 SCH 并且 getClassLoader()
返回 bundle.adapt(BundleWiring.class).getClassLoader()
该问题与 org.osgi.service.http.context.ServletContextHelper
假定的双重责任原则有关。它用于实现功能方面 (handleSecurity()
) 和资源分离方面 (getResource()
)。
所以你是对的 - 如果 Bundle A 注册了一个 servlet,Bundle B 注册了一个过滤器,两者都将使用相同的 ServletContext 实例(由引用的 ServletContextHelper 支持),但它们的 init()
方法将提供不同的、特定于包的 ServletContext
实例。
这是简单的委托实现,有两种实现方式:
org.ops4j.pax.web.service.spi.servlet.OsgiServletContext
实现 1:1 行为org.ops4j.pax.web.service.spi.servlet.OsgiScopedServletContext
实现了 getClassLoader()
和 delegates 上面的所有其他方法OsgiServletContext