jsf中的双重调度

Double dispatching in jsf

在 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 中,这样的事情是不可能的,不是吗?

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

只有 JSF 2.2 <f:viewAction action> 可以。也许你对此感到困惑。

您需要将其设为 void 方法并 navigate/redirect 手动。

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>.

另请参阅:

  • Hit a bean method and redirect on a GET request
  • What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?