代码之家  ›  专栏  ›  技术社区  ›  wmitchell

在servlet和WebService之间共享静态对象

  •  3
  • wmitchell  · 技术社区  · 15 年前

    我有一个servlet,它处理HTTP GET请求,我希望能够共享一个对象,这个对象也被我开发的WebService使用。它们都在同一个Web应用容器中的同一个Tomcat服务器上。我不知道怎么做最好有什么想法吗?

    5 回复  |  直到 15 年前
        1
  •  6
  •   skaffman    15 年前

    您可以通过将它们作为属性存储在 ServletContext (使用) setAttribute / getAttribute )您可以在 ServletContextListener ,存储在 ServletContext ,然后从Web服务和servlet中检索并使用它。

        2
  •  2
  •   Community CDub    8 年前

    我将进一步阐述我的意见 here .

    在最简单的情况下 ServletContext.setAttribute/getAttribute 会很好的。但是有些人正确地提出了关于线程安全的问题。

    为此,更好的方法是在 ServletContext 在webapp初始化期间,使用 ServletContext.getAttribute .

    为此,您需要实施 ServletContextListener 接口并在web.xml文件中声明它。

    <listener>
      <listener-class>your.package.ServletContextListenerImpl</listener-class>
    </listener>
    

    当您的webapp由servlet容器加载时,以及当它即将由servlet容器卸载时,将调用此侦听器一次。在这两种情况下,它都会通过 ServletContextEvent 有一个把手 服务上下文 .此时,您需要设置/删除指向共享对象的属性。

    因此,当从 Servlet.service 或者其中之一 do... 方法。

    至于属性名,我将使用您的共享类类名。我还将向共享类添加一个静态访问方法,以从 servletContext ,像这样:

    public class Shared
    {
      ...
      public static Shared fromServletContext ( final ServletContext context )
      {
        return (Shared) context.getAttribute( Shared.class.getName( ) );
      }
    }
    
        3
  •  1
  •   David Rabinowitz    15 年前

    最简单的选择是创建 Singleton -在内存中只允许一个实例的类。由于是通过对类本身调用静态方法获得的,所以servlet和ws都应该可以使用它。

        4
  •  0
  •   Bozho    15 年前

    如果我对这个问题的另一种理解是正确的,那么应该存储来自请求的数据,然后由Web服务检索。如果要在多用户环境中运行,可以考虑使用内存中的数据库( HSQLDB )临时存储数据。然后你就可以用你的网络服务来检索它了,这是基于一些我无法预测的标准。

        5
  •  0
  •   BalusC    15 年前

    如果这是特定于应用程序的数据(所有用户(会话)都可以访问),则使用 ServletContext#set/getAttribute() . 如果这是用户(会话)特定的数据,则使用 HttpSession#set/getAttribute() .

    让servlet类通过特定的属性键在所需范围(应用程序或会话)中设置对象,并让WebService通过相同的属性键从所需范围中获取对象。

    我觉得你更需要 HttpSession .

    这里的单身故事毫无意义。