Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tapestry 5:持久页面数据的初始化_Java_Tapestry_Object Persistence - Fatal编程技术网

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()
    之前,它将始终从数据库重新初始化对象的状态,因此我的所有更改都将继续。是否确定?该值将从数据库中查找,但随后立即被请求参数中的字段值覆盖。