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>