Результат ошибки Ajax с Struts2

У меня есть эта конфигурация в struts.xml

<action name="updateAction"
    class="it.myApp.action.ajax.UpdateActionAction">
<result name="success" type="json"/>
<result name="error" type="json"/>
</action>

это мой класс действий

...
try{
    act.update();
}catch(Exception e){
    Logger.print(MessageType.ERROR,"Update failed "+e.getMessage());
    return ForwardResult.ERROR;
}
return ForwardResult.SUCCESS;

наконец, это JQuery AJAX функция

$.ajax({
    url: 'updateAction.action',
    traditional:true,
    data : {
        'actionId': id,
        'actionName': name,
        'actionDescr':descr
    },
    success: function(data) {
        $('#act_'+id).html(data.name);
        $('#des_'+id).html(data.descr);
        $('#update_'+id).html(data.update);
        $('#userId_'+id).html(data.userId);

        $('#mdf_'+id).css("display","block");
        $('#save_'+id).css("display","none");   
        $('#diag_'+id).html(data.result);
    },
    error: function(data){
        alert("AZZ!");
        $('#diag_'+id).html(data.result);
    }
}); 

когда действие обновляет данные с успехом, проблем нет, функция ajax выполняет оператор "success", но когда действие выдает исключение, ajax не выполняет оператор "error", а снова "success"...

Зачем?

спасибо заранее

М.

2 ответа

Решение

Поскольку запрос не сгенерировал ошибку, где "ошибка" означает, что сервер возвращает код ошибки HTTP. Ответ сервера может указывать ошибку по- другому, например, свойство ошибки.

Вы можете проверить код ответа и содержание, используя Firebug или что-то подобное; если вы ожидаете чего-то другого, кроме того, что он отправляет обратно, добавьте некоторые детали в вопрос, указав, что он возвращает, и что вы хотели бы увидеть вместо этого.

Самый простой вариант - установить statusCode или же errorCode результата, как описано в документации по плагину JSON. (Предполагая, что вы используете плагин JSON.)

Привет Ging3r,

Обычно веб-сайтам JSP требуется плагин JSON для кодирования / декодирования сообщений JSON.

JSON.simple - хороший пример плагина JSON. На веб-сайте JSON.simple также есть учебники по настройке JSON на веб-сайтах JSP.

Если вы предпочитаете использовать плагины, специфичные для Struts, на веб-сайте Apache есть пара плагинов JSON для Struts2.

редактировать

Я абсолютно не эксперт по JSP и ничего не знаю о используемом вами плагине JSON Struts, хотя немного знаю о json-simple.

Тем не менее, следующие два примера имеют смысл для меня. Примеры взяты из учебника, упомянутого выше.

Пример 1 - JSP-кодирование на стороне сервера

service.jsp: 
  <%@page contentType="text/html; charset=UTF-8"%>
  <%@page import="org.json.simple.JSONObject"%>
  <%
    JSONObject obj=new JSONObject();
    obj.put("name","foo");
    obj.put("num",new Integer(100));
    obj.put("balance",new Double(1000.21));
    obj.put("is_vip",new Boolean(true));
    obj.put("nickname",null);
    out.print(obj);
    out.flush();
  %>

Пример 2 - Клиентская сторона XMLHttpRequest

client.html: 
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<script type="text/javascript">
function createXMLHttpRequest(){
  // See http://en.wikipedia.org/wiki/XMLHttpRequest
  // Provide the XMLHttpRequest class for IE 5.x-6.x:
  if( typeof XMLHttpRequest == "undefined" ) XMLHttpRequest = function() {
    try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
    throw new Error( "This browser does not support XMLHttpRequest." )
  };
  return new XMLHttpRequest();
}

var AJAX = createXMLHttpRequest();

function handler() {
  if(AJAX.readyState == 4 && AJAX.status == 200) {
     var json = eval('(' + AJAX.responseText +')');
     alert('Success. Result: name => ' + json.name + ',' + 'balance => ' + json.balance);
  }else if (AJAX.readyState == 4 && AJAX.status != 200) {
alert('Something went wrong...');
  }
}

function show(){
  AJAX.onreadystatechange = handler;
  AJAX.open("GET", "service.jsp");
  AJAX.send("");
};
</script>

<body>
  <a href="#" onclick="javascript:show();"> Click here to get JSON data from the server side</a>
</html>

Вы можете найти больше информации об этих примерах здесь.

PS!

Вам также следует изучить решение, предложенное Дейвом Ньютоном. Он гораздо опытнее меня и знает, о чем говорит.

Другие вопросы по тегам