对于一个项目,我正在更新一个有一些松散结束的Java Web应用程序。我在使用bean的init方法时遇到了问题,但是它不应该被调用。
导致问题的页面有三个按钮可以返回您之前访问过的三个不同页面。其中两个按钮会导致调用当前页面的bean的init方法。您必须再次按下按钮才能执行操作(=返回到其他页面)。 奇怪的是:您可以通过两个菜单选项到达问题页面。一个导致问题,另一个方法则没有。你没有问题就回到了另一页。
问题页面的xhtml片段:
<h:commandButton value="Show batch" action="/BatchDetail.xhtml" />
<h:commandButton value="Show messages" action="/BatchMessage.xhtml" />
<c:if test="#{batchMessageDetailBean.batch.part}">
<h:commandButton value="Show both" action="/BatchAndBatchMessage.xhtml" />
</c:if>
显示批次&#39;并且&#39;显示消息&#39;导致问题。第三个按钮仅通过菜单选项显示,导致前两个按钮出现问题。奇怪的是,这个按钮不会再次调用init方法。
我已经读过关于&c; c:if&#39;导致问题,但当我完全删除它时,没有任何变化。 bean是@ViewScoped。 我没有使用Spring。如果您需要更多详细信息,请询问。
有什么想法吗?
答案 0 :(得分:2)
<h:commandXxx>
组件通过POST请求提交父表单。在恢复视图阶段,将在整个页面中引用的任何请求范围的后备bean将重新初始化。并且,当使用早于2.1.18的Mojarra版本时,due to a chicken-egg bug, any view scoped beans referenced in view build time tags/attributes也将在恢复视图阶段重新初始化。
这是完全预期的行为。
这里的具体问题是这些按钮基本上被滥用于普通的页面到页面导航。您根本不想执行回发。您只想导航到其他页面。为此,您应该使用<h:button>
代替。这基本上就像一个GET链接。额外的奖励,浏览器地址栏中的URL将反映到正确的URL。
<h:button value="Show batch" outcome="/BatchDetail.xhtml" />
<h:button value="Show messages" outcome="/BatchMessage.xhtml" />
<h:button value="Show both" outcome="/BatchAndBatchMessage.xhtml" rendered="#{batchMessageDetailBean.batch.part}" />
请注意,我借此机会仅使用rendered
属性而不是视图构建时间标记来改进条件渲染,这不仅可以解决您使用早于2.1的Mojarra版本时的问题。 18,但也为“使用正确的工具”做出了积极贡献。