Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Jsf SpringWebFlow中primefaces组件的持久性_Jsf_Jsf 2_Primefaces_Spring Webflow - Fatal编程技术网

Jsf SpringWebFlow中primefaces组件的持久性

Jsf SpringWebFlow中primefaces组件的持久性,jsf,jsf-2,primefaces,spring-webflow,Jsf,Jsf 2,Primefaces,Spring Webflow,我对SpringWebFlow中primefaces组件的持久性存在问题。如果组件被实例化为原始页面请求的一部分,则一切正常。但是,如果组件是在ajax请求期间实例化的,那么它们不会正确地持久化,并且在以后检索它们时,我们会得到一个空对象。例如,其效果是tabview的第二个选项卡上的组件(dynamic=true)无法工作。例如: <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w

我对SpringWebFlow中primefaces组件的持久性存在问题。如果组件被实例化为原始页面请求的一部分,则一切正常。但是,如果组件是在ajax请求期间实例化的,那么它们不会正确地持久化,并且在以后检索它们时,我们会得到一个空对象。例如,其效果是tabview的第二个选项卡上的组件(dynamic=true)无法工作。例如:

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

    <h:head>
        <ui:insert name="headIncludes" />
    </h:head>
    <h:body>
        <h:form id="testForm">
            <p:tabView id="myTabView" dynamic="true">
                <p:tab title="Tab One" id="tabOne">
                    <h:panelGroup id="tabOneGroup">
                        <p:commandLink id="linkX" value="Link X" actionListener="#{sandboxBean.testCommandLinkx}" >
                            <f:ajax />
                        </p:commandLink>
                    </h:panelGroup>
                </p:tab>
                <p:tab title="Tab Two" id="tabTwo">
                    <h:panelGroup id="tabTwoGroup">
                        <p:commandLink id="linkY" value="Link Y" actionListener="#{sandboxBean.testCommandLinky}" >
                            <f:ajax /><!-- Only matters if we switch to h:commandLink -->
                        </p:commandLink>
                    </h:panelGroup>
                </p:tab>
            </p:tabView>
        </h:form>
    </h:body>
</html>

首次加载页面时,将实例化表示commandlink linkX的UIComponent,并保存“actionListener”的属性值。当我们单击“Link X”时,将再次检索该属性值并用于调用testCommandLinkx()。这个很好用

当我们切换到选项卡2时,会发出一个ajax请求,在此过程中,会以相同的方式创建另一个表示linkY的UIComponent并将其持久化。但是,当我们实际单击commandlink并尝试检索actionListener属性值时,我们发现没有这样的属性。相反,我们接收到一个全新的对象

如果将tabView更改为dynamic=“false”,则在初始页面请求期间会创建并保留两个commandlinks,并且一切正常。如果我们保持dynamic=“true”,但使用h:commandLink而不是p:commandLink,那么一切都可以正常工作

现在,我真的不认为这是一个primefaces错误,好像其他人也会注意到它。其他人也测试了这个特定的代码片段,没有任何问题。出于同样的原因,我怀疑这是一个webflow错误。这似乎更可能是我们项目中的配置错误,但我不知道在哪里。包含每个配置文件似乎有点长,但如果您想查看其中的内容,请仅添加注释,我将添加注释

对于不同组件的版本,人们无疑会问:

  • Primefaces:3.0.1和所有更高版本的动态选项卡视图(因为这是第一个真正支持它的版本),但如果您使用另一个在ajax请求中实例化组件的构造,则可以在早期版本中重新创建它
  • Mojarra:2.0.4(但我也尝试了2.0.8和2.1.6,但没有改进)
  • SpringWebFlow:2.2.1(也尝试过2.3)
  • Tomcat:7.0.12(也尝试过各种其他方法)

这个问题似乎是SpringWebflow中的一个bug,实际上在3月27日发布的2.3.1中已经修复。

试着将
放在
中。此外,这些
标记是不必要的。默认情况下,所有PrimeFaces命令链接/按钮都已ajaxified,这应该由接受布尔值的
ajax
属性配置。我担心,切换表单不会改变任何事情。p:commandLink不需要,但它确保切换到h:commandLink时功能相同。我不想让人们认为h:commandLink起作用的原因是它不是ajax请求。请您详细说明“然而,当我们实际单击commandLink并尝试检索actionListener属性值时,我们发现没有这样的属性。相反,我们收到了一个全新的对象。”部分?您的意思是从action listener方法内的view root(或action event参数)检索组件,然后尝试通过
getValue()
从中获取命令组件的值吗?如果是这样,为什么?我自己没有做任何特别的事情,这只是primefaces和jsf代码的内部工作。PrimeFaces CommandLink类扩展了jsf类UIComponent(通过UIComponentBase、UICommand和HtmlCommandLink)。此UIComponent类有一个StateHelper对象,实际属性值存储在映射中。呈现p:commandLink时,将调用StateHelper.add(“actionListener”,“#{sandboxBean.testCommandLinkx}”)。但是,当我们单击commandLink并调用StateHelper.get(“actionListener”)时,会返回null,因为属性映射为空。如前所述,只有在ajax请求期间呈现p:commandLink时才会发生这种情况。如果它是在整页请求期间呈现的,则在单击链接StateHelper.get(“actionListener”)时,将正确返回持久化值。