Почему значение h:link вызывает метод bean-компонента, когда элемент управления не отображается?

У меня есть это на моей странице JSF

<h:link rendered="false" value="${mybean.status}" />

Элемент управления не визуализируется, но по-прежнему вызывает метод getStatus() в mybean. Почему?

Проблема, похоже, только с атрибутом value, потому что если я включу href="${mybean.url}", то метод getUrl() не будет вызван.

Я использую шлейф TomEE 7.04, который поставляется с Mojarra 2.2.12.


person Panu Haaramo    schedule 31.12.2017    source источник
comment
Что произойдет, если вы используете rendered="#{false}" ?   -  person Jorge Campos    schedule 31.12.2017
comment
Я так пробовал, никакого эффекта.   -  person Panu Haaramo    schedule 31.12.2017


Ответы (1)


Как указано в документации говорит об атрибуте rendered:

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

Это означает, что атрибут rendered обрабатывается на последней фазе жизненного цикла (Render Response Phase), тогда как значение компонента было установлено на этапе Update model values Phase. В случае свежего (GET) запроса он устанавливается также в Render Response Phase, но явно до проверки атрибута rendered. А установка значения компонента означает вызов геттера.

В h:link нет атрибута href, поэтому в этом случае геттер не вызывался.

В качестве обходного пути вы можете обернуть h:link в f:subview, который использует атрибут рендеринга на более ранней стадии.

<f:subview rendered="false">
    <h:link rendered="false" value="${mybean.status}" />
</f:subview>

Вы можете посмотреть этот вопрос, ответ на него и комментарии, ссылки на жизненный цикл JSF и, возможно, другую полезную информацию.

person Ondřej Xicht Světlík    schedule 02.01.2018
comment
href геттер не вызывается, если я добавляю атрибут href. - person Panu Haaramo; 02.01.2018
comment
Это не совсем правильно. При первоначальном запросе страницы (в запросе на получение) нет отправки формы и «фазы обновления значений модели» (моим источником для этого всегда является balusc.omnifaces.org/2006/09/debug-jsf-lifecycle.html кстати). - person Kukeltje; 02.01.2018
comment
@PanuHaaramo: Пожалуйста, прочитайте, что сказано в этом ответе ... h:link не имеет href согласно документам, поэтому он им не обрабатывается. Подтверждаю то, что вы видите... Вы также можете добавить bla="${mybean.status}" то же поведение, что и href - person Kukeltje; 02.01.2018
comment
Я попробую f:subview. В настоящее время у меня есть <h:panelGroup rendered="false"> вокруг него, и это не помогает. Я думаю (не совсем уверен), что решение panelGroup работало раньше, когда я использовал Tomcat 8 + Mojarra. - person Panu Haaramo; 02.01.2018
comment
@Kukeltje Вы правы, но вопрос ничего не говорит о том, какой запрос вызывает проблему. - person Ondřej Xicht Světlík; 02.01.2018
comment
Ах, извините, на самом деле я использую PrimeFaces 5.3 и <p:link, у которого есть атрибут href, поэтому я думал, что у h:link он тоже есть. Я не включил PrimeFaces в вопрос, потому что смог воспроизвести без него. - person Panu Haaramo; 02.01.2018