2014-10-16 95 views
2

我正在閱讀一本書來學習ajax,而且我陷入了僵局,因爲我的JavaScript中沒有在alert中顯示我的Servlet響應(只是文本)。當按鈕被點擊時,它會調用JavaScript函數,然後異步發送一個http請求。爲什麼servlet響應沒有在我的JavaScript中顯示

我不明白爲什麼字符串沒有顯示在響應中。感謝任何人都可以解決這個問題。

編輯:另外,發送「獲取」請求後,我得到一個200的狀態代碼。當我看着控制檯下的螢火蟲時,我看到帶有200個狀態碼的Get請求。有3個選項卡 - Params,Headers和XML。在參數下,我看到了我在請求中發送的虛擬參數。在標題下有2個節點 - 響應標題和請求標題。當我展開Response Header節點時,我看到一個名爲content-length的東西,後面跟着一個0。這是否意味着我的迴應中沒有任何內容?

這裏是我的HTML

<html> 
<head> 
    <title>Boards 'R' Us</title> 
    <link rel="stylesheet" type="text/css" href="boards.css" media="screen" /> 
    <script type="text/javascript" src="ajax.js"> </script> 
    <script type="text/javascript" src="text-utils.js"> </script> 
    <script type="text/javascript" src="boards.js"> </script> 
</head> 

<body> 
    <h1>Boards 'R' Us :: How Much Butt We're Kicking</h1> 
    <div id="boards"> 
    <table> 
    <tr><th>Snowboards Sold</th> 
    <td><span id="boards-sold">1672</span></td></tr> 
    <tr><th>What I Sell 'em For</th> 
    <td>$<span id="boards-price">249.95</span></td></tr> 
    <tr><th>What it Costs Me</th> 
    <td>$<span id="boards-cost">84.22</span></td></tr> 
    </table> 
    <table> 
    <tr><th>Boots Sold</th> 
    <td><span id="boots-sold">312</span></td></tr> 
    <tr><th>What I Sell 'em For</th> 
    <td>$<span id="boots-price">175.47</span></td></tr> 
    <tr><th>What it Costs Me</th> 
    <td>$<span id="boots-cost">54.23</span></td></tr> 
    </table> 
    <table> 
    <tr><th>Bindings Sold</th> 
    <td><span id="bindings-sold">82</span></td></tr> 
    <tr><th>What I Sell 'em For</th> 
    <td>$<span id="bindings-price">146.92</span></td></tr> 
    <tr><th>What it Costs Me</th> 
    <td>$<span id="bindings-cost">98.03</span></td></tr> 
    </table> 
    <h2>Cash for the Slopes: 
    $<span id="cash">318936.42</span></h2> 
    <form> 
    <input value="Show Me the Money" type="button" 
      onClick="getNewTotals();" /> 
    </form> 
    </div> 
</body> 
</html> 

和我的JavaScript

function getNewTotals() { 
    console.log("Getting new totals"); 
    var url = "boards.do"; 
    url = url + "?dummy=" + new Date().getTime(); 
    request.open("GET", url, true); 
    request.onreadystatechange = updatePage; 
    request.send(null); 
} 

function updatePage() { 
    if (request.readyState == 4) { 
     if (request.status == 200) { 
      var reply = request.responseText; 
      alert("returned: " + reply); 
     } else { 
      alert("Error! Request status = " + request.status); 
     } 
    } 
} 

和我的servlet

import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.gmail.gmjord.controller.BoardSalesController; 

/** 
* Servlet implementation class BoardSalesController 
*/ 
//@WebServlet("/BoardSalesController") 
public class BoardSalesController extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    private static final Logger LOGGER = Logger.getLogger(BoardSalesController.class.getClass().getName()); 
    private static final Level INFO = Level.INFO; 
    private static final Level[] LEVELS = {Level.SEVERE, Level.WARNING, Level.INFO, Level.CONFIG, 
     Level.FINE, Level.FINER, Level.FINEST}; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public BoardSalesController() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     LOGGER.log(INFO, "in doGet()"); 
     String info = request.getParameter("dummy"); 
     LOGGER.log(INFO, "Request info: " + info); 
     response.setContentType("text/plain"); 
     response.setCharacterEncoding("UTF-8"); 
     String reply = "Do you see this?"; 
     response.getWriter().write(reply); 


    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
    } 

} 
+0

那麼,發生了什麼*在調試器中運行它並觀察網絡流量。在updatePage中放置一個斷點,看看它是否被調用以及如何調用。 – Malvolio 2014-10-16 21:43:17

+0

您可以使用Chrome或Firefox開發工具甚至是螢火蟲來檢查XMLHttpRequest流量,並檢查它會發生什麼。您還可以檢查除200以外的其他響應狀態(也許正在生成404或500錯誤) – 2014-10-16 22:31:01

+0

@Malvolio,感謝您提醒我,我可以調試JavaScript - 在此處仍是新的。我調試它在firebug和request.responseText顯示「」的值。所以我認爲Servlet不會正確地發送響應。仍在調查。 – mitchj 2014-10-17 11:23:35

回答

1

我明白你正確地調用servlet並獲得與響應http-header status = 200,但是你沒有收到str內容,不是嗎?

然後我想你必須致電flush()作者提交回應。如果您在javax.servlet.ServletResponsedocumentation這是你可以看到這個的javax.servlet.http.HttpServletResponse接口檢查getWriter():在PrintWriter的調用flush()

提交的響應。

然而,這通常是沒有必要的,因爲servlet container爲你做的,但是你的情況似乎並不那麼這段代碼在doGet方法上你的servlet嘗試:

String reply = "Do you see this?"; 
PrintWriter writer = response.getWriter(); 
writer.write(reply); 
writer.flush(); 

希望這有助於

+0

我試過這種方式,它沒有幫助。我不確定發生了什麼事,但經過幾個小時試圖弄清楚它神祕地開始工作。 我有其他神祕的事情,試圖運行的Web應用程序有時不會加載所有的JavScripts等,但然後神奇地開始再次做。 我正在投票試圖幫助我!謝謝!!我希望我可以投票。 – mitchj 2014-10-17 12:15:09

+0

感謝你':)'。起初,這對我來說聽起來很奇怪,因爲通常servlet容器會執行'flush()',但是在場景後面可能會發生某些事情,所以我試着回答。當奇怪的事情開始發生時,這很讓人傷心,也許你可以嘗試一下全新安裝你的web容器':)'。 – albciff 2014-10-17 12:33:24