javax.servlet.Servlet
の
void service(ServletRequest req, ServletResponse res)
メソッドがServletResponse
単に返すのではなく、指定された as パラメータを持つ正当な理由はありますか?
4 に答える
Java Servlet API は抽象化であり、Java Web アプリケーションがあらゆる種類の要求を処理するために必要な最小要件を定義します (これを見ると、そこにあるほとんどすべてのクラスがインターフェースまたは抽象クラスとして定義されていることがわかります)。
この API は、さまざまな Java サーバー ベンダー (IBM、Sun、Apache、Oracle など) が最小要件に合意し、現在公式の標準と見なされているものを定義するプロセスの後、 JCPによって定義されました。ただし、さまざまなベンダーがサーブレット コンテナーを実装するさまざまな方法を持っているため、今日ではさまざまな数のコンテナーが使用されています (それぞれが異なる機能を備えています)。
サーブレット コンテナーは、両方のオブジェクト (要求と応答) を適切に処理するために追跡する必要があるため、ServletResponse
(または HTTP バリアントHttpServletResponse
) を作成する責任をユーザーに負わせることはできません。サーブレットのservice
メソッドはユーザー コードです。service
そのため、サーブレット コンテナーは、メソッドを呼び出す前に、(独自の実装を使用して) 要求オブジェクトと応答オブジェクトを作成し、事前設定します。ユーザーの観点からは、インターフェイスを介してそれらを処理するだけで十分です。これにより、両方のオブジェクトの実際の実装にアクセスできないため、ベンダー固有のコードも保護されます。
しかし、API が定義されたとき、これらのベンダーは、場合によっては、ユーザーがこれらのオブジェクトのデフォルトの動作をオーバーライドしたいので、ユーザー コードで拡張できる一連のラッパー ( 、 など) をHttpServletRequestWrapper
含めることに気付きました。HttpServletResponseWrapper
コンテナーによって提供されるデフォルトの実装を置き換えるために、サーブレットまたはフィルターで使用されます。
as で渡されるオブジェクトはres
、 のコンテナ固有のサブクラスになりServletResponse
ます。このようなインスタンスをコンテナに依存しない方法で自分で作成することはできません。
リクエストの完全なサイクルは と で構成されます。リクエストを行うrequest
とresponse
、リクエストとレスポンス オブジェクトがコンテナーによって作成され、それらを処理するためのアクセスが与えられます。
ドキュメントを見たら
サーブレットがリクエストに応答できるようにするために、サーブレット コンテナによって呼び出されます。
リクエストに関連付けられたレスポンス オブジェクトは、そのリクエストに応答するだけです。
自分でオブジェクトを作成した場合Response
、リクエストなしで、ランダムにレスポンスを送信できますか?
クライアントからの要求に基づいて、Web コンテナーは ServletResponse オブジェクトを作成し、このオブジェクトをサービス メソッドに渡して、クライアントへの応答を提供できるようにします。