-1

そのため、作成したサーブレットは、Web ページがサーバーと通信しているときに、GET と POST を介して同時に (同時に) 要求を処理できると考えました。両方の要求を行うのは同じページであるため、両方の要求を処理するスレッドは 1 つしかない可能性があります。何が起こっているのかというと、JQuery AJAX リクエストを介して呼び出される POST リクエストがあり、リクエストが成功すると、JQuery AJAX GET リクエストを持つコールバック javascript メソッドが呼び出されます。成功したリクエストの構成要素について、私の理解が間違っている可能性があります。これを機能させる方法、または機能しない理由についての提案や説明をいただければ幸いです。

4

1 に答える 1

1

私はglassfish4、servlet-api 3を使用してあなたのケースをテストし、次のことを観察しました:

最初に、get と post の両方を処理するサーブレットを作成しました。このサーブレットには 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
  • HelloServlet のインスタンスが 1 つだけ作成されます。これはすべての http ワーカー スレッドで共有されているようです。
  • get 要求と post 要求の両方が異なるスレッドによって処理され、get メソッドと post メソッドの呼び出しが同期されない

だからあなたの最初の理解は正しいようです

于 2013-07-07T04:20:47.510 に答える