java - 为什么我的 JavaScript 中没有显示 servlet 响应

标签 java javascript ajax servlets

我正在阅读一本书来学习 ajax,但由于我的 Servlet 响应(只是文本)没有显示在我的 JavaScript 中的警报中,我被卡住了。单击该按钮时,它会调用一个 JavaScript 函数,然后异步发送一个 http 请求。

我不明白为什么字符串没有显示在响应中。感谢任何人都可以阐明这一点。

编辑:此外,在发送“获取”请求后,我得到状态代码 200。当我在控制台下查看 Firebug 时,我看到带有 200 状态代码的 Get 请求。有 3 个选项卡 - 参数、 header 和 XML。在 Params 下,我看到了我在请求中发送的虚拟参数。在 Headers 下有 2 个节点 - 响应 header 和请求 header 。当我展开 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
    }

}

最佳答案

我知道您正在正确地调用 servlet 并获得带有 http-header status = 200 的响应,但是您没有收到字符串内容,不是吗?

然后我认为您必须调用编写器上的 flush() 来提交响应。如果您检查 javax.servlet.ServletResponse 中的 getWriter() documentation这是 javax.servlet.http.HttpServletResponse 的接口(interface),你可以看到:

Calling flush() on the PrintWriter commits the response.

然而,这通常不是必需的,因为 servlet container 会为您执行此操作,但在您的情况下似乎不需要,因此请尝试在您的 servlet 的 doGet 方法中使用此代码:

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

希望对您有所帮助,

关于java - 为什么我的 JavaScript 中没有显示 servlet 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26414295/

相关文章:

javascript - 用单击的按钮填充文本区域

java - 在 C++ 或 Java 中搜索文件中包含 'Match case' 和 'Match whole word' 的文本

javascript - 通过javascript更改iframe src时,整个页面刷新

java - 从同一列的组件菜单中删除 JTable 列时出错

javascript - 有没有办法在不调用 setParams (react-navigation) 的情况下重新渲染导航栏?

jquery - jquery load 方法是否提供与 Rails Replace_html 方法等效的 ajax 功能?

javascript - Ajax 和 jQuery 处理程序

java - JSF Lifecycle 使用 PrimeFaces ajax 执行了 2 次

Java-如何从字符串 '$'中删除符号 '$49monthly'

java - Tomcat 服务器未从 spring 启动