Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在第一次启动对话框时会创建两次支持bean?_Java_Jsf_Primefaces - Fatal编程技术网

Java 为什么在第一次启动对话框时会创建两次支持bean?

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

我正在为我的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: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”
只会有一个请求。

我怀疑这是因为Primefaces
dynamic
功能的工作方式

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>