Vaadin detach()方法在attach()方法之后调用吗?

Vaadin detach()方法在attach()方法之后调用吗?,vaadin,vaadin7,Vaadin,Vaadin7,我有一个简单的UI类 public class HelloWorldUI extends UI { @Override protected void init(VaadinRequest request) { System.out.println("Initialized !"); final VerticalLayout layout = new VerticalLayout(); layout.addComponent(new Label("Hello World

我有一个简单的UI类

public class HelloWorldUI extends UI {

@Override
protected void init(VaadinRequest request) {
    System.out.println("Initialized !");
    final VerticalLayout layout = new VerticalLayout();
    layout.addComponent(new Label("Hello World !"));
    setContent(layout);
}

@Override
public void detach() {
    System.out.println("Detach !");
    super.detach();
}

@Override
public void attach() {
    System.out.println("Attach !");
    super.attach();
}
}
第一次加载UI时,我在控制台上看到的输出是

附加
初始化

没关系,这就是我所期望的。但是当我刷新浏览器时,我的控制台输出是

附加
初始化
分离

太棒了!我想分离可能是第一个生成的,因为(我认为)当浏览器刷新时,应该调用
detach()
方法,然后调用
attach()
init()
。但实际上
detach()
方法将在
attach()
方法之后调用。我的想法怎么了?

浏览器刷新=新建
UI
实例 刷新浏览器窗口或选项卡时,将创建一个新实例。因此,您会看到一个新的
UI
实例的附加消息。稍后将分离旧的
UI
实例

这是Vaadin 7中的默认行为。您可以使用注释更改该行为

@保留刷新 向
UI
添加注释会更改行为:刷新时不会创建新的
UI
实例

要对此批注引用文档,请执行以下操作:

标记用户刷新浏览器窗口时应保留的UI。默认情况下,刷新时会创建一个新的UI实例,导致URL或URI片段中未捕获的任何UI状态被丢弃。通过将此注释添加到UI类,框架将在检测到重新加载时重用当前UI实例

浏览器刷新=新建
UI
实例 刷新浏览器窗口或选项卡时,将创建一个新实例。因此,您会看到一个新的
UI
实例的附加消息。稍后将分离旧的
UI
实例

这是Vaadin 7中的默认行为。您可以使用注释更改该行为

@保留刷新 向
UI
添加注释会更改行为:刷新时不会创建新的
UI
实例

要对此批注引用文档,请执行以下操作:

标记用户刷新浏览器窗口时应保留的UI。默认情况下,刷新时会创建一个新的UI实例,导致URL或URI片段中未捕获的任何UI状态被丢弃。通过将此注释添加到UI类,框架将在检测到重新加载时重用当前UI实例


@preserveonfresh
注释是否总是需要在每个UI中使用?哪些条件不应使用
@preserveonfresh
?我认为它非常有用,刷新时不会创建新的UI实例。它是一个注释,因此如果添加它,它将用于UI的每个实例。如果您确实希望refesh不创建新的UI实例,那么请始终使用注释。一些项目更喜欢这样,其他项目更喜欢一个新的UI。为了澄清这一点,一个Vaadin 7应用程序可以有多个类。至少需要一个UI,因为它定义了第一个浏览器窗口/选项卡(或Portlet视图区域)的内容。您可以选择显示相同或不同的
UI
。假设您可以用注释标记一个UI类,而不标记另一个UI,每个UI都有不同的行为。注意事项:(a)我还没有尝试验证这一点。(b) 不同的行为可能会让用户感到困惑。
@preserveonfresh
注释是否总是需要在每个UI中使用?哪些条件不应使用
@preserveonfresh
?我认为它非常有用,刷新时不会创建新的UI实例。它是一个注释,因此如果添加它,它将用于UI的每个实例。如果您确实希望refesh不创建新的UI实例,那么请始终使用注释。一些项目更喜欢这样,其他项目更喜欢一个新的UI。为了澄清这一点,一个Vaadin 7应用程序可以有多个类。至少需要一个UI,因为它定义了第一个浏览器窗口/选项卡(或Portlet视图区域)的内容。您可以选择显示相同或不同的
UI
。假设您可以用注释标记一个UI类,而不标记另一个UI,每个UI都有不同的行为。注意事项:(a)我还没有尝试验证这一点。(b) 不同的行为可能会让用户感到困惑。我只想指出,
detach
方法并不总是在所有情况下都被调用。亨利·萨拉。因此,您不应该依赖它来清理资源、关闭连接、停止后台线程等等。我只想指出,
detach
方法并不总是在所有情况下都被调用。亨利·萨拉。因此,您不应该依赖它来清理资源、关闭连接、停止后台线程等等。