我正在尝试在复合组件中使用链接,我的链接是一个简单的数组,不属于任何托管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" />
如果您有解释或解决方法来使我的链接正常工作,那就太棒了
答案 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>
请注意,这一切都与复合组件无关。在普通页面中使用它时,你会遇到完全相同的问题。