【问题标题】:How to response a proper server execution to Ajax Post method?如何响应正确的服务器执行到 Ajax Post 方法?
【发布时间】:2013-08-22 14:13:44
【问题描述】:

我的应用程序中有一个非常简单的任务,它在选择事件之后从组合框中检索数据。

当 select 事件被引发时,数据被传递给一个请求服务器端操作的 jQuery 函数。

所有这些都可以,但是在处理服务器的响应时,Ajax 会收到请求失败的条件。由于我是 jQuery 和 Ajax 的新手,我不知道我应该错过什么或做错什么。

jsp片段:

<input id="updStatus" 
    class="easyui-combobox" 
    name="updStatus"
    data-options="
    valueField:'id',
    textField:'Name',
    url:'StatusListCombo',
    onSelect:function updStatusTask(row) {
      $.fn.updStatusTask(row.id, ${task.id});
    }">

jQuery 函数:

$.fn.updStatusTask = function (idStatus, idTask) {
  var result = $.post("TaskUpdateStatus", {
    idTask : idTask, 
    idStatus : idStatus
  });

  result.done(function( data ) {
    alert("data: " + data); //<--NOT REACHED!!
  });
  result.fail(function(jqXHR, textStatus) {
    alert("fail data: " + textStatus); //FIRED
  });
  result.always(alert("always"));//FIRED
};

服务器端方法:

@RequestMapping(value = "/TaskUpdateStatus")
public String TaskUpdateStatus(Long idTask, Long idStatus, HttpSession httpSession, HttpServletResponse resp) throws IOException {

  String result = new String();
  try {
    //... do DAO opperations to persist, everything Ok...
    resp.setStatus(200);
    result = "Task successfully updated.";
  }
  catch(Exception e) {
    result = "Error: " + e.getMessage(); 
  }

  return result;    
}

【问题讨论】:

  • 什么是失败请求?
  • @enginefree,好问题。 [data] 参数仅显示“错误”。我可以获得有关此错误的更多信息吗?
  • 不用e.getMessage(),试试e.toString()
  • @enginefree,没有错误被抛出。问题出在 ajax 处理响应期间。请看我的cmets下面的答案。
  • 如果您想提供反馈。只需解析javascript 端的响应即可。

标签: java javascript ajax jquery spring-mvc


【解决方案1】:

我会从注释开始

public String TaskUpdateStatus(@RequestParam("idTask") Long idTask, @RequestParam("idStatus") Long idStatus, ...

否则 Spring 不知道从哪里获取这些字段并注入它们。

【讨论】:

  • 所有任务都按需要进行。唯一的问题是 Ajax 毕竟收到了失败条件。
  • @Alex 你能告诉我们它正在接收什么状态代码以及 Spring 提供什么输出吗?在我看来,您的控制器方法没有被执行。
  • 是的,我的控制器方法被完美地执行了。数据库更改,不会引发任何错误(我已在调试中逐步完成)。这一切都按预期进行。甚至 jsp 页面在更新时也会显示任务的新状态。但我想提供反馈,告知操作成功(警报或 jeasyui 消息)。我认为这只是正确操作响应或为函数提供正确返回的问题,诸如此类。感谢您的帮助!
【解决方案2】:

唯一的问题是控制器返回的字符串参数。将控制器类型 TaskUpdateStatusString 更改为 void 就足够了,而且,显然,抑制 return 语句。

相反,将文本返回到 jQuery 事件处理程序以进行处理和显示的正确方法是使用 response.getWritter().write("something")

@RequestMapping(value = "/TaskUpdateStatus")
public void TaskUpdateStatus(Long idTask, Long idStatus, HttpSession httpSession, HttpServletResponse resp) throws IOException {

  String result = new String();
  try {
    //... do DAO opperations to persist, everything Ok...
    resp.getWriter().write("Status changed from "
          + oldStatusName + " to " +   newStatusName);
    resp.setStatus(200);
  }
  catch(Exception e) {
    //... take care of exceptions
  }

}

没有错误被抛出,数据在 Ajax 帖子.done 事件处理程序中正确显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多