Как передать строку действия в составной компонент JSF 2?

Я создаю простой составной составной компонент в JSF 2. Однако я не могу передать атрибут String в составной компонент для использования в атрибуте action < h: commandLink > . Мой компонент выглядит так:

<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>

Как я могу получить действие String в атрибуте action < h: commandLink > ?

Ответ 1

Похоже, это привлекает Horstmanns:-)

Вы должны назвать атрибут "действие" и использовать перенацеливание. Затем некоторые специальные манипуляции, которые описываются с изящной ясностью (не) в

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

и API-документ ViewDeclarationLanguage.retargetMethodExpressions(а не ViewHandler), чью ссылку мне не разрешено вставлять.

Вот как вы это делаете.

<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>

Ответ 2

Вам нужно определить тип атрибута как метод:

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

Или, альтернативно, некоторые имена атрибутов обрабатываются специально в jsf. Поэтому, если вы назовете свой атрибут "действие", он также должен работать без подписи метода:

<composite:attribute name="action"/>

Изменить: Я, вероятно, неправильно понял вопрос, если вы хотите ссылаться на идентификатор вида без вызова действия, вы можете использовать тег h:link вместо h:commandLink:

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