我有一个过滤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()
方法中明确地调用它
非常感谢任何帮助或指示
答案 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组件会浪费宝贵的服务器端内存。您应该尽可能减小会话大小,以便在服务器上同时拥有更多用户。也就是说,只保留会话中实际对用户可见的组件。