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

时间:2009-12-02 12:46:19

标签: java web-services tomcat servlets

我有一个处理http get请求的servlet,我希望能够共享一个对象,这个对象也是由开发的web服务使用的。它们都位于同一个Web应用程序容器中的同一个tomcat服务器上。我不确定如何做任何想法?

5 个答案:

答案 0 :(得分:6)

您可以将这些内容作为属性存储在ServletContext中(使用setAttribute / getAttribute),从而在整个网络应用中分享内容。您可以在ServletContextListener的紧急情况下创建对象,将其存储在ServletContext中,然后检索它并从您的Web服务和servlet中使用它。

答案 1 :(得分:2)

我将扩展我的评论here

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

为此,更好的方法是在webapp初始化期间将共享POJO存储在ServletContext中,并使用ServletContext.getAttribute在任何地方获取它。

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

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

当servlet容器加载webapp时,以及servlet容器即将卸载时,将调用此侦听器一次。在这两种情况下,它都会传递ServletContextEvent,其句柄为ServletContext。此时您想要设置/ removeAttribute指向您的共享对象。

因此,您可以确定ServletContext.getAttribute在从Servlet.service或其中一个do...方法调用时将返回有效对象。

至于属性名称,我会使用您的Shared class classname。我还要为您的共享类添加一个静态访问方法,以便从ServletContext获取它,如下所示:

public class Shared
{
  ...
  public static Shared fromServletContext ( final ServletContext context )
  {
    return (Shared) context.getAttribute( Shared.class.getName( ) );
  }
}

答案 2 :(得分:1)

最简单的选项是创建一个Singleton - 一个只允许内存中有一个实例的类。因为你通过在类本身上调用静态方法来获得它,它应该可用于servlet和WS

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

我认为您更需要HttpSession

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