Я пытаюсь создать составной компонент paginator. Компонент должен отображать commandLink для каждой доступной страницы. Это выглядит примерно так:Как настроить таргетинг на командуLink, вложенную внутри ui: repeat в составном компоненте?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets">
<cc:interface>
<cc:attribute name="action" targets="jumpButton" required="true"/>
<cc:attribute name="bean" type="java.lang.Object" required="true"/>
</cc:interface>
<cc:implementation>
<ui:repeat value="#{cc.attrs.bean.pages}" var="page">
<h:commandLink id="jumpButton"
actionListener="#{cc.attrs.bean.jumpToPage(page)}">
<h:outputText value="#{page}"/>
</h:commandLink>
</ui:repeat>
</cc:implementation>
</html>
компонент используется в различных страницах, как это:
<ccc:paginator bean="#{myBean}"
action="/index?faces-redirect=true&includeViewParams=true"/>
Или:
<ccc:paginator bean="#{myOtherBean}"
action="/dir/index?faces-redirect=true&includeViewParams=true"/>
Обратите внимание на использование граней-редиректа = истина и includeViewParams = true, который, насколько я знаю, не может быть использован непосредственно в командных ссылках в составном компоненте.
Проблема в том, что jumpButton не может быть целевым, потому что он находится внутри ui: repeat. Я получаю сообщение:
javax.servlet.ServletException: /index?faces-redirect=true&includeViewParams=true : Unable to re-target MethodExpression as inner component referenced by target id 'jumpButton' cannot be found.
Если я создаю ссылку команду с идентификатором = «jumpButton» вне Ui: повторить, составной компонент и кнопка работает нормально. Как я могу заставить свой составной компонент работать с командной связью внутри ui: repeat?
Решение
действие jumpToPage управляемом бина:
public String jumpToPage(String path, Integer page) {
...
setCurrentPage(page);
return path;
}
Составной компонент:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets">
<cc:interface>
<cc:attribute name="bean" type="java.lang.Object" required="true"/>
<cc:attribute name="path" type="java.lang.String" required="true"/>
</cc:interface>
<cc:implementation>
<ui:repeat value="#{cc.attrs.bean.pages}" var="page">
<h:commandLink id="jumpButton"
action="#{cc.attrs.bean.jumpToPage(cc.attrs.path, page)}">
<h:outputText value="#{page}"/>
</h:commandLink>
</ui:repeat>
</cc:implementation>
</html>
компонентов Примеры использования:
<ccc:paginator bean="#{myBean}"
path="/index?faces-redirect=true&includeViewParams=true"/>
<ccc:paginator bean="#{myOtherBean}"
path="/dir/index?faces-redirect=true&includeViewParams=true"/>
Спасибо, я сделал некоторые изменения в оригинальный вопрос. Насколько я знаю, для меня невозможно использовать '? Faces-redirect = true & includeViewParams = true' в командных ссылках в составном компоненте напрямую. Если бы не это, ваше предложение работает. Но важна роль '? Faces-redirect = true & includeViewParams = true' части страницы. –
см. Мое обновление. Вам по-прежнему не нужен атрибут action на вашем компоненте. – fischermatte
Спасибо! Так просто. Не могу поверить, что я сделал это настолько сложным. Я обновил свой вопрос с результатом. Он работает отлично. –