在Java Servlet响应上以HTML格式呈现JSONP

时间:2012-05-29 01:34:22

标签: java jquery servlets cross-domain jsonp

我遇到了问题。我有一个表单提交,它使用jQuery JSONP来调用我的servlet。此代码嵌入在另一个域中,因此使用。

这是我的表单提交AJAX:

<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js' type='text/javascript'></script>
<script language='Javascript' type='text/javascript'>
$(\"#form1\").submit(function(event) {
    event.preventDefault();
    var $form = $(this),
        choice2 = $form.find( 'input[name=\"personChoice\"]' ).val(),
        url = $form.attr( 'action' ),
    $.ajax({
            data: {choice:choice2},
            url: url,
            dataType: 'jsonp',
            jsonp: 'callback',
            jsonpCallback: 'updatePage'
    });
});
function updatePage(renderHTML) { 
    alert(renderHTML);
}
</script>

我可以在我的Java servlet中确认request.getParameter(“callback”)是用updatePage填充的。我需要做的是在Java Servlet中发回JSONP格式的响应。怎么做到这一点?我现在有一些非常简单的东西:

Java Servlet代码:

        response.setContentType("text/javascript");
        PrintWriter out = response.getWriter();

        String renderHTML = "{ renderHTML = 'Successful'}";

        out.println(renderHTML);

我也尝试过JSON内容类型响应,我的javascript updatePage中的警报不会被调用。

Java servlet和jsonpCallback上的响应是什么?

2 个答案:

答案 0 :(得分:1)

JSONP响应必须包含在函数调用中,该函数调用在带有回调的请求中指定。

这样的东西
callback({ renderHTML = 'Successful'});

通常应该在过滤器上注意这一点。

答案 1 :(得分:0)

jsonpCallback属性不是您认为的那样。它是一个字符串(或返回字符串的函数),jquery将其用作请求URL的一部分。如果您不需要该功能,可以将其设置为falseSee the docs

您应该使用'success'属性来设置响应处理程序。 像这样:

    $.ajax({
        data: {choice:choice2},
        url: url,
        dataType: 'jsonp',
        jsonp: 'callback',
        jsonpCallback: false,
        error: function(xhr, status, error) {
            alert("error");
        },
        success: updatePage
        });

此外,用于JSONP的最佳内容类型是application/javascript

希望有所帮助。