Getters Inside F: Vorbatim, вызванная перед подачей формы
Вопрос
У меня есть следующая страница:
<h:form id="gameSelectionForm">
<h:selectOneMenu id="gameSelection">
<f:selectItems value="#{gameBean.gameIds}" />
</h:selectOneMenu>
<h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}" />
</h:form>
<h:panelGroup id="gameDiv">
<f:verbatim>
<iframe src="/levelup/resources/games/#{gameBean.gameId}/#{gameBean.htmlPage}" width="700px" height="800px" frameborder="0"/>
</f:verbatim>
</h:panelGroup>
Когда я нажимаю на кнопку «Gameselector», вот последовательность событий: 1. Gamebean.getGameid и GameBean.gethtmlpage называются 2. Gamebean.changegame называется 3. Страница обновляется.
Мои проблемы заключаются в порядке 1. и 2. Изменение Game модифицирует переменную Gamebean, которая используется GetGameid и GethtmlPage. Таким образом, я хочу выполнить его сначала, так что, когда другие панели обновляются, они содержат правильные данные.
Обратите внимание, что эта проблема, по -видимому, возникает только для вызова в элементе Gamediv (другие переменные правильно обновляются).
Не могли бы вы иметь какое -либо представление о том, что я мог бы сделать, чтобы вернуть порядок 1. и 2., чтобы метод изменения Game () был первым, названным?
Я использую Javaserver Faces 2.0 на Tomcat 7.0.
заранее спасибо
Решение
В соответствии с вашим отвечать по теме:
Я удалил тег F: Vorbatim, и теперь он работает должным образом. Я до сих пор не понимаю, почему это вызвало такое поведение.
А <f:verbatim>
был введен в JSF 1.0 долгое время назад с единственной целью иметь возможность включать простые HTML в дерево компонентов JSF. На JSF 1.0 (и 1.1), когда компонентное дерево построено, все простые HTML были проигнорированы. Страница сначала выполняется со всеми простыми HTML, а затем отображаемым HTML компонентов JSF После этого. Анкет Так, например
<p>Hello</p>
<h:inputText />
<p>World</p>
<h:outputText value="outputtext" />
<p>This is weird</p>
Получить как
<p>Hello</p>
<p>World</p>
<p>This is weird</p>
<input type="text" />
outputtext
А <f:verbatim>
Позволяли разработчикам взять простые HTML в дерево компонентов JSF, чтобы они были отображаются «синхронизированными», как вы ожидаете от кодирования.
<f:verbatim><p>Hello</p></f:verbatim>
<h:inputText />
<f:verbatim><p>World</p></f:verbatim>
<h:outputText value="outputtext" />
<f:verbatim><p>This is weird</p></f:verbatim>
Однако они вставлены во время взгляда строить время, а не во время взгляда оказывать время. Это является причиной вашей проблемы, Getters вызывают на этапе представления восстановления вместо фазы ответа.
Со времен JSF 1.2, с улучшенным обработчиком вида, можно было встроить простой HTML «синхронизировать», не доявшись на уродливых <f:verbatim>
теги. Так что это больше не нужно. Также нет полезных вариантов использования для тега, ожидайте, что, возможно, некоторые преждевременные оптимизации производительности, но, тем не менее, вы не должны использовать его в сочетании с динамическими данными, как это получен на языке экспрессии.
Связанные вопросы:
Другие советы
Поместите непосредственный атрибут, установленную TRUE в CommandButton.
<h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}" immediate="true" />
Затем он выполнит метод в фазе AppliveRequestValues.
Я удалил тег F: Vorbatim, и теперь он работает должным образом. Я до сих пор не понимаю, почему это вызвало такое поведение.