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

时间:2013-05-12 10:37:07

标签: java servlets

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

从我读过的内容来看,servlet中的静态变量是不好的做法。

我如何实现我的需要?

感谢。

6 个答案:

答案 0 :(得分:3)

我真的不喜欢这个术语"糟糕的做法"因为它暗示我们可以评估某些事情是否是坏的,无论情况如何。这种情况很少 - 或换句话说,如果Java语言的设计者认为静态字段总是坏的,他们就不会将它们包含在语言中。

在servlet中拥有可变状态是完全可以的 - 但是你必须记住,servlet容器将使用servlet的同一个对象实例来(并发地)为所有请求提供服务。

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

答案 1 :(得分:2)

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

SEE HERE

答案 2 :(得分:1)

您可以使用Singleton模式或CDI应用程序作用域取决于您的环境。

不要忘记线程安全。

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;
        }
    }
}

这不是熟悉的单身人士,但它使用相同的原则。

答案 3 :(得分:1)

您可以将数据放在ServletContext中,它是每个Java虚拟机的每个“Web应用程序”的上下文(意味着全局)。

检查此处的使用情况:http://www.javatpoint.com/servletcontext

答案 4 :(得分:0)

只需创建一个静态变量,你就不必再做任何事了

答案 5 :(得分:0)

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