多个表单,一个保存调用和多个具有相同名称的输入元素

时间:2014-04-08 14:42:06

标签: jquery spring jsp spring-mvc

场景: - 我有一个jsp(比如A),其中我包含了更多的jsps(比如P,Q,R,S)。在P,Q,R和S中,我分别创建了一个表单。在点击主保存按钮时,我发送一个ajax请求,我在序列化所有4种形式(jsps P,Q,R,S),然后在ajax的数据中发送此序列化内容。在控制器上,我正在我的对象中检索这个序列化的表单内容,如p,q,r,s。

实际问题: - 在所有4个表单中,我有一个单独的commandName,但在每个表单中,我维护一个名为“id”的隐藏输入元素。在从控制台看到firebug中的ajax请求时,所有id都被正确地发布(因为它们分别是P,Q,R,S形式分别为1101,1102,1103,1104)但是当它到达我的控制器时所有对象(p,q,r,s)中包含的id是相同的(P,Q,R和S为1101)。找不到原因。任何帮助表示赞赏..

<form:form id="A" commandName="objectA">
   <input type="hidden" name="id" value="1101" />
</form:form>

<form:form id="B" commandName="objectB">
   <input type="hidden" name="id" value="1102" />
</form:form>

<form:form id="C" commandName="objectC">
   <input type="hidden" name="id" value="1103" />
</form:form>

<form:form id="D" commandName="objectD">
   <input type="hidden" name="id" value="1104" />
</form:form>

然后在我的ajax请求中,我将数据发送为

url  : "myController/myRequestMapping",
data : $("#A").serialize()+"&"
      +$("#B").serialize()+"&"
      +$("#C").serialize()+"&"
      +$("#D").serialize(),

在控制器上我有这个:

@RequestMapping(value="/myRequestMapping")
public void myFunction(AClass a,BClass b,CClass c,DClass d){
  System.out.println("A's ID is:"+a.getId());    //Prints 1101
  System.out.println("B's ID is:"+b.getId());    //Prints 1101 instead of 1102
  System.out.println("C's ID is:"+c.getId());    //Prints 1101 instead of 1103
  System.out.println("D's ID is:"+d.getId());    //Prints 1101 instead of 1104
}

1 个答案:

答案 0 :(得分:4)

试试这个:

如果所有表单都具有相同的输入元素,则创建一个dto类,如:

public class Form {

    private Long id;

    public Form(){}

        //getters and setters
}

AllForms类来保存所有Form个实例,例如:

public class AllForms extends ArrayList<Form> {}

然后在js中创建所有表单内容的数组:

var myarray = [
        {id: $('#A').find('input[name="id"]').val()},
        {id: $('#B').find('input[name="id"]').val()},
        {id: $('#C').find('input[name="id"]').val()},
        {id: $('#D').find('input[name="id"]').val()}
        ];

var jsonStr = JSON.stringify(myarray);

然后在AJAX请求中做:

url  : "myController/myRequestMapping",
data : jsonStr
控制器中的

如:

@RequestMapping(value="//myController/myRequestMapping", method=RequestMethod.POST)
public @ResponseBody AllForms process(@RequestBody AllForms allForms){

    System.out.println(allForms);
    return allForms;
}

或者替代方案是:

JS POST喜欢:

$.post("myController/myRequestMapping",{jsonStr : jsonStr},function(e) {
        console.log('success: '+e);
    }, "json");

和处理程序方法如:

@RequestMapping(value="/myController/myRequestMapping", method=RequestMethod.POST)
public @ResponseBody String process(@RequestParam String jsonStr){
      System.out.println(jsonStr);

      //convert here Form instance from jsonStr

    return jsonStr;
}