【问题标题】:commandLink with ui:repeat in composite componentcommandLink 与 ui:repeat 在复合组件中
【发布时间】:2014-08-23 17:39:35
【问题描述】:

我正在尝试在复合组件中使用链接,我的链接在一个简单的数组中,不属于任何托管 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 表达式中使用字符串或 bean 方法,但我不明白为什么我们不能评估字符串参数(在我的例子中是链接)。

如果我在 faces-config 中引用了一个真正的字符串,它会起作用

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

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

【问题讨论】:

    标签: jsf el commandlink


    【解决方案1】:

    &lt;h:commandLink action&gt; 中指定 EL 表达式时,它会被解释为返回 String 的方法表达式(或 void,如果您不想导航)。另见tag documentation

    姓名 action

    类型 javax.el.MethodExpression (签名必须匹配java.lang.Object action()

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

    鉴于您似乎想要纯页面到页面导航链接这一事实,您实际上在使用&lt;h:commandLink&gt; 时走错了方向。您应该为此使用&lt;h:link&gt;。它生成对 SEO 友好且可收藏的 GET 链接,而不是提交父 POST 表单的一段 JavaScript。

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

    另见:

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

    【讨论】:

    • 感谢您的回答,确实 h:link 是很好的解决方案。我花了很多时间才能够使用它,因为我使用了一个旧的 CustomNavigationHandler,这听起来会干扰最终的链接生成(没有生成 标记),两个问题合二为一。
    猜你喜欢
    • 2013-08-23
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2020-03-21
    • 2011-05-26
    • 2011-12-24
    • 2014-02-04
    相关资源
    最近更新 更多