Java 在构建UI之前加载会话变量
我有一个会话变量,用于过滤我的JPA查询,如下所示: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
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()之前调用的,而不是之后调用的。