Ajax JQuery 到 Spring @RequestBody?我如何传递数据?

Posted

技术标签:

【中文标题】Ajax JQuery 到 Spring @RequestBody?我如何传递数据?【英文标题】:Ajax JQuery to Spring @RequestBody? How do I pass data? 【发布时间】:2012-06-12 14:29:21 【问题描述】:

Ajax JQuery 到 Spring @RequestBody?如何传递数据?我现在正在通过传递表单字段来做春天,但我正在开发一个新系统,我们想使用 Ajax 和 RESTful 来传递数据。我的控制器看起来像下面的示例,但是有人可以通过 ajax 调用来取悦我吗?如何发布到 Spring 控制器并将数据放入正文中

@RequestMapping(method=RequestMethod.PUT, value="/employee/id")
public ModelAndView updateEmployee(@RequestBody String body) 
        Source source = new StreamSource(new StringReader(body));
        Employee e = (Employee) jaxb2Mashaller.unmarshal(source);
        employeeDS.update(e);
        return new ModelAndView(XML_VIEW_NAME, "object", e);
    

【问题讨论】:

嗨,John,您可能希望将日志记录级别设置为 DEBUG 或 ALL。 Spring 框架倾向于在较低级别记录事物,并且在尝试设置框架时,能够看到幕后发生的事情会很有帮助。祝你好运! 【参考方案1】:

使用 REST 时,了解不同 HTTP 方法之间的区别很重要。 PUT 通常意味着您将创建一个新集合或替换现有集合。 POST 通常意味着您将记录添加到集合中。两者的主要区别在于 PUT 是幂等的,这意味着重复相同的操作不会改变服务器的状态。

在下面的代码中,您的方法称为“updateEmployee”,这意味着您正在用一个新集合替换一个集合。因此,PUT 是在这种情况下使用的最合适的 HTTP 方法。但是,您的代码中有一个错误。您没有在参数列表中定义“id”:

// Added String id as a PathVariable
@RequestMapping(method=RequestMethod.PUT, value="/employee/id")
public ModelAndView updateEmployee(@RequestBody String body, @PathVariable String id)    

        // You really don't need to do this. The Spring Framework can deserialize
          // objects for you. However, one issue at a time ;)
           // also, changed e to "employee" so the variable has a better name.
        Source source = new StreamSource(new StringReader(body));
        Employee employee = (Employee) jaxb2Mashaller.unmarshal(source);

        employeeDS.update(employee);
        return new ModelAndView(XML_VIEW_NAME, "object", employee);

要向服务器发出请求,请使用 jQuery AJAX:

$.ajax(
  url: "/employee/2?t="+new Date().getTime(),
  contentType: 'application/x-www-form-urlencoded',
  type: "PUT",
  data: dataString,
  context: document.body,
  success: function(e)
          alert(e);                    
  ,
      error: function(jqXHR, textStatus, errorThrown) 
          alert(" + textStatus + " : " + errorThrown);
       
);

dataString 是数据的字符串表示形式。您可以序列化表单、使用 JSON 或发送 url 编码的表单。如果在您的问题中没有看到更多代码和更多错误消息,则不清楚您在尝试将数据发送到服务器时如何表示数据。如果您从这里开始并在您的 Java 代码中修复上述错误,这应该可以帮助您克服这个特定错误。

向您的 REST 方法提交数据的另一种方式(仅用于测试)是使用标准表单,但使用 method="PUT",因为这是您在 Spring 中使用的:

<form name="test" action="/employee/2" method="PUT">
    <input type="text" name="firstname" />
    <input type="text" name="lastname" />
    <input type="submit" name="submit" value="submit" />
</form>

这将使用 application/x-www-form-urlencoded。如果您无法反序列化,请尝试改用 JSON。祝你好运!

【讨论】:

【参考方案2】:

希望能给你一个开始!


$.ajax(
    contentType : "application/json",
    dataType : 'json',
    type : "PUT",
    url : targetUrl,
    data : $(this).serializeObject(), //json serialization (like array.serializeArray() etc)
    async : false,
    success : function(data) 
       // response
    ,
    error : function(request, status, error) 
       // any errors
    
);

【讨论】:

我这样做了,但来源是 NULLs?

以上是关于Ajax JQuery 到 Spring @RequestBody?我如何传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

Ajax JQuery 到 Spring @RequestBody?我如何传递数据?

jQuery ajax 传递JSON数组到Spring Controller

jquery的ajax与spring mvc对接注意事项

使用 jQuery $.ajax 和 Spring Boot 上传图片的进度条

Spring MVC过滤器获取自定义jquery ajax标头

Spring Security - 所有 JQuery Ajax 发布请求都返回 404