-1

所以我认为当我的网页与服务器通信时,我制作的 servlet 可以同时(同时)通过 GET 和 POST 处理请求。可能是因为它是发出两个请求的同一页面,所以只有一个线程处理两个请求。发生的事情是我有一个通过 JQuery AJAX 请求调用的 POST 请求,并且在请求成功时它调用具有 JQuery AJAX GET 请求的回调 javascript 方法。对于成功请求的构成,我的理解可能是错误的。任何关于我如何使它工作或为什么它不起作用的建议或解释将不胜感激。

4

1 回答 1

1

我使用 glassfish4、servlet-api 3 测试了您的案例,并观察到以下内容:

首先,我创建了一个服务于 get 和 post 的 servlet。这个 servlet 有 5 秒的线程睡眠延迟

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;
  private static Logger logger = Logger.getLogger(HelloServlet.class);

  public HelloServlet() {
    super();
    logger.debug("HelloServlet created");
  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    logger.debug("get start");
    try { Thread.sleep(5000); }
    catch (InterruptedException e) { e.printStackTrace(); }
    logger.debug("get finish");
    super.doGet(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    logger.debug("post start");
    try { Thread.sleep(5000); }
    catch (InterruptedException e) { e.printStackTrace(); }
    logger.debug("post finish");
    super.doPost(req, resp);
  }

}

然后我尝试在 5 秒窗口内同时调用 GET 和 POST,这就是它的样子

INFO: 2013-07-07 14:06:06 DEBUG HelloServlet:21 - HelloServlet created
INFO: 2013-07-07 14:06:06 DEBUG HelloServlet:27 - get start
INFO: 2013-07-07 14:06:08 DEBUG HelloServlet:41 - post start
INFO: 2013-07-07 14:06:11 DEBUG HelloServlet:34 - get finish
INFO: 2013-07-07 14:06:13 DEBUG HelloServlet:48 - post finish
  • 只创建了 1 个 HelloServlet 实例,这似乎由所有 http 工作线程共享
  • get 和 post 请求都由不同的线程提供服务,并且 get 和 post 方法的调用不同步

所以你原来的理解似乎是正确的

于 2013-07-07T04:20:47.510 回答