我有2个观看次数(a.xhtml
和b.xhtml
),其中一个包含指向另一个的观看次数。第一个观点:
b.xhtml
使用h:link
指向includeViewParams="true"
,以便在链接的查询字符串中自动包含视图参数。 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>
和b.xhtml
:
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<f:view >
<f:metadata>
<f:viewParam id="id" name="userid" value="1" />
</f:metadata>
</f:view>
</html>
此外,我在这里创建一个ViewMapListener
,以演示a.xhtml
访问后发生的“虚假”视图地图销毁事件调用。在我的faces-config.xml
我有这个条目:
<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>
其中TestViewMapListener
是这样的:
public class TestViewMapListener implements ViewMapListener {
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException {
if (event instanceof PreDestroyViewMapEvent) {
PreDestroyViewMapEvent viewMapEvent = (PreDestroyViewMapEvent)event;
UIViewRoot viewRoot = (UIViewRoot)viewMapEvent.getComponent();
System.out.println("PreDestroyViewMapEvent: "+viewRoot.getViewId());
}
}
...
呈现页面a.xhtml
后,侦听器会打印出以下行:
PreDestroyViewMapEvent: /b.xhtml
这很奇怪,因为b.xhtml
从未被访问过。当我使用"Navigate away"
按钮离开时,会按预期打印正确的事件:
PreDestroyViewMapEvent: /a.xhtml
只有在链接上使用includeViewParams="true"
时才会触发错误的事件。通过调试,我可以看到它发生,因为com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(FacesContext)
临时设置为FacesContext
b.xhtml
的UIViewRoot,其中创建原始视图的浅表副本并设置为临时视图根。这可能是为了正确检测链接的查询字符串参数的值;它还暂时关闭了操作时间的事件,但它过早地将它们重新打开(参见“finally”块),因此对于视图的临时副本,“错误”触发了视图地图销毁事件,而没有事件对于原始视图本身预计此时。这是一件令人头疼的事情,因为我需要采取一些额外的行动来检测原始地图是否被破坏,或者它是否是“幽灵”的虚假事件。
这是一个错误还是一个想要的行为?我正在使用Mojarra 2.2.12。