有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在servlet和Web服务之间共享静态对象的java

我有一个servlet,它处理HTTPGET请求,我希望能够共享一个对象,这个对象也被我开发的Web服务使用。它们都位于同一web应用程序容器中的同一个tomcat服务器上。我不知道怎么做最好有什么想法吗


共 (5) 个答案

  1. # 1 楼答案

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

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

    我想你更需要HttpSession

    单身汉的故事在这里毫无意义

  2. # 2 楼答案

    我将进一步阐述我的评论

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

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

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

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

    当servlet容器加载webapp时,以及当servlet容器即将卸载webapp时,会调用此侦听器一次。在这两种情况下,它都会传递ServletContextEvent,该ServletContext有一个句柄。正是在这一点上,您想要设置/删除指向共享对象的属性

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

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

    public class Shared
    {
      ...
      public static Shared fromServletContext ( final ServletContext context )
      {
        return (Shared) context.getAttribute( Shared.class.getName( ) );
      }
    }
    
  3. # 3 楼答案

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

  4. # 4 楼答案

    通过将内容作为属性存储在ServletContext(使用setAttribute/getAttribute)中,您可以在webapp中共享内容。您可以在ServletContextListener的实现中创建对象,将其存储在ServletContext中,然后从web服务和servlet中检索并使用它

  5. # 5 楼答案

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