【问题标题】:Can a faces flow be started from within a Servlet?是否可以从 Servlet 中启动人脸流?
【发布时间】:2015-01-16 13:55:19
【问题描述】:

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

有没有一种方法可以直接从 servlet 中初始化一个面流,而不需要通过隐式操作或 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>
    

我错过了什么?

【问题讨论】:

  • 在流中使用前端控制器并没有错,但是,如果我正确阅读规范,您应该能够直接引用流的第一个视图;规范说必要的@FlowScoped bean 必须在进入流中的第一个节点时进行初始化
  • @kolossus 感谢您的回复,抱歉耽搁了,我已经休息了一段时间。你提到的,我在规范中找到了参考,但我仍然无法让它工作。我总是收到ContextNotActiveException...

标签: jsf-2.2 flow-scope


【解决方案1】:

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

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

到目前为止一切顺利,但诀窍在于方法内部,您必须通过执行以下操作“手动”初始化所需的流程:

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 方法“激活”命名流并使其可用,以便您随后可以转发到流的入口点。
请注意,即使它看起来像一个普通的转发,viewAction 总是做重定向!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 2020-04-28
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多