【问题标题】:Ajax error result with struts2struts2的Ajax错误结果
【发布时间】:2011-10-24 09:44:14
【问题描述】:

我在 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);
    }
}); 

当action更新数据成功时,没有问题,ajax函数执行“成功”语句,但是当action抛出异常时,ajax不执行“错误”语句而是再次“成功”......

为什么?

提前感谢

M.

【问题讨论】:

    标签: jquery struts2


    【解决方案1】:

    因为请求没有产生错误,其中“错误”表示服务器返回 HTTP 错误代码。服务器响应可能以不同的方式指示错误,例如错误属性。

    您可以使用 Firebug 或类似的工具检查响应代码和内容;如果您期望的不是返回的内容,请在问题中添加一些详细信息,说明返回的内容以及您希望看到的内容。

    最简单的选项是设置结果的statusCodeerrorCode,详见JSON plugin docs。 (假设您使用的是 JSON 插件。)

    【讨论】:

    • ...-.-'..是的...我感觉很愚蠢... ajax 不遵循 struts 的“错误”结果,因为它不是真正的错误(404、500等)但它是重定向响应的标准,对吧?...在​​这一点上,我认为使用 Ajax 错误变量来管理此类错误并不是一个好的解决方案...
    • @DaveNewton 我无法理解这一点。您的意思是“响应本身不是错误”吗?
    • @jpaugh 可能,但我不知道五年前我在想什么。
    【解决方案2】:

    你好 Ging3r

    通常,JSP 网站需要 JSON 插件来编码/解码 JSON 消息。

    JSON.simple 是 JSON 插件的一个很好的例子。 JSON.simple website 还提供了在 JSP 网站上设置 JSON 的教程。

    如果您更喜欢使用特定于 Struts 的插件,有几个 JSON plugins for Struts2 on Apaches website

    编辑

    我绝对不是 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>
    

    您可以找到有关这些示例的更多信息here

    PS!

    您还应该研究Dave Newton 建议的解决方案。他比我更有经验,并且知道他在说什么。

    【讨论】:

    • 我正在使用我在 struts2 库中找到的 JSON struts2 插件。还不够吗?为了创建 json 响应,我按照这个小教程link...返回请求,我认为我设置错误响应是错误的,对吧?
    猜你喜欢
    • 2014-01-14
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多