Vaadin UI - 不能为每个客户端使用静态字段
Vaadin UI - cannot use static fields for every client
我正在创建一个网络应用程序。
我有一个扩展 UI
.
的 MyUI
public class MyUI extends UI {
public static Authentication AUTH;
@Override
protected void init(VaadinRequest vaadinRequest) {
AUTH = new Authentication();
updateContent();
}
//other methods
}
在 Authentication()
我有用户登录。当我注销时,该用户设置为 null
.
我注意到当我从两个设备访问服务器时,所以当我应该有两个连接到服务器时,当有人注销时,另一个也被注销了。
在身份验证class中有这个方法:
public void doLogout() {
System.out.println("User: " + this.user.getMail() + " has logged out.");
this.user = null;
}
我在 user.getMail()
中遇到错误,因为当我尝试从其他帐户注销时,用户已设置为 null
。
com.vaadin.ui.UI
是独一无二的吗?如何在 Vaadin 中处理不同的连接?
Java,一般
这里是基础Java,与Vaadin无关……
关键字static
表示one value per class
,也称为“class变量”,通常称为“全局变量”。不是面向对象的。一般来说,您应该尽量减少静态的使用。
省略那个关键字意味着“这个class的每个实例一个值”,一个实例变量也称为成员变量。这是面向对象的。
我建议您在开始 Vaadin 项目之前学习更多 Java 的基础知识。并学习 Java Servlet 技术如何工作的基础知识,也许阅读 O'Reilly 出版的关于 Servlet 的 Head First 书(现在已经过时,但基础知识是相同的)。您还需要了解线程和并发问题等高级主题,因为 Vaadin 等 Servlet 环境本质上是多线程的。最后,阅读 Goetz 的 Java Concurrency In Practice 一书。
特别是 Vaadin
要存储 Vaadin 应用程序的每个用户的值,请使用会话属性。这是一个键值存储,您可以在其中通过指定键("attribute" 的名称)插入和检索值。作为 Java Servlet 技术的一部分,会话会在用户首次连接时自动为您实例化。
或者,您可以将 UI
class 上每个用户的值存储为实例变量。每个 Vaadin 用户在第一次连接时都以一个 UI
实例开始。但请注意:您可以在 Vaadin 8 应用程序中打开多个网络浏览器 tabs/windows,每个浏览器都有自己的 UI
实例。因此,要在这些多个 UI
对象之间共享数据,请使用会话属性。
请注意,虽然每个 Vaadin 应用至少定义了一个 UI
subclass,但您也可以定义额外的 UI
subclass,对于那些额外的上面提到的浏览器 tabs/windows 显示不同的内容。
也许你应该在这里使用会话属性而不是静态变量(更新为更通用):
UI.getCurrent().getSession().setAttribute("AUTH", AUTH);
Authentication auth2 = UI.getCurrent().getSession().getAttribute("AUTH");
所以使用 VaadinSession
来存储会话特定数据。
我正在创建一个网络应用程序。
我有一个扩展 UI
.
MyUI
public class MyUI extends UI {
public static Authentication AUTH;
@Override
protected void init(VaadinRequest vaadinRequest) {
AUTH = new Authentication();
updateContent();
}
//other methods
}
在 Authentication()
我有用户登录。当我注销时,该用户设置为 null
.
我注意到当我从两个设备访问服务器时,所以当我应该有两个连接到服务器时,当有人注销时,另一个也被注销了。
在身份验证class中有这个方法:
public void doLogout() {
System.out.println("User: " + this.user.getMail() + " has logged out.");
this.user = null;
}
我在 user.getMail()
中遇到错误,因为当我尝试从其他帐户注销时,用户已设置为 null
。
com.vaadin.ui.UI
是独一无二的吗?如何在 Vaadin 中处理不同的连接?
Java,一般
这里是基础Java,与Vaadin无关……
关键字static
表示one value per class
,也称为“class变量”,通常称为“全局变量”。不是面向对象的。一般来说,您应该尽量减少静态的使用。
省略那个关键字意味着“这个class的每个实例一个值”,一个实例变量也称为成员变量。这是面向对象的。
我建议您在开始 Vaadin 项目之前学习更多 Java 的基础知识。并学习 Java Servlet 技术如何工作的基础知识,也许阅读 O'Reilly 出版的关于 Servlet 的 Head First 书(现在已经过时,但基础知识是相同的)。您还需要了解线程和并发问题等高级主题,因为 Vaadin 等 Servlet 环境本质上是多线程的。最后,阅读 Goetz 的 Java Concurrency In Practice 一书。
特别是 Vaadin
要存储 Vaadin 应用程序的每个用户的值,请使用会话属性。这是一个键值存储,您可以在其中通过指定键("attribute" 的名称)插入和检索值。作为 Java Servlet 技术的一部分,会话会在用户首次连接时自动为您实例化。
或者,您可以将 UI
class 上每个用户的值存储为实例变量。每个 Vaadin 用户在第一次连接时都以一个 UI
实例开始。但请注意:您可以在 Vaadin 8 应用程序中打开多个网络浏览器 tabs/windows,每个浏览器都有自己的 UI
实例。因此,要在这些多个 UI
对象之间共享数据,请使用会话属性。
请注意,虽然每个 Vaadin 应用至少定义了一个 UI
subclass,但您也可以定义额外的 UI
subclass,对于那些额外的上面提到的浏览器 tabs/windows 显示不同的内容。
也许你应该在这里使用会话属性而不是静态变量(更新为更通用):
UI.getCurrent().getSession().setAttribute("AUTH", AUTH);
Authentication auth2 = UI.getCurrent().getSession().getAttribute("AUTH");
所以使用 VaadinSession
来存储会话特定数据。