2012-07-10 51 views
1

我在JSP中使用ajax post來將json數據發送到servlet java類。在servlet控制器類中,我使用getParameter來獲取調用JSP發送的數據。AJAX Post - 在JSP中執行時,需要在AJAX POST成功函數中返回基於Java的變量

這一切都很好,至此。然後,我從這個servlet類中啓動對數據的處理,並且我需要制定一個數據響應以發回給調用的JSP。

有沒有一種方法可以將數據保存在servelt類中的變量中,並且作爲成功函數的一部分(在我的AJAX文章中)訪問這些數據?

我的AJAX郵編:

$.ajax({ 
     type:  "POST", 
     url:   url, 
     dataType: "text", // [text, xml, json, script, text, html] 
     data:  {postData : myData, sendURL : postUrl}, 
     success: function(data, textStatus, jqXHR) { 
      alert('Success post to URL entered \n\n The data returned the following: ' + data); 
     }, 
     error:function (xhr, ajaxOptions, thrownError){ 
      alert('Error xhr : ' + xhr.status); 
      alert('Error thrown error: ' + thrownError); 
     } 
     //complete: alert('complete')     
    }); 

我的servlet控制器代碼:

@RequestMapping("/postData") 
    public String postData(Model model, HttpServletRequest request) throws Throwable{ 

     String postData = request.getParameter("postData"); 
     String sendURL= request.getParameter("sendURL"); 

     System.out.println(this.getClass() + " : postData : " + postData); 
     System.out.println(this.getClass() + " : gatewayURL : " + gatewayURL); 

     /* Process data and formulate a response.... */ 

     String responseText = processedResponseText; // This processedResponseText was populated in the internal processing 
     String responseCode = processedResponseCode; // This processedResponseCode was populated in the internal processing 

     return "callingJSP"; 
    } 

由於我的AJAX後的部分 - 成功的功能,我怎樣才能得到這兩個變量(responseText的和responseCode)回到調用JSP?

非常感謝

+0

任何你想要訪問使用JavaScript必須是發送到瀏覽器的響應的一部分。你如何格式化,取決於你,雖然JSON看起來是最好的選擇。 – 2012-07-10 11:09:49

回答

0

如果您知道即將發生的數據結構(您應該!),請創建一個對象t可以通過servlet將發佈的數據序列化爲(我假設myData是json?...如果不是,它應該是!)。 Spring框架提供了@RequestBody註解來將傳入的json反序列化爲你的對象。當servlet需要響應時,請執行@Jigar推薦的操作:將響應包裝在一個對象中。 Spring框架提供了@ResponseBody註釋來序列化你對json的響應。它可能是這個樣子:

您的JS:

var myData = { postId: 1, comment: "this is great!" }; 
$.ajax({ 
     type:  "POST", 
     url:   url, 
     dataType: "text", // [text, xml, json, script, text, html] 
     data:  {postData : myData, sendURL : postUrl}, 
     success: function(data, textStatus, jqXHR) { 
      var jsonRepsonse = JSON.parse(data); 
      alert('Success post to URL entered \n\n The data returned the following: ' + jsonRepsonse.responseText + ", " + jsonRepsonse.responseCode); 
     }, 
     error:function (xhr, ajaxOptions, thrownError){ 
      alert('Error xhr : ' + xhr.status); 
      alert('Error thrown error: ' + thrownError); 
     } 
     //complete: alert('complete')     
    }); 

Java對象:

class Comment { 
    private long postId; 
    private String comment; 
    // getters & setters 
} 

你包裝的響應對象:

class AjaxResponse{ 
private String responseText; 
private String responseCode; 
//other stuff 
} 

在你的控制器處理函數:

@RequestMapping("/postData") 
public @ResponseBody postData(Model model, 
      @RequestBody Comment comment, 
      HttpServletRequest request) throws Throwable{ 

    String sendURL= request.getParameter("sendURL"); 

    System.out.println(this.getClass() + " : comment : " + comment.toString()); 

    /* Process data and formulate a response.... */ 

    AjaxResponse ajaxResponse = new AjaxResponse(processedResponseText, processedResponseCode); 

    return ajaxResponse; 
} 

理想情況下,您的AjaxResponse包含另一個對象,而不是提供有關響應的更多信息的文本。例如,你可能想改變你的AjaxResponse對象如下:

class CommentResponse extends Comment { 
    private long commentId; 
    private Timestamp entryDateTime; 
    // etc 
} 

class AjaxResponse{ 
private CommentResponse commentResponse; 
private String responseCode; 
//other stuff 
} 

這樣做對接收前端的迴應時,可以幫助您極大,但它取決於你所需要的。

0

還..

成功將返回響應

success: function(data, textStatus, jqXHR) { 
     alert('Success post to URL entered \n\n The data returned the following: ' + data); 
    }, 

在成功的功能無需XHR和textStatus應該是這樣:

success: function(response) { 
     alert('Success post to URL entered \n\n The data returned the following: ' + response.responseText); 
    },