在h:link

时间:2016-01-17 19:44:17

标签: jsf jsf-2 mojarra view-scope viewparams

我有2个观看次数(a.xhtmlb.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。

0 个答案:

没有答案