如何在将表单提交给第三方URL之前调用服务器端操作方法?

时间:2011-01-17 15:51:54

标签: java javascript ajax spring-mvc spring-webflow

好的,我正在使用Spring Webflow,我目前有一个涉及两个jsp页面(视图)的流程,其中第二个将表单提交给第三方系统(付款)。

在我的pay-flow.xml中,我有像这样的状态;

<!-- Initial state, the jsp(view) gathers the number of items to purchase -->
<view-state id="buy" view="credit/buy" model="credit">
    <transition on="submit" to="createTrans" />
</view-state>

<!-- State not tied to a jsp, saves the "credit" object to the database -->
<action-state id="createTrans">
   <evaluate expression="creditAction.saveTrans(credit)"/>
   <transition to="wpRedirect"/>
</action-state>

<!-- Gathers some more info & has a form that submits to the 3rd party system -->
<view-state id="wpRedirect" view="credit/redirect">
    <transition on="accepted" to="showInvoice" history="invalidate">
    <evaluate expression="creditAction.reloadTrans(credit)" result="credit" />
</transition>
</view-state>

正如您所看到的,过程基本上是这样的;
1)显示第一个jsp,用户输入一些细节,提交表格
2)将模型对象保存到后台的数据库中 3)显示第二个jsp,用户输入更多细节并提交表格
4)表单提交到第三方URL,用户与第三方系统进行交互 5)最终第三方重定向回流程
6)在“已接受”响应中,重新加载先前保存的模型对象

我想要做的是将两个jsps合并到一个视图中,并基本将这三个状态压缩为一个。我有一些javascript和表单控件来收集所有信息。

问题是,我怎样才能将表单提交给第三方网址,但在此之前,还是在服务器端调用“creditAction.saveTrans(credit)”?显然,这需要对用户透明,他们应该很高兴页面现在已经合并,但仍然只需要在最后单击“提交”,并且在没有他们知道的情况下完成所有后台保存和加载。

我在想我可以在提交按钮上点击一下,使它只是一个普通的按钮,然后从类似下面的javascript提交表单,但是如何调用我的服务器端代码来保存模型基本上在在.submit()?

之前
function submitform() {
    <!-- call creditAction.saveTrans(credit) somehow??? -->
    document.forms["myform"].submit();
}

1 个答案:

答案 0 :(得分:2)

您有两种选择:

1)使用JavaScript更改表单的目标和操作,并将其提交给隐藏的IFrame,提交,然后将其更改回正常状态并再次提交。

2)使用AJAX提交,然后正常提交表格。