gpt4 book ai didi

jsf-2.2 - 可以从 Servlet 内启动 faces 流吗?

转载 作者:行者123 更新时间:2023-12-02 00:17:02 25 4
gpt4 key购买 nike

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

有没有一种方法可以直接从 servlet 内初始化 faces 流,而不需要通过隐式操作或 JSF 转发/重定向来间接进行?

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

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

更新
我尝试了多种“自动”转发到流程的方法,而无需单击任何按钮,但我总是得到No active contexts for range type javax.faces.flow.FlowScoped。这是我的方法:

  1. f:viewAction

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

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

  2. f:事件

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

我错过了什么?

最佳答案

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

<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 始终会进行重定向!

关于jsf-2.2 - 可以从 Servlet 内启动 faces 流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27985539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com