web-dev-qa-db-ja.com

ServletContext.getRequestDispatcher()vs ServletRequest.getRequestDispatcher()

理由

servletRequestインターフェースのgetRequestDispatcher(String path)は、現在のサーブレットコンテキスト外に拡張できません

where as

servletContextのgetRequestDispatcher(String path)は、getContext(String uripath)メソッドを使用して、外部コンテキストのリソースのRequestDispatcherを取得できます。

そしてどのように??

助けてください

23
JavaResp

(_"/index.jsp"_)などの絶対パスを使用する場合、違いはありません。

相対パスを使用する場合は、HttpServletRequest.getRequestDispatcher()を使用する必要があります。 ServletContext.getRequestDispatcher()は許可しません。

たとえば、_http://example.com/myapp/subdir_でリクエストを受け取った場合、

_    RequestDispatcher dispatcher = 
        request.getRequestDispatcher("index.jsp");
    dispatcher.forward( request, response ); 
_

リクエストをページ_http://example.com/myapp/subdir/index.jsp_に転送します。

いずれの場合でも、コンテキスト外のリソースにリクエストを転送することはできません。

37
ZZ Coder

request.getRequestDispatcher(“ url”)は、ディスパッチが現在のHTTPリクエストに対して相対的であることを意味します。これは、同じWebアプリケーションで2つのサーブレットをチェーンするためのものであることを意味します。

RequestDispatcher reqDispObj = request.getRequestDispatcher("/home.jsp");

getServletContext()。getRequestDispatcher(“ url”)は、ディスパッチがServletContext.Meansのルートに対して相対的であることを意味します。これは、同じサーバー/ 2つの異なるサーバーで2つのWebアプリケーションをチェーンするためのものです。

RequestDispatcher reqDispObj = getServletContext().getRequestDispatcher("/ContextRoot/home.jsp");
1

リクエストメソッドgetRequestDispatcher()は、単一のwebapp内のローカルサーブレットを参照するために使用できます。

サーブレットコンテキストベースのgetRequestDispatcher()メソッドは、[〜#〜] same [〜#〜]サーバーにデプロイされた他のWebアプリケーションからサーブレットを参照するために使用できます。

1
shraddha

コンテキストはアプリケーションレベルのスコープに保存されますが、リクエストはページレベルに保存されます。

Web Containerはアプリケーションを1つずつ起動し、JVM内で実行します。 jvmにシングルトンオブジェクトを格納し、その中に置かれたオブジェクトを登録します。このシングルトンは、コンテナ自体のJVM内に格納されているため、内部で実行されているすべてのアプリケーションで共有されます。

ただし、リクエストの場合、コンテナはリクエストからのデータで満たされたリクエストオブジェクトを作成し、1つのスレッドから別のスレッドに渡されます(各スレッドはサーバーに送られる新しいリクエストです)。また、リクエストは同じアプリケーション。

0
Rajat

最初の質問は、単に範囲の問題だと思います。 ServletContextは、単一のリクエストであるServletRequestよりもはるかに広いスコープのオブジェクト(サーブレットコンテキスト全体)です。詳細については、サーブレット仕様自体を参照してください。

方法については、申し訳ありませんが、現時点で他の人が答えられるようにそれを残す必要があります。

0
cjstehno