Java 如何将静态数据存储在servlet中并在所有会话/请求之间共享?

Java 如何将静态数据存储在servlet中并在所有会话/请求之间共享?,java,servlets,Java,Servlets,我有一个servlet,我想将数据提供给web UI。 数据存储在一个xml文件中,我希望每隔几天修改一次。 我希望在servlet中加载xml文件一次,并为每个请求提供服务,并且仅在发送另一个“重新加载”请求时重新加载它 据我所知,servlet中的静态变量是一种糟糕的做法 我怎样才能实现我所需要的 谢谢。一个servlet在webapp启动时只创建一次,并在所有请求之间共享。无论是否是静态的,每个类/实例变量都将在所有请求/会话之间共享。您不希望将请求/会话范围的数据分配给它们。而是将它们声

我有一个servlet,我想将数据提供给web UI。 数据存储在一个xml文件中,我希望每隔几天修改一次。 我希望在servlet中加载xml文件一次,并为每个请求提供服务,并且仅在发送另一个“重新加载”请求时重新加载它

据我所知,servlet中的静态变量是一种糟糕的做法

我怎样才能实现我所需要的


谢谢。

一个servlet在webapp启动时只创建一次,并在所有请求之间共享。无论是否是静态的,每个类/实例变量都将在所有请求/会话之间共享。您不希望将请求/会话范围的数据分配给它们。而是将它们声明/分配为methodlocal变量


只需创建一个静态变量,您无需再做任何事情

您可以使用单例模式或CDI应用程序范围的bean,具体取决于您的环境

不要忘记线程安全

public class ServletSingleton {
    private static ServletSingleton instance = new ServletSingleton();

    //Here is your data objects
    private Object firstDataObject;
    private Object secondDataObject;

    public static Object getFirstDataObject(){
        synchronized (instance){
            return instance.firstDataObject;
        }
    }

    public static Object getSecondDataObject(){
        synchronized (instance){
            return instance.secondDataObject;
        }
    }

    public static void setFirstDataObject(Object dataObject){
        synchronized (instance){
            instance.firstDataObject = dataObject;
        }
    }

    public static void setSecondDataObject(Object dataObject){
        synchronized (instance){
            instance.secondDataObject = dataObject;
        }
    }
}

这不是常见的单例,但它使用相同的原则。

您可以将数据放在ServletContext中,它是每个web应用程序每个Java虚拟机的上下文


检查此处的用法:

您可以定义实例成员或将属性存储到应用程序范围中,但它们都不是线程安全的。

我真的不喜欢“坏习惯”这个词,因为它暗示我们可以评估某件事情是否坏,而不考虑环境。这种情况很少发生——或者换一种说法,如果Java语言的设计者认为静态字段总是不好的,他们就不会将它们包含在语言中

在servlet中具有可变状态是完全可以的,但是您必须记住,servlet容器将使用servlet的相同对象实例来并发地服务所有请求


这意味着特定于请求的状态不应存储在servlet中,因为不同的请求处理线程将覆盖彼此的状态。但在您的情况下,您希望在所有请求之间共享状态,因此servlet中的字段是合适的。由于servlet是由并发线程访问的,因此您必须同步对该可变共享状态的访问。

如何同步对servlet中数据的访问?用synchronized包装这个方法?如何编写正确的线程安全代码超出了这个答案的范围。java教程对这个主题有一个很好的解释。是的,当然。我编辑了我的答案,所以现在它包含了线程安全的准单例示例。