Я создаю простой компонент составного объекта menuing в JSF 2. Однако я не могу передать Строковый атрибут в составной компонент для использования в атрибуте действия <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>
Как я могу получить Строку действия в атрибут действия <h:commandLink>?
Похоже, это привлекает Хорстманнов :-)
Вы должны назвать атрибут «действие» и использовать ретаргетинг. Затем некоторые особые приемы обработки, описанные с исключительной ясностью (не) в
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>
Вам необходимо определить тип атрибута как метод например:
<composite:attribute name="view" method-signature="java.lang.String f()"/>
Или, альтернативно, некоторые имена атрибутов обрабатываются в jsf специально. Поэтому, если вы назовете свой атрибут «действие», он также должен работать без сигнатуры метода:
<composite:attribute name="action"/>
Изменить: Я, вероятно, неправильно понял вопрос, если вы хотите создать ссылку на идентификатор представления без вызова действия, вы можете использовать h: ссылка
тег вместо h: commandLink
:
<h:link outcome="#{cc.attrs.view}" value="#{cc.attrs.title}"/>