2

我有以下页面:

<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 修改了 getGameId 和 getHtmlPage 使用的 gameBean 变量。因此,我希望它首先执行,以便在刷新其他面板时,它们包含正确的数据。

请注意,此问题似乎仅发生在 gameDiv 元素中的调用(其他变量已正确刷新)。

您是否知道我可以做些什么来恢复 1. 和 2. 的顺序,以便第一个调用 changeGame() 方法?

我在 Tomcat 7.0 上使用 JavaServer Faces 2.0。

提前致谢

4

3 回答 3

6

根据您自己对此主题的回答:

我删除了 f:verbatim 标签,现在它可以正常工作了。我仍然不明白为什么它会导致这种行为。

<f:verbatim>很久以前在 JSF 1.0 中引入的唯一目的是能够在 JSF 组件树中包含纯 HTML 。在 JSF 1.0(和 1.1)上,当构建组件树时,所有纯 HTML 都被忽略了。该页面首先使用所有纯 HTML 呈现,然后是 JSF 组件的呈现HTML。所以例如

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

然而,它们在视图构建期间内联,而不是在视图渲染期间。这是您的问题的原因,getter 在恢复视图阶段而不是渲染响应阶段被调用。

从 JSF 1.2 开始,使用改进的视图处理程序,可以“同步”内联纯 HTML,而无需使用丑陋的<f:verbatim>标签。所以不再需要它了。该标签也不再有有用的用例,可能会出现一些过早的性能优化,但仍然不应该将它与表达式语言获得的动态数据结合使用。

相关问题:

于 2010-12-24T15:47:04.267 回答
0

在 commandButton 上设置一个立即属性设置为 true。

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

然后它将在 ApplyRequestValues 阶段执行该方法。

于 2010-12-21T18:16:27.697 回答
0

我删除了 f:verbatim 标签,现在它可以正常工作了。我仍然不明白为什么它会导致这种行为。

于 2010-12-23T12:39:31.083 回答