【问题标题】:Ajax json POST and Spring MVC ControllerAjax json POST 和 Spring MVC 控制器
【发布时间】:2012-07-06 21:15:02
【问题描述】:

我有这样的 ajax json POST 方法

$.ajax({
    type: 'POST',
    url: "localhost:8080/webeditor/spring/json/", 
    data: JSON.stringify(contents),
    dataType: "json"
});

控制器处理发布请求

JSONPObject json;
BindingResult result = new BeanPropertyBindingResult( json , "MyPresentation" );
@RequestMapping(value="json/", method = RequestMethod.POST)
public void savePresentationInJSON(Presentations presentation,BindingResult result) {
        //do some action

}

但我收到此错误

XMLHttpRequest 无法加载 localhost:8080/webeditor/spring/json/。仅 HTTP 支持跨源请求。

我不确定如何纠正上述错误。

【问题讨论】:

  • 你返回的是 void,不需要使用响应体
  • 它没有解决我的问题,它没有为 HTTP 找到映射
  • 不,我不认为它会,只是观察。但这一切看起来都很好,类上没有请求映射?
  • 感谢这个=) 是的,404 PageNotFound - 找不到 HTTP 请求的映射
  • 定义此类的方法是否具有全局请求映射 - 然后将其添加到方法请求映射之前

标签: java ajax spring spring-mvc


【解决方案1】:

您的应用程序应该有一个上下文根,它将位于 URL 路径的其余部分之前。你还应该在 web.xml 中定义一个servlet-mapping,它定义了哪些请求被定向到你的 Spring 控制器。因此,如果您的应用程序的上下文根是“myapp”并且您的 servlet-mapping 将指向 *.html,那么您的 ajax 调用将如下所示:

$.ajax({
    type: 'POST',
    url: "/myapp/webeditor/spring/json.html",
    data: JSON.stringify(contents),
    dataType: "json",
    success: function(response) {
        // Success Action
    }
}); 

【讨论】:

    【解决方案2】:

    我的最终作品版本

    var jsonfile={json:JSON.stringify(contents)};
    $.ajax({
        type: 'POST',
        url: "/webeditor/spring/json/", 
        data: jsonfile,
        dataType: "json"
    });
    

    AJAX 和

    @RequestMapping(value = "/json/", method = RequestMethod.POST)
    public void saveNewUsers( @RequestParam ("json") String json)
    {
        System.out.println( json );
    }
    

    【讨论】:

      【解决方案3】:

      看起来像 jQuery,为什么不试试

      $.getJSON('webeditor/spring/json', JSON.stringify(contents, function(data) {//do callbackstuff});
      

      如果您想请求跨域,方法如下:-

      cbFn = function(data) {
         // do callback stuff. 
      }
      
          var ca = document.createElement('script');
                      ca.type = 'text/javascript';
                      ca.async = true;
                      ca.src = server + '/webeditor/spring/json.jsonp?callback=cbFn';
                      var s = document.getElementsByTagName('head')[0];
                      s.parentNode.insertBefore(ca, s);
      

      并添加 servlet 映射

      <servlet-mapping>
          <servlet-name>yourSevletName</servlet-name>
          <url-pattern>*.jsonp</url-pattern>
      </servlet-mapping>
      

      【讨论】:

      • *.jsonp”是“jsonp”还是“json”?
      【解决方案4】:

      使用 Spring 传递 JSON 相当简单。考虑以下 jQuery 函数:

      function processUrlData(data, callback) {
          $.ajax({
              type: "GET",
              url: "getCannedMessageAsJson.html",
              data: data,
              dataType: "json",
              success: function(responseData, textStatus) {
                  processResponse(responseData, callback);
              },
              error : function(responseData) {
                  consoleDebug("  in ajax, error: " + responseData.responseText); 
              }
          });
      }
      

      现在使用下面的 String @Controller 方法...

      @RequestMapping(value = "/getCannedMessageAsJson.html", method = RequestMethod.POST) 
      public ResponseEntity<String> getCannedMessageAsJson(String network, String status, Model model) {
      
          int messageId = service.getIpoeCannedMessageId(network, status);
          String message = service.getIpoeCannedMessage(network, status);
      
          message = message.replaceAll("\"", "&quot;");
          message = message.replaceAll("\n", "");
      
          String json = "{\"messageId\": \"" + messageId 
          + "\", \"message\": \"" + message + "\"}"; 
      
          HttpHeaders responseHeaders = new HttpHeaders();
          responseHeaders.setContentType(MediaType.APPLICATION_JSON);
          return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED);
      }
      

      在我的情况下,请求非常简单,我只是在控制器方法中硬连线 json 格式,但您可以轻松地使用像 Jackson 这样的库来生成 json 字符串。

      正如其他人所说,验证@RequestMapping 中的“值”是一个唯一的、合法的文件名。使用我上面展示的 json 方法,您不必拥有相应的 jsp 页面(实际上它不会使用)。

      【讨论】:

        【解决方案5】:

        在网址中:url:“localhost:8080/webeditor/spring/json/”

        webeditor 必须是战争名称或服务名称,所以在你的 @RequestMapping(value="/webeditor/spring/json/" 我认为你不应该有 'webeditor' 它必须只有 /spring/json强>

        通常 404 表示 URL 请求错误或没有为该 URL 运行此类服务

        【讨论】:

          【解决方案6】:

          在你的jsp中包含这样的标签库

          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
          

          然后使用spring创建一个完整的url

          <c:url var="yourFullUrl" value="/webeditor/spring/json/" />
          

          然后基于此创建 javascript 变量,以便您可以在 Ajax 中使用

          <script>
          var yourUrl= '<c:out value="${yourFullUrl}"/>';
          </script>
          

          不使用表示 url 的 javascript 变量:

          <script>
          $.ajax({
                  type: 'POST',
                  url: yourUrl, 
                  data: JSON.stringify(contents),
                  dataType: "json"
          });
          </script>
          

          【讨论】:

          • 你不能单独在 js 中生成基于 spring 的 url,你必须按照我所说的(或接近的变体)来做。 JS是客户端,你需要对spring url进行服务器端处理。或者你可以对主机进行硬编码
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-09
          • 1970-01-01
          • 1970-01-01
          • 2016-05-01
          • 2019-06-14
          • 1970-01-01
          相关资源
          最近更新 更多