为什么在第一次启动对话框时会创建两次辅助bean?

时间:2013-02-21 12:09:21

标签: java jsf primefaces

我正在为我的网页UI项目使用PrimeFaces UI库。

我有一个manage_watchfolder.xhtml页面,其中有一个按钮,此按钮会启动一个对话框:

<p:commandButton value="Add" oncomplete="dlgEditWF.show()" update=":editWFForm">  
    <f:param value="#{item.value.ID}" name="editId"/>
    <h:graphicImage value="./edit.png" />
</p:commandLink>

在同一个文件中,我dlgEditWF包含edit_watchfolder.xhtml

<p:dialog id="editDialog" widgetVar="dlgEditWF" dynamic="true">
    <ui:include src="edit/edit_watchfolder.xhtml"/>
</p:dialog> 

我使用dynamic=="true"来阻止在点击按钮之前加载edit_watchfolder.xhtml

editWFFormedit_watchfolder.xhtml中的表单。

问题是,当我启动第一次时间的对话框时,edit_watchfolder.xhtml支持bean(请求作用域)会被创建两次。第一次使用editId传递的值(参见上面的代码)是可以的,但第二次它没有,所以支持bean得到错误的值。

在我返回(OKCancel按钮)到父页面并再次启动对话框后,问题就消失了,一切正常。问题似乎只是第一次发布。

为什么在第一次启动对话框时会创建两次辅助bean?

2 个答案:

答案 0 :(得分:1)

原因是因为第一次打开对话框时会发送AJAX请求来加载实际内容。这里唯一合理的是使用@ViewScoped bean来处理两个请求:第一个由commandButton触发,而秒由dlgEditWF.show()触发。当然,如果您删除dynamic="true",则只会有一个请求。

答案 1 :(得分:1)

我怀疑这是因为Primefaces dynamic功能如何运作。

commandButton的第一个请求将发送带有editID的request参数进行加载。发出此请求并收到响应并更新页面元素后,会出现显示对话框的oncomplete javascript。

一旦显示对话框发生了完全不同的请求动态加载对话框的内容,除非此时没有editID参数。你的bean是@RequestScoped因此它被创建了两次,第二次它没有保留editID请求参数。

有三种可能的解决方案:

  1. 从对话框中删除dynamic属性

  2. 将您的bean更改为@ViewScoped@SessionScoped

  3. 将editID请求参数更改为@SessionScoped托管bean中的bean属性。