我想提交一个表单,同时向我的Spring MVC服务器发送一个ajax请求。为此,我有一个这样的表格:
<form id='confirma' method='post' action='confirma'>
<button type='submit' id='save' class='btn btn-success' value='Save'>Enviar</button>
</form>
在我的服务器中,我有两种方法可以接收这两个请求(ajax请求和普通表单提交)。
// receive from form
@RequestMapping("fromForm")
public String fromForm(Model model)
{
// get atb1 values from database
model.addAttribute("atb1", atb1);
return "file.jsp";
}
// receive from ajax
@RequestMapping("fromAjax")
public void fromAjax(String jsonData)
{
// deserialize json Data and insert it on database
System.out.println("data received!");
}
我的目的是从Ajax请求接收数据,将其保存在数据库中,并在表单提交方法中获取此数据,在此示例中称为fromForm。
我知道这可能看起来很疯狂,但我这样做是因为我有一系列的提交表单,我想让它们彼此独立,所以我可以调用它们中的任何一个而不传递之前的数据形成。
我试图通过使用jQuery来处理它。所以这就是我所做的:
function ajaxRequest() {
var jsonArray = new Array();
// Complete the jsonArray with an Array of objects created by myself
$.ajax({
url: "fromAjax",
cache: false,
contentType: false,
processData: false,
data: JSON.stringify(jsonArray, null, 4),
type: 'POST',
success: function (data, textStatus, jqXHR) {
console.log("success ajax");
return true;
},
error: function (xhr, status, error) {
console.log("error ajax");
return false;
}
});
}
$(document).on('submit', '#confirma', function(event) {
event.preventDefault();
// by return this method, I would just call the another jsp page, if the ajax
// request is completed successfully
return ajaxRequest();
});
这不起作用..如果我在表单提交中删除了event.preventDefault,我只收到服务器上的表单提交。如果我有event.preventDefault调用,则只有ajax请求命中服务器。
如何让两个请求都到达服务器?
答案 0 :(得分:2)
从浏览器的角度考虑这一点。想象一下,它已经成功地向/fromAjax
和发送了一个XmlHttpRequest到/confirma
的常规表单提交POST。现在假设服务器首先响应POST /confirma
。当表单提交响应包含要显示的新HTML页面或重定向到另一个页面时,浏览器要做什么 - 浏览器应该如何处理(仍然未决的)XmlHttpRequest?
或者从服务器的角度来看 - 当服务器在收到或开始处理fromForm()
方法的请求之前处理fromAjax()
方法的请求时会发生什么?
如果您打算
从Ajax请求接收数据,将其保存在数据库中,并以表单提交方式获取此数据
然后我会首先发送ajax请求,然后当你收到响应时,触发Javascript中的表单提交,以便这些请求连续发生(一个接一个)而不是并行发生。