サーバ側リダイレクトの2つのテクニック
4690 ワード
リダイレクト(redirection)はWebプログラミングにおける重要な技術である.リダイレクトを使用すると、コントロールを別のservlet/JSPページに送信したり、Webブラウザ(ユーザー)を新しいURLにリダイレクトしたりすることができます.しかし、ユーザーを同じページにリダイレクトするのも一般的です.たとえば、ブラウザのクッキーsupportがアクティブになっているかどうかを確認するには、ブラウザにクッキーを送信し、ブラウザを同じページにリダイレクトします.
リダイレクトはサーバ側でもクライアント(ブラウザ)でも行えます.servlet/JSPページにサーバ側のコードがあるので、サーバ側でリダイレクトできます.クライアントのリダイレクトは、JavaScriptコードを送信したり、ブラウザのHTMLページのメタデータに転送したりすることで行うことができます.次に、2つのサーバ側のリダイレクトのテクニックを見てみましょう.
servlet/JSPプログラミングでは、サーバ側リダイレクトはjavaxを用いることにより実現できる.servlet.RequestDispatcherインタフェースのforwardメソッド、またはjavaxを用いる.servlet.http.HttpServeretResponseインタフェースのsendRedirectメソッド.
RequestDispatcherインタフェースを使用するForwardメソッドRequestDispatcherインタフェースのforwardメソッドを使用するには、まずRequestDispatcherオブジェクトを取得します.servletテクノロジーは、3つの方法でそれを得ることができます.
1.javaxを運用する.servlet.サーブレットContextインタフェースのgetRequestDispatcherメソッドは、パスを含むStringを他のリソースに渡します.このパスは、サーブレットContextのルートパスに対するものです.
2.javaxを運用する.servlet.サーブレットRequestインタフェースのgetRequestDispatcherメソッドは、パスを含むStringを他のリソースに渡します.このパスは、現在のHTTPリクエストに対するものです.
3.javaxを運用する.servlet.サーブレットContextインタフェースのgetNamedDispatcherメソッドは、他のリソース名を含むStringを渡します.
RequestDispatcherオブジェクトを得るとforwardメソッドを用いることが容易になる.forwardメソッドの定義は次のとおりです.
ただし、forwardメソッドを呼び出すには、クライアントが出力していない場合にのみ使用できます.現在のページのバッファが空でない場合は、forwardメソッドを呼び出す前にバッファを空にする必要があります.そうでない場合、IllegalStateExceptionが放出されます.forwardメソッドは、要求を静的ページに送信するためにも使用できます.
servlet/JSPの初心者がRequestDispatcherオブジェクトを取得しようとすると、サーブレットContextインタフェースのgetRequestDispatcherメソッドとサーブレットRequestインタフェースのgetRequestDispatcherメソッドが大きく異なるため、戸惑うことが多い.次に本稿を読むと、この2つを混同しないようにするテクニックが得られます.
RequestDispatcherオブジェクトのforwardメソッドを使用して、ABCServletというservletからXYZServletという別のservletにコントロールを渡す場合、ABCServletとXYZServletのクラスファイルを同じディレクトリに配置するのが最も簡単です.この方法でURLからhttp://domain/VirtualDir/servlet/ABCServletABCServletを呼び出し、URLからhttp://domain/VirtualDir/servlet/XYZServletXYZサーブレットを呼び出しに来ました.そしてforward法を使うのは簡単です.サーブレットRequestインタフェースからgetRequestDispatcherを使用して、2番目のservletの名前を渡すことができます.ABCServletでは、次のコードを書くことができます.
XYZServiceletの前に/記号を置く必要はありません.この方法は最も簡単です.2つのservletsのパスを心配する必要はありませんから.
少し複雑な方法は、次のStringをサーブレットRequestのgetRequestDispatcherに渡すことです.
サーブレットContextのgetRequestDispatcherから取得したRequestDispatcherオブジェクトのforwardメソッドを呼び出す必要がある場合は、次のようにパスパラメータとして「/VirtualDir/servlet/XYZサーブレット」を渡す必要があります.
getNamedDispatcherメソッドを使用すると、コードは次のようになります.
getNamedDispatcherメソッドを使用する場合は、デプロイメント記述子に2番目のservletを登録する必要があります.次に例を示します.
含まれるservletを変更した場合は、変更を有効にするためにWeb containerを再起動する必要があります.これは、含まれるservletが直接呼び出されたことがないためです.含まれるservletがロードされると、そのタイムスタンプは変更されません.
1つのJSPページからコントロールを送信する場合は、実行要素を使用して、現在のJSPページの実行を終了し、コントロールを別のリソースに渡すこともできます.構文は次のとおりです.
たとえば、JSPページが解析されると、結果servletで次のコードに変換されます.
HttpServeretResponseインタフェースを用いたsendRedirect法sendRedirect法はforward法よりも容易である.定義は次のとおりです.
この方法では,locationで指定したURLに対してブラウザに要求するコマンドを送信する.この方法は絶対的または相対的なURLsを受け入れることができる.メソッドに渡されるパラメータが相対的なURLである場合、Web containerはクライアントに送信する前に絶対的なURLに変換します.アドレスが相対的であり、'/'が1つもない場合、Web containerは、現在の要求URIに対するものとみなす.
たとえば、次のコードでユーザーをwww.brainysoftwareにリダイレクトできます.com:
どんなテクニックを使うべきですか.最も効果的なコードを作成するには、この2つのリダイレクトテクニックの違いを理解する必要があります.forwardメソッドはWeb container内部で動作します.sendRedirectメソッドでは、クライアントへの往復が必要です.だからforward法はsendRedirectより速い.しかし、forwardメソッドを使用するには限界があり、同じWebアプリケーションのリソースにリダイレクトするしかありません.sendRedirectメソッドでは、任意のURLにリダイレクトできます.結論:あなたの問題を解決できるならforward法を使います.sendRedirectメソッドはforwardメソッドが使用できない場合にのみ使用されます.
リダイレクトはサーバ側でもクライアント(ブラウザ)でも行えます.servlet/JSPページにサーバ側のコードがあるので、サーバ側でリダイレクトできます.クライアントのリダイレクトは、JavaScriptコードを送信したり、ブラウザのHTMLページのメタデータに転送したりすることで行うことができます.次に、2つのサーバ側のリダイレクトのテクニックを見てみましょう.
servlet/JSPプログラミングでは、サーバ側リダイレクトはjavaxを用いることにより実現できる.servlet.RequestDispatcherインタフェースのforwardメソッド、またはjavaxを用いる.servlet.http.HttpServeretResponseインタフェースのsendRedirectメソッド.
RequestDispatcherインタフェースを使用するForwardメソッドRequestDispatcherインタフェースのforwardメソッドを使用するには、まずRequestDispatcherオブジェクトを取得します.servletテクノロジーは、3つの方法でそれを得ることができます.
1.javaxを運用する.servlet.サーブレットContextインタフェースのgetRequestDispatcherメソッドは、パスを含むStringを他のリソースに渡します.このパスは、サーブレットContextのルートパスに対するものです.
2.javaxを運用する.servlet.サーブレットRequestインタフェースのgetRequestDispatcherメソッドは、パスを含むStringを他のリソースに渡します.このパスは、現在のHTTPリクエストに対するものです.
3.javaxを運用する.servlet.サーブレットContextインタフェースのgetNamedDispatcherメソッドは、他のリソース名を含むStringを渡します.
RequestDispatcherオブジェクトを得るとforwardメソッドを用いることが容易になる.forwardメソッドの定義は次のとおりです.
public void forward(javax.servlet.ServletRequest request,
javax.servlet.ServletResponse response)
throws javax.servlet.ServletException, java.io.IOException
ただし、forwardメソッドを呼び出すには、クライアントが出力していない場合にのみ使用できます.現在のページのバッファが空でない場合は、forwardメソッドを呼び出す前にバッファを空にする必要があります.そうでない場合、IllegalStateExceptionが放出されます.forwardメソッドは、要求を静的ページに送信するためにも使用できます.
servlet/JSPの初心者がRequestDispatcherオブジェクトを取得しようとすると、サーブレットContextインタフェースのgetRequestDispatcherメソッドとサーブレットRequestインタフェースのgetRequestDispatcherメソッドが大きく異なるため、戸惑うことが多い.次に本稿を読むと、この2つを混同しないようにするテクニックが得られます.
RequestDispatcherオブジェクトのforwardメソッドを使用して、ABCServletというservletからXYZServletという別のservletにコントロールを渡す場合、ABCServletとXYZServletのクラスファイルを同じディレクトリに配置するのが最も簡単です.この方法でURLからhttp://domain/VirtualDir/servlet/ABCServletABCServletを呼び出し、URLからhttp://domain/VirtualDir/servlet/XYZServletXYZサーブレットを呼び出しに来ました.そしてforward法を使うのは簡単です.サーブレットRequestインタフェースからgetRequestDispatcherを使用して、2番目のservletの名前を渡すことができます.ABCServletでは、次のコードを書くことができます.
RequestDispatcher rd =
request.getRequestDispatcher("SecondServlet");
rd.forward(request, response);
XYZServiceletの前に/記号を置く必要はありません.この方法は最も簡単です.2つのservletsのパスを心配する必要はありませんから.
少し複雑な方法は、次のStringをサーブレットRequestのgetRequestDispatcherに渡すことです.
"/servlet/XYZServlet"
サーブレットContextのgetRequestDispatcherから取得したRequestDispatcherオブジェクトのforwardメソッドを呼び出す必要がある場合は、次のようにパスパラメータとして「/VirtualDir/servlet/XYZサーブレット」を渡す必要があります.
RequestDispatcher rd =
getServletContext().getRequestDispatcher(
"/servlet/XYZServlet");
rd.forward(request, response);
getNamedDispatcherメソッドを使用すると、コードは次のようになります.
RequestDispatcher rd =
getServletContext().getNamedDispatcher(
"XYZServlet");
rd.forward(request, response);
getNamedDispatcherメソッドを使用する場合は、デプロイメント記述子に2番目のservletを登録する必要があります.次に例を示します.
ABCServlet
ABCServlet
XYZServlet
XYZServlet
含まれるservletを変更した場合は、変更を有効にするためにWeb containerを再起動する必要があります.これは、含まれるservletが直接呼び出されたことがないためです.含まれるservletがロードされると、そのタイムスタンプは変更されません.
1つのJSPページからコントロールを送信する場合は、実行要素を使用して、現在のJSPページの実行を終了し、コントロールを別のリソースに渡すこともできます.構文は次のとおりです.
たとえば、JSPページが解析されると、結果servletで次のコードに変換されます.
pageContext.forward("OtherPage.jsp");
HttpServeretResponseインタフェースを用いたsendRedirect法sendRedirect法はforward法よりも容易である.定義は次のとおりです.
public void sendRedirect(java.lang.String location)
throws java.iio.IOException
この方法では,locationで指定したURLに対してブラウザに要求するコマンドを送信する.この方法は絶対的または相対的なURLsを受け入れることができる.メソッドに渡されるパラメータが相対的なURLである場合、Web containerはクライアントに送信する前に絶対的なURLに変換します.アドレスが相対的であり、'/'が1つもない場合、Web containerは、現在の要求URIに対するものとみなす.
たとえば、次のコードでユーザーをwww.brainysoftwareにリダイレクトできます.com:
response.sendRedirect(http://www.brainysoftware.com);
どんなテクニックを使うべきですか.最も効果的なコードを作成するには、この2つのリダイレクトテクニックの違いを理解する必要があります.forwardメソッドはWeb container内部で動作します.sendRedirectメソッドでは、クライアントへの往復が必要です.だからforward法はsendRedirectより速い.しかし、forwardメソッドを使用するには限界があり、同じWebアプリケーションのリソースにリダイレクトするしかありません.sendRedirectメソッドでは、任意のURLにリダイレクトできます.結論:あなたの問題を解決できるならforward法を使います.sendRedirectメソッドはforwardメソッドが使用できない場合にのみ使用されます.