我有一个servlet,我想将数据提供给Web UI。 数据存储在xml文件中,我希望在几天内修改一次。 我想在servlet中加载一次xml文件,并为每个请求提供服务,并在我发送另一个'reload'请求时重新加载它。
从我读过的内容来看,servlet中的静态变量是不好的做法。
我如何实现我的需要?
感谢。
答案 0 :(得分:3)
我真的不喜欢这个术语"糟糕的做法"因为它暗示我们可以评估某些事情是否是坏的,无论情况如何。这种情况很少 - 或换句话说,如果Java语言的设计者认为静态字段总是坏的,他们就不会将它们包含在语言中。
在servlet中拥有可变状态是完全可以的 - 但是你必须记住,servlet容器将使用servlet的同一个对象实例来(并发地)为所有请求提供服务。
这意味着特定于请求的状态不应存储在servlet中,因为不同的请求处理线程会覆盖彼此的状态。但是,在您的情况下,您希望在所有请求之间共享状态,因此servlet中的字段是合适的。由于并发线程访问servlet,因此您必须同步对该可变共享状态的访问。
答案 1 :(得分:2)
servlet只在webapp启动时创建一次,并在所有请求之间共享。静态与否,每个类/实例变量将在所有请求/会话之间共享。您不希望将请求/会话范围数据分配给它们。而是声明/将它们指定为方法本地变量
答案 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)
您可以定义实例成员或将属性存储到应用程序范围中,但它们都不是线程安全的。