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 带有IncludeDevicewParams=”的虚假PreDestroyViewMapEvent;“真的”;关于h:link_Jsf_Jsf 2_Mojarra_View Scope_Viewparams - Fatal编程技术网

Jsf 带有IncludeDevicewParams=”的虚假PreDestroyViewMapEvent;“真的”;关于h:link

Jsf 带有IncludeDevicewParams=”的虚假PreDestroyViewMapEvent;“真的”;关于h:link,jsf,jsf-2,mojarra,view-scope,viewparams,Jsf,Jsf 2,Mojarra,View Scope,Viewparams,我有两个视图(a.xhtml和b.xhtml),其中一个包含到另一个的链接。第一种观点: <f:view > <f:metadata> <f:viewAction> <!-- just set any value to force view map creation... --> <f:setPropertyActionListen

我有两个视图(
a.xhtml
b.xhtml
),其中一个包含到另一个的链接。第一种观点:

    <f:view >
        <f:metadata>
            <f:viewAction>
                <!-- just set any value to force view map creation... -->
                <f:setPropertyActionListener target="#{viewScope.username}" value="John" /> 
            </f:viewAction>
        </f:metadata>

        <h:link id="alink" value="Go to B" outcome="b" includeViewParams="true" />

        <h:form>
            <h:commandButton id="away" action="b" value="Navigate away" immediate="false" />
        </h:form>

    </f:view>

</html>
  • 通过设置一些值来使用当前视图地图
  • 使用
    includeViewParams=“true”
    指向带有
    h:link的
    b.xhtml
    ,以便在链接的查询字符串中自动包含视图参数
a.xhtml

    <f:view >
        <f:metadata>
            <f:viewAction>
                <!-- just set any value to force view map creation... -->
                <f:setPropertyActionListener target="#{viewScope.username}" value="John" /> 
            </f:viewAction>
        </f:metadata>

        <h:link id="alink" value="Go to B" outcome="b" includeViewParams="true" />

        <h:form>
            <h:commandButton id="away" action="b" value="Navigate away" immediate="false" />
        </h:form>

    </f:view>

</html>
另外,我在这里创建了一个
ViewMapListener
,以演示访问
a.xhtml
后发生的“虚假”视图映射销毁事件调用。在我的
faces config.xml
中,我有以下条目:

    <f:view >
        <f:metadata>
            <f:viewAction>
                <!-- just set any value to force view map creation... -->
                <f:setPropertyActionListener target="#{viewScope.username}" value="John" /> 
            </f:viewAction>
        </f:metadata>

        <h:link id="alink" value="Go to B" outcome="b" includeViewParams="true" />

        <h:form>
            <h:commandButton id="away" action="b" value="Navigate away" immediate="false" />
        </h:form>

    </f:view>

</html>
    <system-event-listener>
        <system-event-listener-class>org.my.TestViewMapListener</system-event-listener-class>
        <system-event-class>javax.faces.event.PreDestroyViewMapEvent</system-event-class>
        <source-class>javax.faces.component.UIViewRoot</source-class>
    </system-event-listener>
呈现页面
a.xhtml
后,侦听器将打印出以下行:

    <f:view >
        <f:metadata>
            <f:viewAction>
                <!-- just set any value to force view map creation... -->
                <f:setPropertyActionListener target="#{viewScope.username}" value="John" /> 
            </f:viewAction>
        </f:metadata>

        <h:link id="alink" value="Go to B" outcome="b" includeViewParams="true" />

        <h:form>
            <h:commandButton id="away" action="b" value="Navigate away" immediate="false" />
        </h:form>

    </f:view>

</html>
PreDestroyViewMapEvent: /b.xhtml
这很奇怪,因为从未访问过
b.xhtml
。当我使用
“导航离开”
按钮导航离开时,将按预期打印正确的事件:

    <f:view >
        <f:metadata>
            <f:viewAction>
                <!-- just set any value to force view map creation... -->
                <f:setPropertyActionListener target="#{viewScope.username}" value="John" /> 
            </f:viewAction>
        </f:metadata>

        <h:link id="alink" value="Go to B" outcome="b" includeViewParams="true" />

        <h:form>
            <h:commandButton id="away" action="b" value="Navigate away" immediate="false" />
        </h:form>

    </f:view>

</html>
PreDestroyViewMapEvent: /a.xhtml
只有在链接上使用
includeViewParams=“true”
时,才会触发错误事件。通过调试,我可以看到发生这种情况的原因是,在
b.xhtml
中,创建了原始视图映射的浅层副本并将其设置为临时视图根,因此将临时设置为
FacesContext
a UIViewRoot。这样做可能是为了正确检测链接的查询字符串参数值;它还临时关闭操作期间的事件,但过早地将其重新打开(请参见“finally”块),因此视图地图的临时副本会“错误”触发视图地图销毁事件,而此时原始视图地图本身不会发生任何事件。这是一个令人头痛的问题,因为我需要采取一些额外的行动,以便检测是原始地图被破坏了,还是它的“幽灵”是一个虚假事件

    <f:view >
        <f:metadata>
            <f:viewAction>
                <!-- just set any value to force view map creation... -->
                <f:setPropertyActionListener target="#{viewScope.username}" value="John" /> 
            </f:viewAction>
        </f:metadata>

        <h:link id="alink" value="Go to B" outcome="b" includeViewParams="true" />

        <h:form>
            <h:commandButton id="away" action="b" value="Navigate away" immediate="false" />
        </h:form>

    </f:view>

</html>
这是错误还是期望的行为?我使用的是Mojarra 2.2.12

    <f:view >
        <f:metadata>
            <f:viewAction>
                <!-- just set any value to force view map creation... -->
                <f:setPropertyActionListener target="#{viewScope.username}" value="John" /> 
            </f:viewAction>
        </f:metadata>

        <h:link id="alink" value="Go to B" outcome="b" includeViewParams="true" />

        <h:form>
            <h:commandButton id="away" action="b" value="Navigate away" immediate="false" />
        </h:form>

    </f:view>

</html>