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

时间:2015-11-09 15:13:52

标签: java vaadin vaadin7

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

activities = JPAContainerFactory.make(ActivityEntity.class, DCSAdminUI.PERSISTENCE_UNIT);
activities.addContainerFilter(new Compare.Equal("organisation.rowid", OrgID));

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

@Override
    public void enter(ViewChangeEvent event) {

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

    }

问题在于我不知道如何从enter()方法中获取变量并将其用于构建UI。从上面的enter()方法代码中可以看出,我手动调用buildLayout()来构建UI。这有效,但每次导航到另一个视图并返回到此视图时,我最终都会在自身内部重新构建视图。我知道enter()在构造函数之前被调用,但我不明白为什么构造函数似乎没有被调用,除非我在enter()方法中明确地调用它

非常感谢任何帮助或指示

1 个答案:

答案 0 :(得分:0)

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

根据您的问题判断,我假设您希望避免每次访问视图时执行JPA查询或某种形式的递归UI构造(无论您在其自身内构建的是什么意思')执行。

然而,如果您将UI代码与其数据逻辑分开,那么更好的方法就是解决您的问题。也就是说,将数据(JPAContainer)完全保留在视图之外。然后,您可以在View的默认构造函数中构建UI(在这种情况下使用Navigator#addView(String, Class<? extends View>))。您应该查看Model-View-Presenter design pattern以了解如何实现这种关注点分离。然后在演示者中读取会话变量OrgID

最好在导航到特定视图时重建UI。重建Vaadin UI很快,而在会话中保持浏览器中当前不可见的UI组件会浪费宝贵的服务器端内存。您应该尽可能减小会话大小,以便在服务器上同时拥有更多用户。也就是说,只保留会话中实际对用户可见的组件。