JSF/Facelets:将`action`属性设置为动态计算的字符串

har*_*rto 2 navigation jsf facelets breadcrumbs

在我的JSF/Facelets应用程序中,我想使用自定义标记从页面ID列表中动态生成痕迹痕迹:

<foo:breadcrumbs trail="foo,bar,baz"/>
Run Code Online (Sandbox Code Playgroud)

这应该产生如下:

<h:commandLink action="foo" ... />
<h:commandLink action="bar" ... />
<!-- (etc.) -->
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

<ui:repeat value="#{fn:split(trail, ',')}" var="key">
    <h:commandLink action="#{key}" ... /> 
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

此代码的问题是#{key}被解释为方法绑定.但是,我只想将字符串值#{key}作为导航结果返回.我怎样才能做到这一点?


我唯一能想到的是创建一个具有outcome字段和动作处理程序的虚拟托管bean ,并像这样调用它:

<h:commandLink action="#{dummy.click}" ...>
    <f:setPropertyActionListener target="#{dummy.outcome}" value="#{key}" />
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)

使用如此定义的虚拟类:

public class Dummy {

    private String outcome;

    public String click() {
        return outcome;
    }

    public void setOutcome(String outcome) {
        this.outcome = outcome;
    }

    public void getOutcome() {
        return outcome;
    }
}
Run Code Online (Sandbox Code Playgroud)

这看起来很丑陋,我不知道它是否会起作用.

har*_*rto 5

自从提出这个问题以来,我发现了一个非常简单易用的解决方案.

作为JSF操作目标的方法必须不接受任何参数并返回String.事实证明,String类已经有一个匹配此签名的方法 - toString()!

所以,我已将UI循环更改为以下内容:

<ui:repeat value="#{fn:split(trail, ',')}" var="key">
    <h:commandLink action="#{key.toString}" ... /> 
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

这允许动态评估key为JSF操作结果,并且不需要任何其他类或丑陋的hackery.