【问题标题】:Javascript form submission to activate Spring Web Flow transitions with JSF integrationJavascript 表单提交以激活带有 JSF 集成的 Spring Web Flow 转换
【发布时间】:2010-09-27 17:48:41
【问题描述】:

我正在使用 Spring WebFlow 2、Facelets 和 JSF 开发应用程序。我的一个流程确实有一个页面,该页面必须在某些事件中触发表单提交。对于每个不同的动作,必须呈现不同的视图。所以,我正在尝试激活以下 javascript 代码来执行提交:

function myFormSubmit( eventId ) {
   var formAction = document.myForm.action;
   document.myForm.action = formAction + '&_eventId=' + eventId;
   document.myForm.submit();
}

不幸的是,这不会触发我的流程中请求的转换。页面没有变化。有谁知道如何处理这个问题?

谢谢, 亚历山大

【问题讨论】:

  • 此事件如何附加到您的表单中?是什么激活它?
  • 常规表单元素事件? onchange、onclick 等等!
  • 请提供您尝试提交的表单的 HTML,这样更容易回答您的问题。

标签: javascript jsf facelets spring-webflow


【解决方案1】:

对 SringFaceletsSF 一无所知,但我认为事件处理程序可能应该返回 true。否则您的浏览器不会提交表单。

所以:

function myFormSubmit( eventId ) {
   var formAction = document.myForm.action;
   document.myForm.action = formAction + '&_eventId=' + eventId;
   document.myForm.submit();
   return true;
}

【讨论】:

  • 用萤火虫调试我可以看到提交已经完成。反正我加了你说的return true,结果是一样的
【解决方案2】:

仔细观察,这段代码有很多问题。

document.myForm.action 是一种获取元素的非标准方式。更好的跨浏览器方式是:

document.getElementById('myFormId');

在表单操作 URL 上盲目地附加一个 & 号假定已经有另一个 url 参数,因此 URL 后面已经有一个问号。如果不是这种情况,则以下换行:

document.myForm.action = formAction + '&_eventId=' + eventId;

最后,如果您将此函数作为 onsubmit 处理程序调用,我相信您应该只返回 true,而不是调用 myForm.submit() 方法

【讨论】:

  • 感谢三联画的提示。我知道你指出的问题。目前,我只是想让它在 Firefox 中运行。这就是这种糟糕代码的借口。确实还有另外一个url参数,所以生成的action url就OK了。
【解决方案3】:

我在 Spring WebFlow 论坛中找到了解决方案。根据 Jeremy Grelle 的说法,在将 Spring WebFlow 集成到 JSF 时,提交“_eventId”参数不会触发转换。他给出的解决方案是创建一个 JSF PhaseListener,它在发送“_eventId”参数时创建一个 JSF 动作。

phaseListener 代码可见http://forum.springsource.org/showthread.php?p=219358#post219358

【讨论】:

    【解决方案4】:

    修改 form.action 是向表单提交添加信息的一种非常糟糕的方式。我建议在您的表单中放置一个隐藏的输入,您可以使用您的 eventID 填充它。

    【讨论】:

      【解决方案5】:

      您是在 GET 参数还是 POST 参数中寻找此参数? 它不会出现在 POST 中。

      更新:

      好的,为了说明,试试这个...

      改变你的功能来做到这一点:

      function myFormSubmit( eventId ) {
         var formAction = document.myForm.action;
         //document.myForm.action = formAction + '&_eventId=' + eventId;
           var myAction = document.createElement('input');
           myAction.setAttribute('name', '_eventId');
           myAction.setAttribute('type', 'hidden');
           myAction.setAttribute('value', eventId);
           document.myForm.appendChild(myAction);
         document.myForm.submit();
      }
      

      在任何(非 IE)* 浏览器中测试,看看它是否有效。如果是这样,那么 GET 与 POST 参数就是问题所在。

      * non-IE: trying to set the name or type in IE will FAIL, thus don't test there.
      

      【讨论】:

      • Im not sure if I understood your question, but what Im 试图将参数 '_eventId' 添加到我的 POST 请求中。用firebug调试请求,确实加了参数,但是s not being processed as I已经被服务器认为了
      【解决方案6】:

      您有什么理由不能使用 SWF 附带的 Spring Faces 组件吗?有一个 ajaxEvent 标记可用于包装元素。它在给定的 javascript 事件(onclick、onchange)上激活并调用您选择的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-28
        • 2014-07-15
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        相关资源
        最近更新 更多