我有一个处理http get请求的servlet,我希望能够共享一个对象,这个对象也是由开发的web服务使用的。它们都位于同一个Web应用程序容器中的同一个tomcat服务器上。我不确定如何做任何想法?
答案 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
。
单身人士的故事在这里毫无意义。