【问题标题】:How to send table data from HTML form submit via ajax call to Spring MVC controller如何通过 ajax 调用将 HTML 表单提交中的表数据发送到 Spring MVC 控制器
【发布时间】:2019-03-18 15:43:14
【问题描述】:

假设我有一个类似于此格式的 HTML 表格

<form> <table id="a">
    <thead>
    <th>Name</th>
    <th>Series</th>
    <th>Value</th>
    </thead>
    <tbody id="b">
    <tr><td>Enhancer</td><td>Enhancement</td><td>50</td></tr>
    <tr><td>Plans</td><td>Plan</td><td>50</td></tr>
    </tbody>
    </table>
    <input type="submit" value="Send" action="SomeControllerAction" /></form>

在“名称”、“系列”和“值”标题下有两行。

我需要通过 form 将这些数据发送到带有 AjaxSpring 控制器,我可以在其中获取或设置每个控制器的值在模型中迭代地行。 我不知道如何实现这一点。这就是如何将表中的数据发送到 spring 控制器方法并获取值。

帮助处理代码段! 谢谢

【问题讨论】:

    标签: ajax spring-mvc jsp html-table form-data


    【解决方案1】:

    虽然前面的答案是正确的,但我还是建议引入一个包含三个字段的类:nameseriesvalue。 这个类应该有一个有意义的名字。 这里我将它命名为MyObject,因为我不知道你的应用是关于什么的。

    我的对象

    public class MyObject {
    
        private String name, series;
        private Integer value;
    
        // Getters and setters
    }
    

    控制器(返回类型可能不同)

    @PostMapping("/series")
    @ResponseBody
    public List<MyObject> postSeries(@RequestBody List<MyObject> myObjects) {
        myObjects.forEach(System.out::println);
        // Handle myObjects
        return myObjects;
    }
    

    JSP

    <table id="tableMyObjects">
        <thead id="a">
        <tr>
            <th>Name</th>
            <th>Series</th>
            <th>Value</th>
        </tr>
        </thead>
        <tbody id="b">
        <tr>
            <td><input type="text" name="name"  /></td>
            <td><input type="text" name="series" /></td>
            <td><input type="text" name="value" /></td>
        </tr>
        <tr>
            <td><input type="text" name="name" /></td>
            <td><input type="text" name="series" /></td>
            <td><input type="text" name="value" /></td>
        </tr>
        </tbody>
    </table>
    <button id="postButton">Post myObjects</button>
    

    jQuery

    $('#postButton').click(function() {
        var myObjects = [];
        $('#b tr').each(function(index, item) {
            var $item = $(item);
            myObjects.push({
                name: $item.find("td input[name='name']").val(),
                series: $item.find("td input[name='series']").val(),
                value: $item.find("td input[name='value']").val(),
            });
        });
        $.ajax({
            url: '/series',
            method: 'POST',
            contentType : 'application/json; charset=utf-8',
            data: JSON.stringify(myObjects)
        })
        .done(function(myObjects) {
            // handle success
        })
        .fail(function() {
            // handle fail
        });
    });
    

    【讨论】:

      【解决方案2】:

      使用 javascript/jquery 你可以轻松做到这一点。

      在迭代表格内容时生成一个输入类型隐藏文本字段,如下所示。

      <tbody id="b">
          <tr>
            <td>
             <input type="hidden" name="Name" value="Enhancer" />
             Enhancer
            </td>
            <td>
             <input type="hidden" name="Series" value="Enhancement" />
             Enhancement
            </td>
            <td>
             <input type="hidden" name="Value" value="50" />
             50
           </td>
         </tr>
      </tbody>
      

      然后按名称获取所有隐藏字段值,如下所示。

      $("[name='Name']").val();
      $("[name='Series']").val();
      $("[name='Value']").val();
      

      然后在控制器中将这些参数作为数组接受,如下所示。

      @RequestMapping(method = RequestMethod.POST, produces = "text/html")
             public String create(@RequestParam(value = "Name") String[] Name,
                     @RequestParam(value = "Series") String[] Series,
                     @RequestParam(value = "Value") String[] Value,
                     BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest){
                   //code goes here
      }
      

      注意:您必须编写 javascript 代码来设置多行的隐藏字段值,例如 Call javascript function with if JSTL

      【讨论】:

      • 看起来不错,但是如何在模型中为每一行设置表数据(使用 getter 和 setter)。说使用模型属性?
      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      相关资源
      最近更新 更多