我有以下页面:
<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。
提前致谢
答案 0 :(得分:5)
根据您自己的answer关于此主题:
我删除了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以来,通过改进的视图处理程序,可以在不同时使用丑陋的<f:verbatim>
标记的情况下内联纯HTML“同步”。所以不再需要了。期望标签也没有有用的用例,期望可能会有一些过早的性能优化,但是,你不应该将它与表达式语言获得的动态数据结合使用。
答案 1 :(得分:0)
在commandButton上将立即属性设置为true。
<h:commandButton id="gameSelector" value="Play" action="#{gameBean.changeGame}" immediate="true" />
它将在ApplyRequestValues阶段执行该方法。
答案 2 :(得分:0)
我删除了f:verbatim标记,现在它正常工作。我仍然不明白为什么它会导致这种行为。