可以从Servlet中启动面流吗?

时间:2015-01-16 13:55:20

标签: jsf-2.2 flow-scope

我有一个servlet访问的服务,它将用户重定向到登录屏幕。支持bean的范围目前正从@ConversationScoped更改为@FlowScoped,因为它更容易处理。

有没有办法直接从servlet中初始化faces流,没有间接通过隐式动作或JSF转发/重定向?

我知道@FlowScope是一个JSF(2.2)范围,我想知道是否有办法解决这个问题。扩展FacesServlet或类似的东西。

作为一种解决方法,我目前只使用一个按钮添加了视图,这使得JSF转发进入流目录,但我试图避免这种情况。

更新
我尝试了很多方法来“自动”转发到流程中,而不必点击任何按钮,但我总是得到No active contexts for scope type javax.faces.flow.FlowScoped。我的方法是:

  1. f:viewAction

    <f:metadata>
      <f:viewAction action="myFlow" />
    </f:metadata>
    

    这个似乎执行得太早(无论如何)。

  2. f:event

    <f:event type="preRenderView" listener="#{myBean.forwardToMyFlow()}" />
    

    bean中的方法返回与f:viewAction中相同的结果。

  3. 导航案例

    <navigation-rule>
      <from-view-id>/myView.xhtml</from-view-id>
      <navigation-case>
        <from-outcome>myFlow</from-outcome>
        <to-view-id>/myFlow/myFlow.xhtml</to-view-id>
        <redirect />
        <to-flow-document-id />
      </navigation-case>
    </navigation-rule>
    
  4. 我错过了什么?

1 个答案:

答案 0 :(得分:5)

我终于找到了一个解决方案,在阅读规格并摆弄流量之后!
我有一个页面,我只是:

<f:metadata>
    <f:viewAction action="#{bean.initFlow}" />
</f:metadata>

到目前为止一切顺利,但诀窍在于方法,你必须手动&#39;通过执行以下操作初始化所需的流程:

public String initFlow(){
   FacesContext context = FacesContext.getCurrentInstance();
   FlowHandler handler = context.getApplication().getFlowHandler();
   handler.transition(context, null, handler.getFlow(context, "", "flow-name"), null, "");
   return "flow-name";
}

transition方法&#39;激活&#39;命名流程并使其可用,以便您可以转发到流程的入口点。
请注意,即使它看起来像一个正常的前进,{{1}总是重定向!