可以从 Servlet 中启动人脸流吗?
Can a faces flow be started from within a Servlet?
我有一个由 servlet 访问的服务,它将用户重定向到登录屏幕。支持 bean 的范围目前正在从 @ConversationScoped 更改为 @FlowScoped,因为它更容易处理。
有没有一种方法可以直接从 servlet 中初始化面孔流,而无需通过隐式操作或 JSF 进行间接访问 forward/redirect?
我知道 @FlowScope 是一个 JSF (2.2) 范围,我想知道是否有办法,例如扩展 FacesServlet 或类似的东西。
作为一种解决方法,我目前只是添加了一个带有按钮的视图,这使得 JSF 前进以进入流目录,但我正在努力避免这种情况。
更新
我尝试了很多 'automatically' 转发到流中的方法,而无需单击任何按钮,但我总是得到 No active contexts for scope type javax.faces.flow.FlowScoped
。这是我的方法:
f:viewAction
<f:metadata>
<f:viewAction action="myFlow" />
</f:metadata>
这个似乎执行得太早了(无论如何)。
f:event
<f:event type="preRenderView" listener="#{myBean.forwardToMyFlow()}" />
bean 中的方法 returns 与 f:viewAction
.
中的结果相同
航海案例
<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>
到目前为止一切顺利,但技巧在于方法内部,您必须在其中 'manually' 通过执行以下操作来初始化所需的流程:
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
方法'activates'命名流并使其可用,这样您就可以转发到流的入口点。
请注意,即使它看起来像一个普通的转发,viewAction
总是做一个重定向!
我有一个由 servlet 访问的服务,它将用户重定向到登录屏幕。支持 bean 的范围目前正在从 @ConversationScoped 更改为 @FlowScoped,因为它更容易处理。
有没有一种方法可以直接从 servlet 中初始化面孔流,而无需通过隐式操作或 JSF 进行间接访问 forward/redirect?
我知道 @FlowScope 是一个 JSF (2.2) 范围,我想知道是否有办法,例如扩展 FacesServlet 或类似的东西。
作为一种解决方法,我目前只是添加了一个带有按钮的视图,这使得 JSF 前进以进入流目录,但我正在努力避免这种情况。
更新
我尝试了很多 'automatically' 转发到流中的方法,而无需单击任何按钮,但我总是得到 No active contexts for scope type javax.faces.flow.FlowScoped
。这是我的方法:
f:viewAction
<f:metadata> <f:viewAction action="myFlow" /> </f:metadata>
这个似乎执行得太早了(无论如何)。
f:event
<f:event type="preRenderView" listener="#{myBean.forwardToMyFlow()}" />
bean 中的方法 returns 与
f:viewAction
. 中的结果相同
航海案例
<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>
到目前为止一切顺利,但技巧在于方法内部,您必须在其中 'manually' 通过执行以下操作来初始化所需的流程:
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
方法'activates'命名流并使其可用,这样您就可以转发到流的入口点。
请注意,即使它看起来像一个普通的转发,viewAction
总是做一个重定向!