Jsf @无原因调用后构造方法

Jsf @无原因调用后构造方法,jsf,jstl,commandbutton,postconstruct,Jsf,Jstl,Commandbutton,Postconstruct,对于一个项目,我正在更新一个Java web应用程序,该应用程序有一些未解决的问题。我对bean的init方法有问题,该方法在不应该调用时被调用 导致问题的页面有三个按钮可返回到您先前访问过的三个不同页面。其中两个按钮导致调用您当前所在页面bean的init方法。您必须再次按下按钮才能执行操作(=返回到另一页)。 奇怪的是:你可以通过两个菜单选项进入问题页面。一种是问题的原因,另一种不是。您可以毫无问题地返回到另一页 问题页面的xhtml片段: <h:commandButton value

对于一个项目,我正在更新一个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>

“显示批处理”和“显示消息”导致问题。第三个按钮仅通过导致前两个按钮出现问题的菜单选项出现。奇怪的是,这个按钮没有再次调用init方法

我读过关于“c:if”会引起问题的文章,但当我完全删除它时,一切都没有改变。 bean是@viewscope的。 我没有用弹簧。如果你需要更多的细节,尽管问

有什么想法吗?

组件通过POST请求提交父表单。整个页面中引用的任何请求范围的备份bean都将在还原视图阶段重新初始化。并且,当使用2.1.18之前的Mojarra版本时,也将在恢复视图阶段重新初始化

因此,这是完全可以预期的行为

这里的具体问题是,这些按钮基本上被滥用,用于简单的页到页导航。您根本不想执行回发。您只想导航到另一个页面。为此,您应该使用
。这基本上就像一个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.18之前的Mojarra版本时的问题,而且对“使用正确的工具进行作业”也起到了积极的作用

另见:

感谢您明确而全面的回答!(和更新我的标签)我更新了代码,没有问题了。Mojarra版本是2.1.19。我不知道原作者为什么选择c:if;'“渲染”几乎在其他任何地方都使用。我仍然想知道,为什么我没有与其他菜单选项(相同的代码,不同的方式到达那里)相同的问题。为什么“同时显示”按钮不调用init方法?对web应用程序来说还是很新的,但是你的回答教会了我很多!谢谢另外,URL-当前页面是我需要解决的一个问题。谢谢你给我指路。至于“显示两个按钮”,这要么是一个错误的观察,要么是按钮放在页面的其他地方,在它的上下文中有一些我们看不到的东西。如果你需要更详细的信息,一份报告会有所帮助。