0

Web プロジェクトでは、Facelets と Spring Web Flow を組み合わせて使用​​しています。Web フローで宣言された変数がいくつかあります。フローの外でこれらの変数にアクセスしたいと思います。これらの変数にアクセスしようとしている理由は、javaScript を使用してフォームを送信しているためです。JavaScript を使用して Webflow の一部としてフォームを送信することはできません。

javaScript を使用してフォームを送信し、Web フローの一部として (commandButton または commandLink がクリックされたかのように) 指示を出すことはできますか?

また

we フロー以外のフロー変数にアクセスするにはどうすればよいですか?

4

1 に答える 1

1

Googleでさらに検索した後、解決策を見つけることができました。JavaScript からフォームを送信しても、Web フローの一部であることができました。以下の手順に従いました。

  1. Javascript - コンボボックス値の変更時のフォーム送信:

    jQ161("#comboBoxId").change(function(e) {
        var formAction = document.myform.action;
        document.myform.action = formAction + '&_eventId=showDetails&param1=value1';
        document.myform.submit();
    });
    

    eventIdは、Web フローのトランジションの値に設定されます。

  2. JSF Phase リスナーが必要です。このリスナーは JSF フローでインターセプトし、フローを Web フロー エグゼキューターに迂回させます。Update Model Values JSF フェーズが完了した後、フローをインターセプトする必要がありました。以下は同じコードです。

    import javax.el.ELContext;
    import javax.el.MethodExpression;
    import javax.faces.component.UICommand;
    import javax.faces.context.FacesContext;
    import javax.faces.event.ActionEvent;
    import javax.faces.event.PhaseEvent;
    import javax.faces.event.PhaseId;
    import javax.faces.event.PhaseListener;
    
    import org.springframework.faces.webflow.JsfUtils;
    
    public class EventIdPhaseListener implements PhaseListener {
    
    public void afterPhase(PhaseEvent event) {
        if (JsfUtils.isFlowRequest()) {
            FacesContext context = event.getFacesContext();
            if (context.getExternalContext().getRequestParameterMap().containsKey("_eventId")) {
            UICommand eventSource = new UICommand();
            eventSource.setTransient(true);
            eventSource.setParent(context.getViewRoot());
            eventSource.setId("_eventId");
            String eventId = (String) context.getExternalContext().getRequestParameterMap().get("_eventId");
            eventSource.setActionExpression(convertEventIdToMethodExpression(context, eventId));
            context.getViewRoot().queueEvent(new ActionEvent(eventSource));
        }
    }
    }
    
    public void beforePhase(PhaseEvent event) {
        // Do Nothing
    }
    
    public PhaseId getPhaseId() {
        return PhaseId.UPDATE_MODEL_VALUES;
    }
    
    private MethodExpression convertEventIdToMethodExpression(FacesContext facesContext, String eventId) {
    ELContext elContext = facesContext.getELContext();
    return facesContext.getApplication().getExpressionFactory().createMethodExpression(elContext, eventId,
            String.class, new Class[0]);
    }
    }
    

詳細については、 JSF フェーズ リスナーおよびSpring Web フローと MVC 統合を確認してください。

于 2011-06-21T11:39:12.677 に答える