【问题标题】:Executing spring web flow transitions using javascript form submit使用javascript表单提交执行spring web flow转换
【发布时间】:2011-06-16 16:01:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: spring-webflow-2 jsf-1.2


    【解决方案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 流中 transition 的值。

    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 Phase ListenerSpring web flow and MVC integration

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多