0

我们在 web 项目中使用了 facelets 和 spring web flow 的组合。在 Web 流中声明了一些变量。我想在流程之外访问这些变量。我试图访问这些变量的原因是,我们正在使用 javaScript 提交表单。我们不能使用 javaScript 提交表单作为 webflow 的一部分。

任何人都可以指导使用 javaScript 提交表单并且仍然是 Web 流程的一部分(就像单击了 commandButton 或 commandLink)?

或者

如何访问我们流之外的流变量?

4

1 回答 1

1

在谷歌上进行更多搜索后,我能够找到解决方案。我能够从 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 流执行器。我需要在更新模型值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 Phase ListenerSpring web flow and MVC integration

于 2011-06-21T11:39:12.677 回答