Javaservlet共享集合

Javaservlet共享集合,java,http,servlets,collections,Java,Http,Servlets,Collections,请帮帮我。有没有一种方法可以使用在所有Servlet实例之间共享的集合 我知道我可以在HttpRequestContext中保存字符串,但如何存储集合?我知道我可以使用数据库,但我更喜欢将所有内容存储在内存中 public class Servlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)

请帮帮我。有没有一种方法可以使用在所有Servlet实例之间共享的集合

我知道我可以在HttpRequestContext中保存字符串,但如何存储集合?我知道我可以使用数据库,但我更喜欢将所有内容存储在内存中

public class Servlet extends HttpServlet {

    public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      context.setAttribute("someValue", "aValue");
      //  Want to use collection here
  }

}

感谢您的回答。

您可以在请求、响应或会话中保存任何对象。当您检索它时,您只需将它转换回正确的类。

您可以在请求、响应或会话中保存任何对象。当您检索它时,您只需将其转换回正确的类。

您可以将其存储在会话中—这很常见。但是在外部类中的一些公共静态集合中也是如此——为了示例Util.myCollection。不过要小心,servlet应该是线程安全的和无状态的,因此后者很容易被视为反模式-这样做可能会遇到很多麻烦。

您可以将其存储在会话中-非常常见。但是在外部类中的一些公共静态集合中也是如此——为了示例Util.myCollection。不过要小心,servlet应该是线程安全的和无状态的,因此后者很容易被视为反模式-这样做可能会遇到很多麻烦。

这取决于您希望存储在哪里:

  • ServletContext.setAttribute()
    :用于应用程序的生存期
  • HttpServletRequest.setAttribute()
    :用于请求的生存期。这将不适用于进一步的请求
  • HttpServletSession.setAttribute()
    :用于用户会话范围的生存期。这将仅在用户会话中可用

这取决于您要存储在哪里:

  • ServletContext.setAttribute()
    :用于应用程序的生存期
  • HttpServletRequest.setAttribute()
    :用于请求的生存期。这将不适用于进一步的请求
  • HttpServletSession.setAttribute()
    :用于用户会话范围的生存期。这将仅在用户会话中可用

问题是我需要存储来自不同会话的数据。从我在其他问题和Servlet规范中看到的情况来看——如果我不使用SingleThreadModel——这意味着Servlet容器中只有一个Servlet实例。所以这意味着-我可以将这个集合存储在一个字段中,该字段将在处理请求的所有线程之间共享(我只需要关心同步)。这是正确的吗?我很抱歉问了一些愚蠢的问题,但我对Java和Servlets非常陌生。谢谢你的回答!没错-如果没有明确定义,servlet在容器范围内是单例的。可能有很多线程在使用这个servlet实例(每个线程处理单个HTTP请求),因此您应该非常注意在其中执行的操作。同步对共享集合的访问是线程安全的解决方案,但它会降低性能(传入线程将等待轮到它们)。如果要共享/更新单个值,请尝试java.util.concurrent.atomic包,具体取决于要存储的类型和要交付的用例。对于建议在所有会话中复制应用程序范围的数据,这是一个强烈的反对票。确定。感谢您指出,out-session不应该这样使用。但是再一次。。最终的解决方案将根据用例选择。问题是我需要存储来自不同会话的数据。从我在其他问题和Servlet规范中看到的情况来看——如果我不使用SingleThreadModel——这意味着Servlet容器中只有一个Servlet实例。所以这意味着-我可以将这个集合存储在一个字段中,该字段将在处理请求的所有线程之间共享(我只需要关心同步)。这是正确的吗?我很抱歉问了一些愚蠢的问题,但我对Java和Servlets非常陌生。谢谢你的回答!没错-如果没有明确定义,servlet在容器范围内是单例的。可能有很多线程在使用这个servlet实例(每个线程处理单个HTTP请求),因此您应该非常注意在其中执行的操作。同步对共享集合的访问是线程安全的解决方案,但它会降低性能(传入线程将等待轮到它们)。如果要共享/更新单个值,请尝试java.util.concurrent.atomic包,具体取决于要存储的类型和要交付的用例。对于建议在所有会话中复制应用程序范围的数据,这是一个强烈的反对票。确定。感谢您指出,out-session不应该这样使用。但是再一次。。最终解决方案将根据使用案例进行选择。