7

doGet()、およびクラスdoPost()の他のメソッドのアクセス修飾子について混乱しています。HttpServlet

なぜprotectedですか?

私の理解によると、のprotected修飾子はdoGet()、クライアントがにアクセスするために同じパッケージ(または子-継承を通じて)に含まれている必要があることを意味しますdoGet()。では、呼び出し元のJSPまたはコンテナはどのようにそれにアクセスしますか?

4

6 に答える 6

11

それらは主に 2 つの理由で保護されています。

  1. そのため、あなたが推論したように、外部クラスはそれらを呼び出すことができません。技術的には、Java リフレクションを使用してメソッドの可視性修飾子を回避する方法がありますが (セキュリティ マネージャーで許可されている場合、または存在しない場合)、通常、保護されたメソッドには同じパッケージ内のクラスまたはサブクラスのみがアクセスできます。ポイント#2へ。
  2. のサブクラスまたは具体的な実装がHttpServletそれらをオーバーライドできるようにします。public の場合はオーバーライドすることもできますが、ポイント 1 を参照してください。

もう 1 つの質問ですが、「呼び出し側の JSP またはコンテナはどのようにアクセスしますか?」

HttpServletservice(ServletRequest, ServletResponse)Servletメソッドを宣言するインターフェースを実装します。もちろん、これはデフォルトで in になります。これは、実装を呼び出すための (コンテナーの) 主要なエントリ ポイントです。publicHttpServletHttpServlet

私の推測では (ソースに飛び込んでいません)、渡されたオブジェクトをHttpServletチェックするデフォルトの実装は、実際には であり、使用される HTTP メソッドを返すメソッドを定義します。次に、HTTP 要求メソッドに応じてまたはにディスパッチします。ServletRequestHttpServletRequestgetMethod()doGet()doPost()

于 2013-01-28T06:34:41.237 に答える
3

これは公式の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 を適用するために保護されています。

于 2013-01-28T06:11:09.413 に答える
2

doGet と doPost は、HttpResponse を生成してクライアント (通常は Browser または HttpClient) に送信するための基本的なメソッドです。

また、コンテナは であるServlet.service()メソッドを呼び出しますpublicHttpServlet.service()次に、保護されているメソッドを呼び出し、次にdoGet()/doPost()メソッドを呼び出します。

于 2013-01-28T06:12:17.547 に答える
1

MyClassサーブレットではないクラスを持っているとします。クラスにメソッドdoGetdoPost. サーブレットでない場合、Web ベースの要求にどのように応答またはキャプチャすることができますか。

Web ベースのリクエストをキャプチャして応答できるのは、サーブレットだけです。

したがって、クラスが拡張された場合にのみ、Web ベースのリクエストをキャプチャして応答できるようになり、そのため やその他のさまざまなメソッドServletを使用できるようになるのは理doGetdoPostかなっています。

于 2013-01-28T06:09:55.553 に答える
0

サーブレットコンテナが保護されたメソッドdoGetとdoPostをどのように呼び出すかについて疑問に思っていると思います。

実際には、javax.servlet.Servletという名前のインターフェースがあります。GenericServletという名前のクラスがインターフェースを実装します。そして、HTTPServletクラスはこのGenericServletを拡張します。

HTTPServletへのhttpリクエストがある場合、コンテナはインターフェイスで宣言されたメソッドservice(...)を使用するだけです。その方法は公開されています。次に、GenericServletで、doGetおよびdoPostと呼ばれるサービスメソッド。サーブレットクラスがHTTPServletクラスを拡張し、doPostメソッドをオーバーライドすると、このメソッドが最終的に呼び出されます。

于 2013-01-28T06:20:33.803 に答える
0

protectedメソッドをオーバーライドするための招待状と考えてください。クラスを派生させているHttpServletので、これらのメソッドはオーバーライドするものです。それらにはすべてデフォルトのアクションがあるため、アプリケーションにとって重要なメソッドをオーバーライドすることができます。

于 2013-01-28T06:24:10.587 に答える