Java 为什么在第一次启动对话框时会创建两次支持bean?
我正在为我的web UI项目使用PrimeFaces UI库 我有一个带有按钮的Java 为什么在第一次启动对话框时会创建两次支持bean?,java,jsf,primefaces,Java,Jsf,Primefaces,我正在为我的web UI项目使用PrimeFaces UI库 我有一个带有按钮的manage\u watchfolder.xhtml页面,该按钮启动一个对话框: <p:commandButton value="Add" oncomplete="dlgEditWF.show()" update=":editWFForm"> <f:param value="#{item.value.ID}" name="editId"/> <h:graphicIma
manage\u 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>
我正在使用dynamic==“true”
来防止在单击按钮之前加载edit\u watchfolder.xhtml
editWFForm
是edit\u watchfolder.xhtml
中的一个表单
问题是,当我第一次启动对话框时,edit\u watchfolder.xhtml
backingbean(请求范围)被创建了两次。第一次使用editId
(参见上面的代码)传递的值是正常的,但是第二次它不在那里,所以支持bean得到错误的值
当我返回父页面(OK
或Cancel
按钮)并再次启动对话框后,问题消失了,一切正常。问题似乎只是第一次发射
为什么在第一次启动对话框时会创建两次支持bean 这是因为第一次打开对话框时,会发送AJAX请求以加载实际内容。这里唯一合理的方法是使用
@ViewScoped
bean,它将处理两个请求:第一个请求由commandButton
触发,第二个请求由dlgEditWF.show()触发。当然,如果删除dynamic=“true”
只会有一个请求。我怀疑这是因为Primefacesdynamic
功能的工作方式
commandButton的第一个请求将发送带有editID的请求参数以加载。发生此请求并收到响应并更新页面元素后,会出现显示对话框的oncomplete
javascript
显示对话框后,会出现一个完全不同的请求来动态加载对话框的内容,但这次没有editID参数。您的bean是@RequestScoped
,因此创建了两次,第二次没有保留editID请求参数
有三种可能的解决方案:
从对话框中删除动态
属性
将bean更改为@ViewScoped
或@SessionScoped
将editID请求参数更改为@SessionScoped
托管bean中的bean属性
也许这有帮助:谢谢。如果我使用onstart
而不是oncomplete
,问题就会消失。在这种情况下,对话框会立即出现(但为空),然后在一两秒后,它会被ajax更新为正确的值。所以,onclick
可以工作,但是用户体验非常糟糕。
<p:dialog id="editDialog" widgetVar="dlgEditWF" dynamic="true">
<ui:include src="edit/edit_watchfolder.xhtml"/>
</p:dialog>