我是 Stack Overflow 的新手,对 JSF 2.0 和自定义组件有疑问(我也使用 primefaces 3,但我认为没那么重要)。情况如下:我有一个 AdvancedCriterion
类型的嵌套数据对象,其中包含 AdvancedCriterion
或 Criterion
的列表(通过接口(interface) 标准
)。这些标准用于创建像这样的复杂过滤器对象:
- 高级标准:AND
- 标准:PRODUCT 等于“ABC”
- 标准:USER 以“A”开头
- 高级标准:或
- 标准:参数 1 > 5
- 标准:param2 <= 20
我在 Java 中创建了两个新组件:AdvancedCriterion.java
和 SimpleCriterion.java
来执行递归,因为第一次尝试使用组合失败。复合中复合的递归调用会导致堆栈溢出:-(
直到知道我可以显示一个静态过滤器对象并且它看起来不错,但用户应该添加或删除标准。所以我添加了一些按钮(这里加入了 primefaces)。这里有一些代码,我从第一个标准开始,它始终是 AdvancedCriterion
。
<myTag:advancedCriteriaComponent criteria="#{manageFiltersBean.filterBuilder.criteria}" />
我创建知道 Button 并想将父对象提供给 ActionListener:
CommandButton addButton = new CommandButton();
addButton.setId("btnAdd" + UUID.randomUUID());
addButton.setAjax(true);
addButton.setValue(" + ");
addButton.addActionListener(new CriteriaActionListener());
addButton.getAttributes().put("criteria", this.currentCriteria);
好吧,CriteriaActionListener 来了:
@Override
public void processAction(ActionEvent event) throws AbortProcessingException {
AdvancedCriteria criteria = (AdvancedCriteria) event.getComponent().getAttributes().get("criteria");
criteria.addCriteria(new Criterion());
System.out.println("number of children: " + criteria.getChildren().size());
}
在组件中,currentCriteria 是众所周知的,我可以看到他的子元素。在 CriteriaActionListener
中,对象是空的(它具有正确的类型,但看起来像这种类型的新初始化对象)现在的问题:我如何获得 currentCriteria
对象进入 CriteriaActionListener
?
我在ActionListener中尝试了一个属性并从组件中设置它,然后整个对象为NULL。我虽然试图制作一个 ELExpression 并将其正确地添加到 bean (#{manageFiltersBean.addCriterion(criteria}),但对象为 NULL。我没有更多的想法,不幸的是我对 JSF 很陌生(大约几周)。
也许是关于按钮的 id?它们是随机的,因为按钮的数量是动态的。我读到,每个按钮都必须有一个唯一的 ID 才能正常工作。还是与属性/参数有关?
谢谢你的帮助,
菲利克斯
最佳答案
这个问题解决了,还有一些出现。好吧,就像上面评论的那样,问题更像是“AdvancedCriteria”对象的实现问题。与“CommandButton”没有任何联系或提示,只是一个错误命名的 getter。
可能添加的行 implements Serialiable
有帮助,但我不完全知道,因为我尝试了很多东西(保存和恢复状态,枚举 propKeys 与 setter 和 getter 以及类似的东西) ,总的来说,这些都不是解决方案。
关于java - JSF 2 : Create a custom component with CommandButton and get attribute to ActionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837681/