Результат ошибки 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!
Вам также следует изучить решение, предложенное Дейвом Ньютоном. Он гораздо опытнее меня и знает, о чем говорит.