2015-01-16 28 views
2

我有一個servlet訪問的服務,它將用戶重定向到登錄屏幕。支持bean的作用域目前正在從@ConversationScoped更改爲@FlowScoped,因爲它更容易處理。可以從Servlet中啓動一個faces flow嗎?

有沒有一種方法可以直接從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> 
    

我缺少什麼?

+0

將前控制器設置爲流程沒有任何問題,但是,如果我正確讀取規範,則應該能夠直接引用流的第一個視圖;該規範說必要的'@ FlowScoped' bean必須在進入流中第一個節點時初始化 – kolossus

+0

@kolossus感謝您的回覆,併爲延遲感到抱歉,我已休息了一段時間。我在規範中找到了你提到的參考,但是我仍然無法實現它。我總是得到一個'ContextNotActiveException' ... – NanSil

回答

5

我終於找到了一個解決方案,閱讀規格和擺弄流量!
我有一個網頁,我只是有:

<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"; 
} 

0123>方法'激活'命名流並使其可用,以便您可以轉發到流的入口點。
請注意,即使它看起來像一個正常的轉發,viewAction總是做一個重定向!

相關問題