JSF 2:使用CommandButton创建自定义组件,并获取ActionListener的属性

时间:2012-01-12 15:33:38

标签: java jsf recursion custom-component

我是Stack Overflow的新手,对JSF 2.0和自定义组件有疑问(我也使用了primefaces 3,但我认为并不重要)。情况如下:我有一个AdvancedCriterion类型的嵌套数据对象,其中包含AdvancedCriterionCriterion的列表(通过接口criteria)。这些标准用于创建一个复杂的过滤器对象,如下所示:

  • 高级标准:AND
    • 标准:PRODUCT等于“ABC”
    • 标准:USER以“A”开头
    • AdvancedCriterion:OR
      • CRITERION:param1> 5
      • CRITERION:param2< = 20

我在Java中创建了两个新组件:AdvancedCriterion.javaSimpleCriterion.java来执行递归,因为第一次尝试使用复合失败。并且在复合中对复合的递归调用会创建堆栈溢出: - (

直到知道我可以显示静态过滤器对象并且它看起来很好,但用户应该添加或删除标准。所以我加入了一些按钮(这里有一些主要内容)。这里有一些代码,我从第一个标准开始,始终是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对象放入{{1} }?

我在ActionListener中尝试了一个属性并从组件中设置它,然后整个对象为NULL。我虽然试图制作一个ELExpression并且正确地使用bean(#{manageFiltersBean.addCriterion(criteria))但是对象是NULL。我没有更多的想法,不幸的是我对JSF很新(大约几周)。

也许这是关于按钮的ID?它们是随机的,因为按钮的数量是动态的。我读过,每个按钮都必须有唯一的ID才能正常工作。或者它是关于属性/参数的东西?

感谢您的帮助,

菲利克斯

1 个答案:

答案 0 :(得分:1)

此问题已解决,其他一些问题也会发生。好吧,就像上面评论的那样,问题更像是“AdvancedCriteria”对象实现的问题。 “CommandButton”没有任何联系或暗示,只是一个名叫getter的错误。

可能添加的行implements Serialiable有帮助,虽然,我不确切地知道,因为我尝试了很多东西(保存和恢复状态,枚举propKeys有setter和getter以及类似的东西),总体来说这些都没有解决方案。

相关问题