在jsf中双重调度

时间:2015-06-16 10:43:08

标签: jsf jsf-2

是否可以在Mojarra-2.1中使用。如果我通过单击操作按钮从操作方法调度到另一个视图:

<h:commandButton value="dispatch" action="#{myBean.action()}" />

豆子:

@ManagedBean
@RequestScoped
public class MyBean{

    public String action(){
        //do some
        return "view";
    }
}

我的浏览器然后收到视图view的内容。视图view又包含以下内容:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

      <f:metadata>
            <f:event listener="#{viewBean.doDoubleDispatch()}" type="preRenderView" />
      </f:metadata>
</html>

,其中

@ManagedBean
@RequestScoped
public class ViewBean{
    public String doDoubleDispatch(){
        //do
        return "finalView";
}

在调用doDoubleDispatch方法后,我没有看到finalView的内容。但是如果单击调用该方法的actionButton,它将完全正常工作。

所以,这些事情在Mojarra-2.1中是不可能的,不是吗?

1 个答案:

答案 0 :(得分:2)

<f:event listener> 支持导航案例结果。

只有JSF 2.2 <f:viewAction action>才有。也许你会对它感到困惑。

您需要将其设为void方法并手动导航/重定向。

public void doDoubleDispatch() {
    // ...

    FacesContext context = FacesContext.getCurrentInstance();
    NavigationHandler navigationHandler = context.getApplication().getNavigationHandler();
    navigationHandler.handleNavigation(context, null, "finalView");
}

尽管如此,<f:event>并不一定需要以<f:metadata>结尾。这仅用于与<f:viewParam>一起使用时完成的自我纪录目的。在JSF 2.0 / 2.1时代,实际上滥用了能够在设置了所有视图参数后调用bean方法。因此,JSF 2.2引入了<f:viewAction>来填补这一空白,这反过来确实需要被置于<f:metadata>

另见: