Java Tapestry 5:持久页面数据的初始化
考虑以下场景。 有一个带有持久对象的页面Java Tapestry 5:持久页面数据的初始化,java,tapestry,object-persistence,Java,Tapestry,Object Persistence,考虑以下场景。 有一个带有持久对象的页面obj: public class SomePage { @Persistent @Property SomeBean obj; @Property @PageActivationContext private SomeActivation actObj; ... void onValidateFromForm() { ... } } 此obj在页面上编辑: <t:textfield t:id=
obj
:
public class SomePage {
@Persistent
@Property
SomeBean obj;
@Property
@PageActivationContext
private SomeActivation actObj;
...
void onValidateFromForm() { ... }
}
此obj
在页面上编辑:
<t:textfield t:id="value" t:value="obj.value"/>
让我们考虑<代码> OBJ 状态的初始化过程: (*)
obj.value=actObj.value代码>
(我需要从actObj
解除绑定value
,请不要问为什么)
还有一个验证方法。当验证失败时,我希望在页面上显示错误列表,并保留所有值,这些值是用户在表单上填写的,并且存储在obj
中
因此:
当页面首次初始化为特定的actObj
时,我想初始化obj
当页面验证失败时,我不想重新初始化obj
,因为我想保留它的值并向它们显示用户错误列表
问题是:我应该在哪里放置初始化块(*)?您应该能够使用onActivate(),因为这将在应用请求参数之前发生。因此,提交事件将首先设置激活上下文中的值,然后用文本字段中的值覆盖它
注意,当验证成功时,tapestry只在post之后进行重定向。验证失败时,tapestry将在POST响应中呈现错误。因此,您可能会发现根本不需要@Persist,可以通过@PageActivationContext/onActivate()/onPassivate()进入无状态。您可以使用激活处理程序而不是注释,因此:
@Persistent
@Property
private SomeBean obj;
@Property
private SomeActivation actObj;
@OnEvent(EventConstants.ACTIVATE)
void activatePage(SomeActivation actObj) {
this.actObj = actObj;
if (obj == null) {
obj = // initialize
obj.value = actObj.value
}
}
@OnEvent(EventConstants.PASSIVATE)
Object passivatePage() {
return actObj;
}
@OnEvent(value = EventConstants.SUCCESS, component = "form")
void success() {
// do some staff
// reset obj
obj = null;
}
@OnEvent(value = EventConstants.FAILURE, component = "form")
void failure() {
// do some staff
}
那么,在这种情况下,当用户单击页面上的其他链接时,我应该怎么做,这样就不会调用success()
方法了?通过这种方式,obj
将不会收到null
值,并且在新的onActivate()
事件中,它不会被重新初始化。如果不需要保存此值,则不需要@persist我需要保存此值,直到我使用相同的actObj
。当actObj
改变时,我需要重新初始化obj
。如果你只需要编辑激活值(actObj)的一些属性,你根本不需要obj。如果验证失败,则在请求之间保存所有输入。直接使用actObj即可。我不能只使用actObj
,因为我不想在值生效之前将其状态保存到DB。不,这不起作用。当我从窗体更改此对象的状态时,在onValidateFromForm()
之前,它将始终从数据库重新初始化对象的状态,因此我的所有更改都将继续。是否确定?该值将从数据库中查找,但随后立即被请求参数中的字段值覆盖。