Рендеринг JSONP в формате HTML в ответе сервлета Java

У меня проблема. У меня есть отправка формы, которая использует jQuery JSONP для обратного вызова моего сервлета. Этот код встроен в другой домен, отсюда и его использование.

Вот моя форма отправки 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, что request.getParameter("callback") заполняется updatePage. Что мне нужно сделать, так это отправить ответ в формате JSONP в сервлет Java. Как это сделать? На данный момент у меня есть что-то очень простое:

Код сервлета Java:

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

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

        out.println(renderHTML);

Я также попробовал ответ типа контента JSON, предупреждение в моем javascript updatePage не вызывается.

В чем хитрость с сервлетом Java и ответом на jsonpCallback???


person user82302124    schedule 29.05.2012    source источник


Ответы (2)


Ответ JSONP должен быть заключен в вызов функции, указанный в запросе с обратным вызовом.

Что-то вроде

callback({ renderHTML = 'Successful'});

Обычно об этом следует заботиться на фильтре.

person Subir Kumar Sao    schedule 29.05.2012

Свойство jsonpCallback не то, что вы думаете. Это строка (или функция, возвращающая строку), которую jquery будет использовать как часть URL-адреса запроса. Вы можете установить его на false, если вам не нужна эта функция. см. документацию

Вы должны использовать свойство «успех», чтобы установить обработчик ответа. Что-то вроде этого:

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

Кроме того, лучший тип контента для JSONP — application/javascript.

Надеюсь, это поможет.

person laher    schedule 29.05.2012
comment
Спасибо за комментарий - мне нужна эта строка обратного вызова для запуска полуфильтра. Я читал о свойстве успеха ajax - позвольте мне попробовать это. - person user82302124; 29.05.2012
comment
Хм. Отчасти это связано с неопытностью, но когда я делаю этот jsonpCallback, я надеюсь, что этот параметр обратного вызова будет «триггером» для фильтра. Когда я вижу параметр обратного вызова (независимо от того, что это такое), я хочу отобразить некоторый ответ JSON BACK на этот метод обратного вызова (в данном случае updatePage). Я вижу оповещения, которые я передаю в этот метод, поэтому я знаю, что вызов возвращается. Я думаю, что проблема, которая у меня есть сейчас, заключается в том, как мне взять полную строку с тегами html и передать ее обратно в ответ, чтобы обновить div? Нужно ли мне использовать Stringfy? - person user82302124; 29.05.2012
comment
Один последний комментарий. Этот тип контента, кажется, решил одну проблему, с которой я столкнулся. Спасибо! - person user82302124; 29.05.2012