commandLink с ui:repeat в составном компоненте

Я пытаюсь использовать ссылки в составном компоненте, мои ссылки находятся в простом массиве и не принадлежат ни одному управляемому компоненту.

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

Я получаю следующую ошибку: Identity '#{link}' не ссылается на экземпляр MethodExpression, возвращаемый тип: java.lang.String

Мы должны использовать методы String или bean в выражении EL, но я не понимаю, почему мы не можем оценить параметр, который является строкой (ссылка в моем случае).

Если я помещу настоящую строку, на которую ссылается мой Faces-config, это сработает

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

Если у вас есть объяснение или обходной путь, чтобы моя ссылка работала, было бы здорово


person TonyDav    schedule 23.08.2014    source источник


Ответы (1)


При указании выражения EL в <h:commandLink action> оно интерпретируется как выражение метода, возвращающее String (или void, если вы не хотите перемещаться). См. также документацию по тегу:

Имя action

Введите javax.el.MethodExpression (подпись должна соответствовать java.lang.Object action())

Описание MethodExpression, представляющее действие приложения, которое должно вызываться, когда этот компонент активируется пользователем. Выражение должно оцениваться как общедоступный метод, который не принимает параметров и возвращает Object (toString() которого вызывается для получения логического результата), который передается NavigationHandler для этого приложения.

Учитывая тот факт, что вам, кажется, нужны чистые навигационные ссылки между страницами, вы на самом деле идете в неправильном направлении, используя для этого <h:commandLink>. Вместо этого вы должны использовать <h:link> для этого. Он генерирует оптимизированные для SEO и закладки GET-ссылки вместо фрагмента JavaScript, который отправляет родительскую форму POST.

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

Смотрите также:

Обратите внимание, что все это не имеет ничего общего с составными компонентами. У вас была бы точно такая же проблема при использовании этого на обычной странице.

person BalusC    schedule 23.08.2014
comment
Спасибо за ваш ответ, действительно, ссылка h: была хорошим решением. Я потратил так много времени, чтобы иметь возможность использовать его, потому что я использовал старый CustomNavigationHandler, который, кажется, мешает окончательной генерации ссылок (тег ‹a› не генерируется), две проблемы решены в одной. - person TonyDav; 29.08.2014