Java Tapestry 5-两个组件之间的通信

Java Tapestry 5-两个组件之间的通信,java,tapestry,Java,Tapestry,我的Java+Tapestry5应用程序中有一个页面,它包含两个组件——表单和网格。表单字段用于过滤网格中显示的结果。表单只是一个文本字段,用于设置它映射到的对象a的值。网格是从对象A创建的。我需要从表单组件向网格组件发送正确的实例。最好的方法是什么?我可以通过在上面的页面中设置对象来使用普通的java方法,但是应该有一种更干净的方法。我在考虑环境注释,但这不是太重了吗 public class I1 { @Component private WFRFormFilter wfrF

我的Java+Tapestry5应用程序中有一个页面,它包含两个组件——表单和网格。表单字段用于过滤网格中显示的结果。表单只是一个文本字段,用于设置它映射到的对象a的值。网格是从对象A创建的。我需要从表单组件向网格组件发送正确的实例。最好的方法是什么?我可以通过在上面的页面中设置对象来使用普通的java方法,但是应该有一种更干净的方法。我在考虑环境注释,但这不是太重了吗

public class I1 {
    @Component
    private WFRFormFilter wfrFormFilter;

    @Component (parameters={ "wfrDataHolder=property:wfrFormFilter.wfrDataHolder" })
    private WFRResultTable wfrResultTable;
}

public class WFRFormFilter {
    @Inject
    private WFRService wfrservice;

    @Propperty
    @Persist
    private WFRDataHolder wfrDataHolder;

    @PageAttached
    void pageAttached() {
        if (wfrDataHolder == null) { 
            wfrDataHolder = new WFRDataHolder(); 
        }
    }

    @OnEvent(EventConstants.SUCCESS)
        void processMyForm() { }
}

public class WFRResultTable {
    @Parameter(defaultPrefix=BindingConstants.PROP)
    @Property
    private WFRDataHolder wfrDataHolder;

    @Inject
    private WFRService wfrservice;

    public List<WFRDataHolder> getResultTableData() {
        return wfrservice.getData(this.wfrDataHolder);
    }   
}
公共类I1{
@组成部分
私人WFRFormFilter WFRFormFilter;
@组件(参数={“wfrDataHolder=属性:wfrFormFilter.wfrDataHolder”})
私有wfrresultable wfrresultable;
}
公共类WFRFormFilter{
@注入
私人WFRService WFRService;
@适当性
@坚持
私人WFRDataHolder WFRDataHolder;
@附页
空页附页(){
如果(wfrDataHolder==null){
wfrDataHolder=新的wfrDataHolder();
}
}
@OneEvent(EventConstants.SUCCESS)
void processMyForm(){}
}
公共类wfrresultable{
@参数(defaultPrefix=BindingConstants.PROP)
@财产
私人WFRDataHolder WFRDataHolder;
@注入
私人WFRService WFRService;
公共列表GetResultableData(){
返回wfrservice.getData(this.wfrDataHolder);
}   
}

Tapestry的参数是双向工作的:如果您将数据存储在页面类中(使用
@Persist
)并将其作为参数传递给表单组件,您可以在表单组件中更改其值,这将自动反映到页面:无需调用setter

因此,如果页面和表单组件的布局如下所示:

 public class MyPage {

     @Component(parameters = "dataHolder=dataHolder")
     private MyForm formComponent;

     @Component(parameters = "dataHolder=dataHolder")
     private MyGrid gridComponent;

     @Persist
     @Property
     private MyDataHolder dataHolder;

}

public class MyFormComponent {

    @Parameter
    private MyDataHolder dataHolder;

    @OnEvent(EventConstants.SUCCESS)
    void formSubmitted() {
        this.dataHolder = new DataHolder(...);
    }

}
…然后正确的值将始终出现在页面中,因此也会出现在网格组件上


另请参见,特别是“参数是双向的”一节。如果表单组件将dataHolder实例发送到环境,而网格组件使用环境中的实例,该怎么办?这个解决方案有什么问题吗?Tapestry用户指南建议@Ondrej:这是可行的,但在正常参数可以很好地完成工作的情况下使用它似乎有些奇怪。