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