JSF и richfaces: h: commandlink в таблице richfaces не работает должным образом - PullRequest
1 голос
/ 09 августа 2010

При использовании h: commandlink (или commandbutton) внутри rich: dataTable указанное действие никогда не вызывается, а также не создается экземпляр соответствующего управляемого компонента (независимо от того, находится ли он в области запроса или сеанса) ... вместо этого выполняется тот же запрос .. (перезагрузка страницы) .. Я видел то, что казалось похожим вопросом на форумах, но на самом деле это не проблема, с которой я столкнулся .. h / commandlink / button работают нормально за пределами rich: datatable ..

У кого-нибудь есть совет?

Вот фрагмент кода:

    <h:commandLink id="commLink" actionListener="#{hBean.test}" action="#{hBean.viewTranslation}">
        <h:outputText value="#{trans.translationName}"/>   
    </h:commandLink>
</rich:column>

Ответы [ 3 ]

2 голосов
/ 09 августа 2010

Бин, по-видимому, находится в области запроса, и модель данных не была загружена во время построения бина (по крайней мере, на этапе применения значений запроса следующего запроса).Вам необходимо сохранить ту же модель данных для последующего запроса, иначе JSF не сможет найти элемент строки, связанный с нажатой ссылкой.Самый простой способ - загрузить модель данных в конструктор компонента или метод @PostConstruct.

Быстрое исправление / тестирование - поместить компонент в область действия сеанса.Модель данных будет сохранена в области сеанса и будет доступна в последующем запросе.Но это оказывает большее влияние на взаимодействие с пользователем (например, неожиданные результаты при открытии одной и той же страницы в разных окнах / вкладках браузера в одном сеансе).Если вы уже используете JSF 2.0 (что, скорее всего, не так, поскольку вы используете RichFaces), тогда новой областью просмотра было бы решение .

Вопросы, связанные с данной:

0 голосов
/ 15 апреля 2011

Если вы используете RichFaces 3.0.0 - 3.3.3, используйте тег a4j: keepAlive.Это будет работать даже с областью запроса.

0 голосов
/ 11 августа 2010

спасибо BalusC за ответ.На самом деле все не так просто в моем случае, потому что я использую Spring в сочетании с JSF, а мой dataList построен на аннотированном Spring контроллере, поэтому для того, чтобы сделать его доступным для bean-компонента jsf, мне пришлось сделать так, чтобы bean был известен как spring, так иJSF .. Ваш ответ, хотя и помог мне найти решение - я не только должен делить свой bean-компонент между spring и jsf, но также должен был создать Spring-контроллер для области видимости сессии ... возможно, не такое уж и хорошее решение, но пока работает ...
Я не использовал jsf до моего последнего проекта и должен сказать, что я не доволен тем, что он так тесно связан с его архитектурой, что затрудняет объединение spring и jsf

...