将 EL 表达式传递给复合组件

2024-04-20

我们仍处于 JSF 1.2 到 2.0 的迁移场景,并且现在面临与 EL 表达式内使用的 c:set 或 ui:param 变量相关的问题。

以下是事实。有一个按钮作为复合组件:

<cc:interface name="button" shortDescription="A button.">
    ...
    <cc:attribute
        name="disabled"
        required="false"
        default="false"
        shortDescription="The disabled flag." />
    ...
</cc:interface>

<cc:implementation>
    <ice:commandButton
        ...
        disabled="#{cc.attrs.disabled}"
        ... />
</cc:implementation>

现在我们尝试在工具栏中使用这个按钮组件。按钮的禁用状态是在工具栏中使用 c:set 或 ui:param 确定的(我们已经尝试过这两种方法)。

<c:set var="isButtonEnabled" value="#{backingBean.buttonEnabled}" />
or
<ui:param name="isButtonEnabled" value="#{backingBean.buttonEnabled}" />

#{isButtonEnabled}

<ctrl:button
    ...
    disabled="#{!isButtonEnabled}"
    ... />

这就是我们的问题。如果我们简单地打印出工具栏中“isButtonEnabled”的值,它总是正确的。所以支持豆就可以了。但是当我们尝试将此值传递给复合组件时,它不起作用。 “Disabled”始终被评估为 false。

当然,我们可以直接传递方法表达式(#{!backingBean.isButtonEnabled}),这样就可以正常工作。但在我们的场景中,启用标志的确定要复杂得多,我只是试图使示例尽可能简单。此外,此标志用于工具栏中的多个按钮,因此我们希望通过使用 c:set 或 ui:param 来保持代码的可维护性。这是处理这个问题的错误方法吗?你有什么建议吗?

提前致谢。

阿姆


您的问题是 JSF 中完成值绑定的方式。首选方法是通过调用来检索填充属性的 EL 表达式getValueExpression("attributeName")。然后这个 EL 表达式可用于获取或设置支持 bean 中的值。由于你没有通过#{!isButtonEnabled} but #{cc.attrs.disabled} to ice:commandButton绑定失败。

我解决了这个问题p:selectOneMenu通过编写包装来构成 Primefaces 的组件UIComponent它定义了一个属性wrappedValue并将该财产传递给p:selectOneMenu。然后在该属性的 getter 和 setter 中我使用了getValueExpression检索属性的真实 EL 表达式。

<composite:interface componentType="de.gw2tome.component.valuewrapper">
    <composite:attribute name="value" type="de.gw2tome.models.Rarity"
        required="true" />
</composite:interface>

<composite:implementation>
    <p:selectOneMenu value="#{cc.wrappedValue}"/>
    ...
</composite:implementation>

@FacesComponent("de.gw2tome.component.valuewrapper")
public class ValueWrapper extends UINamingContainer {

    public void setWrappedValue(Object wrappedValue) {
        ValueExpression expr = getValueExpression("value");
        ELContext ctx = getFacesContext().getELContext();

        expr.setValue(ctx, wrappedValue);
    }

    public Object getWrappedValue() {
        ValueExpression expr = getValueExpression("value");
        ELContext ctx = getFacesContext().getELContext();

        return expr.getValue(ctx);
    }
}

现在可以通过以下方式使用该组件:

<g:rarityChooser value="#{itemSearchBean.minRarity}" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 EL 表达式传递给复合组件 的相关文章

随机推荐