2009-12-02 39 views
3

我有一个处理http get请求的servlet,我希望能够共享一个web服务正在开发的对象。它们都在同一个web-app容器中的同一个tomcat服务器上。我不知道如何去做任何想法?在servlet和webservice之间共享一个静态对象

+0

你想以什么方式分享?请求中的数据如何在您的Web服务中使用。 – Bozho 2009-12-02 12:58:39

+0

该请求用于填充此对象中的数据。稍后的web服务(发生一系列事件时)会更新此数据的各个方面。 – wmitchell 2009-12-02 14:10:18

回答

6

您可以通过在ServletContext(使用setAttribute/getAttribute)中存储它们作为属性来跨Web应用共享内容。您可以在ServletContextListener的推动下创建对象,将其存储在ServletContext中,然后检索并从Web服务和servlet中使用它。

+0

但记住,如果多个用户连接到您的servlet,这是不安全的。它可能会导致意想不到的结果。 – Bozho 2009-12-02 13:00:03

+0

你为什么这么说? – skaffman 2009-12-02 13:10:56

+0

无论如何你需要以线程安全的方式编写这个对象。 – 2009-12-02 13:15:31

1

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

+2

只有当servlet和web服务是在同一个类加载器... – Nate 2009-12-02 14:22:17

+0

我从这个问题的假设是,这两个位于同一个webapp,然后没有问题。但是,您的评论是正确的。 – 2009-12-02 15:40:48

2

我将扩展我的评论here

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

为此,更好的方法是在webapp初始化过程中将共享的POJO存储在ServletContext中,并通过ServletContext.getAttribute将其存储在任何需要的位置。

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

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

这听众当你的web应用程序是由servlet容器装载被调用一次,当它即将由servlet容器被卸载。在两种情况下,它都通过ServletContextEvent,其手柄号码为ServletContext。正是在这一点上,你想设置/ removeAttribute指向你的共享对象。

因此,您可能确定ServletContext.getAttribute在从Servlet.servicedo...方法之一调用时将返回有效的对象。

至于属性名称,我会去你的共享类classname。我还要补充的静态访问方法来共享类从ServletContext得到它,就像这样:

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

如果我的问题的另一种理解是正确的,它来源于请求的数据应该存储,并然后通过网络服务撤回。如果这应该在多用户环境中运行,则可以考虑使用内存数据库(HSQLDB)临时存储数据。然后,根据我无法预知的一些标准,您可以使用您的Web服务检索它。

0

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

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

我觉得你宁可需要HttpSession

单身故事在这里没有意义。

+0

我有一种感觉,网络服务被不同的机器/浏览器调用,从而产生不同的会话。但这里的情况很模糊。 – Bozho 2009-12-02 21:25:13