commandLink with ui:在复合组件中重复

时间:2014-08-23 17:39:35

标签: jsf el commandlink

我正在尝试在复合组件中使用链接,我的链接是一个简单的数组,不属于任何托管bean。

<composite:interface>        
    <composite:attribute name="links" required="true" />                
</composite:interface>

<composite:implementation>        
        <ui:param name="linksSplit" value="#{fn:split(cc.attrs.links, ',')}" />
        <ui:repeat var="link" value="#{linksSplit}" >                
            <h:commandLink value="#{option}" action="#{link}" />
        </ui:repeat>        
</composite:implementation>

我收到以下错误: 标识'#{link}'不引用MethodExpression实例,返回类型:java.lang.String

我们应该在EL表达式中使用String或bean方法但我不明白为什么我们不能评估一个String的参数(在我的例子中是链接)。

如果我在faces-config中引用了一个真正的String,它可以正常工作

<h:commandLink value="#{option}" action="#navigate" />

如果您有解释或解决方法来使我的链接正常工作,那就太棒了

1 个答案:

答案 0 :(得分:2)

<h:commandLink action>中指定EL表达式时,它被解释为返回String的方法表达式(如果您不想导航,则返回void)。另请参阅tag documentation

  

姓名 action

     

输入 javax.el.MethodExpression   (签名必须与java.lang.Object action()

匹配      

描述 MethodExpression,表示用户激活此组件时要调用的应用程序操作。表达式必须求值为不带参数的公共方法,并返回Object(调用toString()以获取逻辑结果),并将其传递给NavigationHandler应用

鉴于您似乎想要纯粹的页面到页面导航链接,实际上您使用<h:commandLink>的方向错误。您应该使用<h:link>。它生成SEO友好和可收藏的GET链接,而不是提交父POST表单的JavaScript。

<ui:repeat var="link" value="#{linksSplit}" >                
    <h:link value="#{option}" outcome="#{link}" />
</ui:repeat>        

另见:

请注意,这一切都与复合组件无关。在普通页面中使用它时,你会遇到完全相同的问题。