【问题标题】:How to pass a action string into a JSF 2 composite component?如何将操作字符串传递给 JSF 2 复合组件?
【发布时间】:2010-05-17 18:33:23
【问题描述】:

我正在 JSF 2 中创建一个简单的菜单组合组件。但是,我无法将字符串属性传递给组合组件以在 的操作属性中使用。我的组件看起来像:

<composite:interface>
    <composite:attribute name="title" required="true" type="java.lang.String"/>
    <composite:attribute name="view" required="true" />
</composite:interface>

<!--implementation-->
<composite:implementation>
    <li><h:commandLink action="#{cc.attrs.view}" value="#{cc.attrs.title}" /></li>
</composite:implementation>

如何将操作字符串放入 的操作属性中?

【问题讨论】:

    标签: jsf jsf-2 action composite-component


    【解决方案1】:

    看起来这吸引了 Horstmanns :-)

    您必须将属性命名为“action”并使用重定向。然后一些特殊的处理开始了,在

    http://docs.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/composite/attribute.html

    以及我不允许粘贴链接的 ViewDeclarationLanguage.retargetMethodExpressions(不是 ViewHandler)的 API 文档。

    这是你的做法。

    <composite:interface>
        <composite:attribute name="title" required="true" type="java.lang.String"/>
        <composite:attribute name="action" targets="view" required="true" />
    </composite:interface>
    
    <!--implementation-->
    <composite:implementation>
        <li><h:commandLink id="view" value="#{cc.attrs.title}" /></li>
    </composite:implementation>
    

    【讨论】:

    • 太好了,谢谢 Cay - 很高兴有像您这样的专家加入 stackoverflow 社区!
    • 永远在你的游戏之上,Cay ;) 谢谢!
    【解决方案2】:

    您需要将属性的类型定义为这样的方法:

    <composite:attribute name="view" method-signature="java.lang.String f()"/>
    

    或者,某些属性名称在 jsf 中专门处理。因此,如果您将属性命名为“动作”,它也应该在没有方法签名的情况下工作:

    <composite:attribute name="action"/>
    

    编辑:我可能误解了这个问题,如果您想在不调用操作的情况下链接到视图 ID,您可以使用 h:link 标签而不是 h:commandLink

    <h:link outcome="#{cc.attrs.view}" value="#{cc.attrs.title}"/>
    

    【讨论】:

    • 当字符串作为视图(或操作)传递时,这两者都会给出“ClassCastException:java.lang.String 无法转换为 javax.el.ValueExpression”。
    • 再次感谢,但我的目标是构建一个行为类似于本机组件的复合组件,它可以采用字符串或方法作为操作属性的值。也许这对于复合组件模板来说根本不可能,也许完整的组件 API 是实现这一点所必需的。
    • 再想一想,你回答了我关于 <h:link> 的问题。我将发布一个关于制作一个表现得像原生组件的组件的新问题。
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 2020-01-18
    • 2017-05-31
    • 2011-06-02
    • 2018-06-05
    • 2012-06-22
    • 2011-05-21
    • 2018-09-02
    相关资源
    最近更新 更多