Ajax发送数据到控制器


问题内容

我想知道这两种语法之间的区别是什么:

  var value = $("#myForm").serialize();
  $.ajax({
    type: "post",
    url: "testMethod",
    data: value
});

  var value = $("#myForm").serialize();
  $.ajax({
    type: "post",
    url: "testMethod",
    data: "valueName=" + value
});

我以为它们是相同的,但是当我使用第一个时,在我的spring控制器中,此属性具有完全填充的属性。当我使用第二种方法时,该属性的所有属性均为null。

有人对此有解释吗?

这是我的 JSP

<form:form id="myForm" action="*" modelAttribute="filters" >

    <form:input ...  path="age" />  
    <form:input ...  path="gender" />   
    <form:input ...  path="location" />

</form:form>

这是JS

$('#ok_provinces_btn_id').click(function(){
var second = $('#secondAttr').val();

var f = $("#myForm").serialize();

$.ajax({
    type: "post",
    url: "testMethod",
    data: ?????
});

});

这是我的 控制器

    @RequestMapping(value="testMethod", method=RequestMethod.POST)
public void testMethod(
        @ModelAttribute("filters") FiltersWrapper filters,
                    @RquestParam String second
        ){

             //Here the **second** param is OK 
    filters.getAge(); //NULL
}

问题答案:

解释为什么在代码 的第一个变体中 获得空属性的原因这是正确的并且可以工作 ):

  var value = $("#myForm").serialize();
  $.ajax({
    type: "post",
    url: "testMethod",
    data: value
});

您已经将表格序列化为value变量。

在第二个变体中( 这是不正确的,将不起作用 ):

  var value = $("#myForm").serialize();
  $.ajax({
    type: "post",
    url: "testMethod",
    data: "valueName=" + value
});

您将表格数据序列化到序列化查询之前value和之后添加的数据中valueName=。这根本不是正确的方法。

查询字符串必须是这样的,例如:param1=bob&param2=bob1&param3=mama。但在第二个示例中,查询字符串为:valueName=param1=bob&param2=bob1&param3=mama。这是无效的查询。这就是为什么属性为null的原因。

在不序列化表单的情况下发送数据 如果要发送一些参数,则必须使用另一种方法(无论参数是表单还是非表单):

var param1 = $("#id_of_needed_data").val();
var param2 = $("#id_of_needed_data").val();
// etc
$.ajax({
    type: "post",
    url: "testMethod",
    data: "param1="+param1+"&param2="+param2; // etc
});

发送表单数据+一些额外的参数
首先,我认为发送表单字段+一些额外的东西不是一个好主意。我认为最好将这些额外的参数作为隐藏字段添加到表单中。无论如何,如果您要发送一些非格式+格式参数,请尝试以下代码:

var param1 = $("#id_of_needed_data").val();
var param2 = $("#id_of_needed_data").val();
// etc
var value = $("#myform").serialize();
var query = value;
if (value != '') {
    query = query + "&";
}
query = query + "param1="+param1+"&param2="+param2;

$.ajax({
    type: "post",
    url: "testMethod",
    data: ; query;
});