Java 在构建UI之前加载会话变量

Java 在构建UI之前加载会话变量,java,vaadin,vaadin7,Java,Vaadin,Vaadin7,我有一个会话变量,用于过滤我的JPA查询,如下所示: activities = JPAContainerFactory.make(ActivityEntity.class, DCSAdminUI.PERSISTENCE_UNIT); activities.addContainerFilter(new Compare.Equal("organisation.rowid", OrgID)); @Override public void enter(ViewChangeEvent event

我有一个会话变量,用于过滤我的JPA查询,如下所示:

activities = JPAContainerFactory.make(ActivityEntity.class, DCSAdminUI.PERSISTENCE_UNIT);
activities.addContainerFilter(new Compare.Equal("organisation.rowid", OrgID));
@Override
    public void enter(ViewChangeEvent event) {

        OrgID = (String) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("org");
        buildLayout();

    }
我的视图能够在
enter()
方法中接收会话变量,如下所示:

activities = JPAContainerFactory.make(ActivityEntity.class, DCSAdminUI.PERSISTENCE_UNIT);
activities.addContainerFilter(new Compare.Equal("organisation.rowid", OrgID));
@Override
    public void enter(ViewChangeEvent event) {

        OrgID = (String) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("org");
        buildLayout();

    }
问题是我不知道如何从
enter()
方法中获取变量,并在构建UI时使用它。从上面的
enter()
方法代码中可以看到,我正在手动调用
buildLayout()
,它执行UI构造。这是可行的,但每次我导航到另一个视图并返回到此视图时,我都会在视图内部重新构建视图。我知道在构造函数之前调用了
enter()
,但我不明白的是,除非我在
enter()
方法中显式调用构造函数,否则构造函数似乎不会被调用


非常感谢任何帮助或指针

在将视图添加到导航器时,视图类的构造函数实际上由您调用,或者在导航到视图时由框架调用。这取决于所使用的
Navigator#addView()
的重载变量

根据您的问题判断,我假设您希望避免每次访问视图时执行JPA查询或执行某种形式的递归UI构造(无论您所说的“内部构造”)的情况


然而,解决问题的更好方法是将UI代码与其数据逻辑分离。也就是说,将数据(JPA容器)完全排除在视图之外。然后,您可以在
视图的默认构造函数中构造UI(使用
导航器#addView(String,class)仔细使用术语,“constructor”在Java语言中有非常特殊的含义。我假设“constructor”在这里指的是buildLayout()方法,而不是某个类的构造函数我指的是实际的构造函数,因为我尝试过使用手动
buildLayout()
方法,也尝试过直接将变量加载到构造函数中(没有
buildLayout()
方法),根据我读到的内容,构造函数是在
enter()之后自动调用的
method。如果我错了,那么你是对的,我确实需要小心术语!好吧,那么你说的是一个实际的构造函数。唉,你显然不能确切地说明你在说哪个构造函数。构造函数不会被框架或代码调用,当一个新的创建了一个对象的实例。如果您谈论的是这个enter()方法所属的类的构造函数,那么它肯定是在调用enter()之前调用的,而不是之后调用的。