Получатели внутри f: дословно вызывается перед отправкой формы - PullRequest
2 голосов
/ 21 декабря 2010

У меня есть следующая страница:

<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. ChangeGame изменяет переменную gameBean, которая используется getGameId и getHtmlPage.Поэтому я хочу, чтобы он сначала выполнялся, чтобы при обновлении других панелей они содержали правильные данные.

Обратите внимание, что эта проблема, по-видимому, возникает только для вызова в элементе gameDiv (другие переменные обновляются надлежащим образом).).

Не могли бы вы представить, что я могу сделать, чтобы изменить порядок порядков 1. и 2., чтобы первым вызывался метод changeGame ()?

IЯ использую JavaServer Faces 2.0 на Tomcat 7.0.

Заранее спасибо

Ответы [ 3 ]

5 голосов
/ 24 декабря 2010

Согласно вашему собственному ответу на эту тему:

Я удалил тег f: дословно, и теперь он работает правильно.Я до сих пор не понимаю, почему это вызвало такое поведение.

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

Они, однако, встроены во время просмотра build time, а не во время просмотра render time.Это является причиной вашей проблемы: геттеры вызываются во время фазы просмотра восстановления вместо фазы ответа рендеринга.

Начиная с JSF 1.2, с улучшенным обработчиком представления, стало возможным встроить простой HTML «синхронно» безхлопот с уродливыми <f:verbatim> тегами.Так что это больше не нужно.Также больше нет полезных вариантов использования тега, возможно, ожидается некоторая преждевременная оптимизация производительности, но тем не менее не следует использовать его в сочетании с динамическими данными, полученными с помощью языка выражений.

Смежные вопросы:

0 голосов
/ 23 декабря 2010

Я удалил тег f: verbatim, и теперь он работает правильно. Я до сих пор не понимаю, почему это вызвало такое поведение.

0 голосов
/ 21 декабря 2010

Поместить непосредственный атрибут, установленный в true, в commandButton.

<h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}" immediate="true" />

Затем он будет выполнять метод на этапе ApplyRequestValues.

...