0

次のサーブレットにGETリクエストを行った後、「In service method」というテキストが書き込まれ、説明できません。何故ですか?

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class MyServlet extends HttpServlet {
   public void service(HttpServletRequest req,
                       HttpServletResponse resp) throws IOException {
      Writer out = resp.getWriter();
      out.write("In Service method");
   }

   public void doGet(HttpServletRequest req, HttpServletResponse resp) 
                                                        throws IOException {
      Writer out = resp.getWriter();
      out.write("In get method");
   }
}
4

3 に答える 3

2

のデフォルトの実装HttpServlet#service()まさにその仕事をします。これがそのjavadocの抜粋です:

パブリックサービスメソッドから標準のHTTPリクエストを受信しdoXXX、このクラスで定義されたメソッドにディスパッチします。このメソッドは、メソッドのHTTP固有のバージョンですServlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)。このメソッドをオーバーライドする必要はありません。

HTTPメソッドに応じて適切なサーブレットメソッドに委任します。たとえば、がにrequest.getMethod()等しい場合は"GET"、に委任しdoGet()ます。ちなみに、最後の文も読んだことがありますか?

いずれにせよ、基本的にはまったく同じ仕事を自分で行う必要があります。

@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    Writer out = resp.getWriter();
    out.write("In Service method");

    if ("GET".equalsIgnoreCase(req.getMethod())) {
        doGet(req, resp);
    }
    // Check other methods as well!
}

または、superメソッドを呼び出して、そのジョブを実行できるようにします。

@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    Writer out = resp.getWriter();
    out.write("In Service method");
    super.service(req, resp);
}

または、それをまったくオーバーライドしないでください。

于 2012-11-09T16:57:22.773 に答える
1

HttpServlet (行607)からコードを読むと、その理由がわかります。service()適切なdoXXXメソッドに委任する責任があります。

サブクラスHttpServletではなく、プレーンサーブレット(またはGenericServlet )について読みたい場合があります。ドキュメントに表示されるのは、サーブレットはプロトコルに依存しないのに対し、HttpServletは確実にプロトコルに依存するということです。

于 2012-11-09T16:46:31.227 に答える
1

HttpServletのサービスメソッドは、実際にリクエストがGETかPOSTかをチェックし、リクエストの種類に応じて適切なメソッドを呼び出します。

于 2012-11-12T09:20:13.810 に答える