doGet()
、およびクラスdoPost()
の他のメソッドのアクセス修飾子について混乱しています。HttpServlet
なぜprotected
ですか?
私の理解によると、のprotected
修飾子はdoGet()
、クライアントがにアクセスするために同じパッケージ(または子-継承を通じて)に含まれている必要があることを意味しますdoGet()
。では、呼び出し元のJSPまたはコンテナはどのようにそれにアクセスしますか?
doGet()
、およびクラスdoPost()
の他のメソッドのアクセス修飾子について混乱しています。HttpServlet
なぜprotected
ですか?
私の理解によると、のprotected
修飾子はdoGet()
、クライアントがにアクセスするために同じパッケージ(または子-継承を通じて)に含まれている必要があることを意味しますdoGet()
。では、呼び出し元のJSPまたはコンテナはどのようにそれにアクセスしますか?
それらは主に 2 つの理由で保護されています。
HttpServlet
それらをオーバーライドできるようにします。public の場合はオーバーライドすることもできますが、ポイント 1 を参照してください。もう 1 つの質問ですが、「呼び出し側の JSP またはコンテナはどのようにアクセスしますか?」
HttpServlet
service(ServletRequest, ServletResponse)Servlet
メソッドを宣言するインターフェースを実装します。もちろん、これはデフォルトで in になります。これは、実装を呼び出すための (コンテナーの) 主要なエントリ ポイントです。public
HttpServlet
HttpServlet
私の推測では (ソースに飛び込んでいません)、渡されたオブジェクトをHttpServlet
チェックするデフォルトの実装は、実際には であり、使用される HTTP メソッドを返すメソッドを定義します。次に、HTTP 要求メソッドに応じてまたはにディスパッチします。ServletRequest
HttpServletRequest
getMethod()
doGet()
doPost()
これは公式のjavadocからのものです。
Web サイトに適した HTTP サーブレットを作成するためにサブクラス化される抽象クラスを提供します。HttpServlet のサブクラスは、少なくとも 1 つのメソッド (通常は次のいずれか) をオーバーライドする必要があります。
doGet (サーブレットが HTTP GET 要求をサポートしている場合)
doPost、HTTP POST リクエスト用
doPut、HTTP PUT リクエスト用
doDelete、HTTP DELETE リクエスト用
サーブレットの存続期間中保持されるリソースを管理するための init および destroy
サーブレットが自身に関する情報を提供するために使用する getServletInfo
また、
サービス メソッドをオーバーライドする理由はほとんどありません。サービスは、各 HTTP 要求タイプ (上記の doXXX メソッド) のハンドラー メソッドにそれらをディスパッチすることにより、標準の HTTP 要求を処理します。
そしてdoGet
メソッドのドキュメントでは:
サーブレットが GET 要求を処理できるようにするために、( service メソッドを介して)サーバーによって呼び出されます。
は継承HttpServlet
用に設計されており、エントリ ポイントはservice
メソッドです。したがってdoGet
、明確な API を適用するために保護されています。
doGet と doPost は、HttpResponse を生成してクライアント (通常は Browser または HttpClient) に送信するための基本的なメソッドです。
また、コンテナは であるServlet.service()
メソッドを呼び出しますpublic
。HttpServlet.service()
次に、保護されているメソッドを呼び出し、次にdoGet()
/doPost()
メソッドを呼び出します。
MyClass
サーブレットではないクラスを持っているとします。クラスにメソッドdoGet
とdoPost
. サーブレットでない場合、Web ベースの要求にどのように応答またはキャプチャすることができますか。
Web ベースのリクエストをキャプチャして応答できるのは、サーブレットだけです。
したがって、クラスが拡張された場合にのみ、Web ベースのリクエストをキャプチャして応答できるようになり、そのため やその他のさまざまなメソッドServlet
を使用できるようになるのは理doGet
にdoPost
かなっています。
サーブレットコンテナが保護されたメソッドdoGetとdoPostをどのように呼び出すかについて疑問に思っていると思います。
実際には、javax.servlet.Servletという名前のインターフェースがあります。GenericServletという名前のクラスがインターフェースを実装します。そして、HTTPServletクラスはこのGenericServletを拡張します。
HTTPServletへのhttpリクエストがある場合、コンテナはインターフェイスで宣言されたメソッドservice(...)を使用するだけです。その方法は公開されています。次に、GenericServletで、doGetおよびdoPostと呼ばれるサービスメソッド。サーブレットクラスがHTTPServletクラスを拡張し、doPostメソッドをオーバーライドすると、このメソッドが最終的に呼び出されます。
protected
メソッドをオーバーライドするための招待状と考えてください。クラスを派生させているHttpServlet
ので、これらのメソッドはオーバーライドするものです。それらにはすべてデフォルトのアクションがあるため、アプリケーションにとって重要なメソッドをオーバーライドすることができます。