使用 javascript 表单提交执行 spring web flow 转换

发布于 2024-11-15 22:04:02 字数 278 浏览 3 评论 0原文

我们在 Web 项目中结合使用 Facelets 和 Spring Web Flow。 Web 流中声明了一些变量。我想在流程之外访问这些变量。我尝试访问这些变量的原因是,我们正在使用 javaScript 提交表单。我们无法使用 javaScript 提交表单作为 Webflow 的一部分。

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

或者

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

We are using a combination of facelets and spring web flow in our web project. There are some variables declared in the web flow. I would like to access these variables outside the flow. The reason I am trying to access these variable is, we are submitting a form using javaScript. We cannot submit a form as part of webflow using javaScript.

Can anybody give directions to submit a form using javaScript and still be part of web flow (as if a commandButton or commandLink was clicked)?

OR

How can I access flow variables outside the we flow?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

耳根太软 2024-11-22 22:04:02

在谷歌上进行更多搜索后,我找到了解决方案。我能够从 javascript 提交表单,并且仍然是网络流程的一部分。我按照以下步骤操作:

  1. Javascript - 组合框值更改时提交表单:

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

    eventId 设置为 Web 流中转换的值。

  2. 我们需要一个 JSF Phase 监听器。该侦听器拦截 JSF 流并将该流转移到 Web 流执行器。我需要在“更新模型值”JSF 阶段完成后拦截该流程。以下是相同的代码:

    导入javax.el.E​​LContext;
    导入 javax.el.MethodExpression;
    导入 javax.faces.component.UICommand;
    导入 javax.faces.context.FacesContext;
    导入 javax.faces.event.ActionEvent;
    导入 javax.faces.event.PhaseEvent;
    导入 javax.faces.event.PhaseId;
    导入 javax.faces.event.PhaseListener;
    
    导入 org.springframework.faces.webflow.JsfUtils;
    
    公共类 EventIdPhaseListener 实现 PhaseListener {
    
    公共无效afterPhase(PhaseEvent事件){
        如果(JsfUtils.isFlowRequest()){
            FacesContext context = event.getFacesContext();
            if (context.getExternalContext().getRequestParameterMap().containsKey("_eventId")) {
            UICommand 事件源 = 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));
        }
    }
    }
    
    公共无效beforePhase(PhaseEvent事件){
        // 什么都不做
    }
    
    公共 PhaseId getPhaseId() {
        返回 PhaseId.UPDATE_MODEL_VALUES;
    }
    
    私有 MethodExpression ConvertEventIdToMethodExpression(FacesContext facesContext, String eventId) {
    ELContext elContext = facesContext.getELContext();
    返回 facesContext.getApplication().getExpressionFactory().createMethodExpression(elContext, eventId,
            String.class, new Class[0]);
    }
    }
    

有关更多详细信息,请检查 JSF 阶段侦听器Spring Web 流和 MVC 集成

I was able to find the solution after doing some more search on google. I was able to submit a form from javascript and still be part of the web flow. I followed the below steps:

  1. Javascript - form submit on change of combo-box value:

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

    The eventId is set to value of the transition in the web flow.

  2. We need to have a JSF Phase listener. This listener intercepts in the JSF flow and divert the flow to web flow executor. I needed the flow to be intercepted after the Update Model Values JSF phase is completed. Following is the code for the same:

    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]);
    }
    }
    

For further details check JSF Phase Listener and Spring web flow and MVC integration.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文