Java 如何使用JQuery处理Ajax http post的成功和失败?

Java 如何使用JQuery处理Ajax http post的成功和失败?,java,jquery,json,spring,jackson,Java,Jquery,Json,Spring,Jackson,我使用JQuery 2.0.3以这种方式发布http帖子: $.ajax({ type: "POST", url: "/demo/submitTransactions", data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }), contentType: "application/json; charset=utf-8",

我使用JQuery 2.0.3以这种方式发布http帖子:

    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data){alert(data);},
        failure: function(errMsg) {
            alert(errMsg);
        }
    });
json会在服务器上发布和写入,但是响应
成功:
失败:
不会被启用。接收json数据的控制器代码为

    @RequestMapping(value = "/submitTransactions", method = RequestMethod.POST, headers = {"content-type=application/json"})
    @ResponseBody
    @Transactional
    public String submitTransactions(@RequestBody @Valid final String string) {
        try {
            PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(filename, true)));
            out.println("\n"+string);
            out.close();
        } catch (IOException e) {
            LOGGER.severe("IOException");
            e.printStackTrace();
        }
        LOGGER.info("Received transactions "+string);
        return "Received JSON data";
    }
我怎样才能使success和failure获得已发布的json成功接收或提交失败的回调?它可以提交数据,但是来自服务器的响应“Received JSON data”没有任何作用,这与控制器方法没有区别,控制器方法是
void
,只写数据,而不使用
return
语句。您是否可以提出一个改进建议,以便发布数据的javascript也会收到响应,我认为如果出现服务器错误,响应可能是状态200 OK,或者可能是状态500或类似

根据@Oleg Estekhin的回答,应该是这样的:

    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
            .done(function(data){alert('Done!'+data);})
            .fail(function(errMsg) {alert('Failure!'+errMsg);});
$.ajax({
    // other properties
    success: function(data){alert(data);},
    error: function(errMsg) {alert(errMsg);}
});
    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "text"
    })
     .done(function(data){alert(data);})
     .fail(function(errMsg) {alert(errMsg);})
     ;
现在,如果我还使用jackson将控制器代码更改为响应对象

@RequestMapping(value=“/submitTransactions2”,method=RequestMethod.POST,headers={“content type=application/json”}) @应答器 @交易的 public AccountResponse submitTransactions2(@RequestBody@Valid final String){ 试一试{ PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(filename,true)); out.println(“\n”+字符串); out.close(); }捕获(IOE异常){ 严重(“IOException”); e、 printStackTrace(); } LOGGER.info(“收到的交易”+字符串); 返回新的AccountResponse(“已接收交易”、“已接收”、“已接收”、“已接收”); }

然后,我从服务器得到响应“Done!”(但是当只使用字符串而不使用jackson时,我得到响应“failed”)

根据第二个答案进行更新后,此更改似乎有效:

    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "text"
    })
            .done(function(data){alert('Done!'+data);})
            .fail(function(errMsg) {alert('Failure!'+errMsg);});
它可以工作。返回
String

.

首先,根据文档,包含故障回调的属性称为“error”,因此您的示例应如下所示:

    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
            .done(function(data){alert('Done!'+data);})
            .fail(function(errMsg) {alert('Failure!'+errMsg);});
$.ajax({
    // other properties
    success: function(data){alert(data);},
    error: function(errMsg) {alert(errMsg);}
});
    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "text"
    })
     .done(function(data){alert(data);})
     .fail(function(errMsg) {alert(errMsg);})
     ;
第二,“success”、“error”和“complete”回调自jQuery 1.8以来被认为是不推荐使用的,您应该使用promise样式的变体:

$.ajax({
    // other properties
})
.done(function(data){alert(data);})
.fail(function(errMsg) {alert(errMsg);});
$.ajax({ ... })
 .done(...)
 .fail(...);
首先,根据文档,包含故障回调的属性称为“error”,因此您的示例应如下所示:

    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
            .done(function(data){alert('Done!'+data);})
            .fail(function(errMsg) {alert('Failure!'+errMsg);});
$.ajax({
    // other properties
    success: function(data){alert(data);},
    error: function(errMsg) {alert(errMsg);}
});
    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "text"
    })
     .done(function(data){alert(data);})
     .fail(function(errMsg) {alert(errMsg);})
     ;
第二,“success”、“error”和“complete”回调自jQuery 1.8以来被认为是不推荐使用的,您应该使用promise样式的变体:

$.ajax({
    // other properties
})
.done(function(data){alert(data);})
.fail(function(errMsg) {alert(errMsg);});
$.ajax({ ... })
 .done(...)
 .fail(...);

如Oleg Estekhin在回答中所述,要使用的正确属性是
error
。此外,您还应使用promise变体:

$.ajax({
    // other properties
})
.done(function(data){alert(data);})
.fail(function(errMsg) {alert(errMsg);});
$.ajax({ ... })
 .done(...)
 .fail(...);
接下来,您应该将
dataType
更改为
text
,以便jQuery知道返回的值将被解析为普通文本而不是JSON。这将导致调用成功回调。最后的代码如下所示:

    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
            .done(function(data){alert('Done!'+data);})
            .fail(function(errMsg) {alert('Failure!'+errMsg);});
$.ajax({
    // other properties
    success: function(data){alert(data);},
    error: function(errMsg) {alert(errMsg);}
});
    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "text"
    })
     .done(function(data){alert(data);})
     .fail(function(errMsg) {alert(errMsg);})
     ;

如Oleg Estekhin在回答中所述,要使用的正确属性是
error
。此外,您还应使用promise变体:

$.ajax({
    // other properties
})
.done(function(data){alert(data);})
.fail(function(errMsg) {alert(errMsg);});
$.ajax({ ... })
 .done(...)
 .fail(...);
接下来,您应该将
dataType
更改为
text
,以便jQuery知道返回的值将被解析为普通文本而不是JSON。这将导致调用成功回调。最后的代码如下所示:

    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
            .done(function(data){alert('Done!'+data);})
            .fail(function(errMsg) {alert('Failure!'+errMsg);});
$.ajax({
    // other properties
    success: function(data){alert(data);},
    error: function(errMsg) {alert(errMsg);}
});
    $.ajax({
        type: "POST",
        url: "/demo/submitTransactions",
        data: JSON.stringify({ ConfirmedTransactions: confirmedTransactions }),
        contentType: "application/json; charset=utf-8",
        dataType: "text"
    })
     .done(function(data){alert(data);})
     .fail(function(errMsg) {alert(errMsg);})
     ;

谢谢你的回答。我使用JQuery 2.0.3并用这个更新答案。谢谢你的回答。我使用JQuery 2.0.3并用这个更新答案。