- 5.1. 他のサーブレットの呼び出し
- 5.2. include
- 5.3. forward
- 5.4. ServletRequestを用いたデータ共有
5.2. include
includeもforwardも「javax.servlet.RequestDispatcher」インタフェースを介して実行します。このインタフェースは、「ServletRequest」の「getRequestDispatcher」および「ServletContext」の「getNamedDispatcher」「getRequestDispatcher」から取得します。これらの違いは、処理を依頼する先のリソース(「HTML」「JSP」「Servlet」)の指定方法の違いに表れます。
ServletRequest | getRequestDispatcher | 相対パスか、WWWアプリケーションルートからの絶対パスで指定する。 |
ServletContext | getRequestDispatcher | WWWアプリケーションルートからの絶対パスで指定する。 |
getNamedDispatcher | リソースにつけられた名前で指定する。 |
例えば、以下のように「WEB-INF/web.xml」に指定された2つのサーブレットがあるとします。WWWアプリケーションのルートは「http://***/sample/」とします。
<web-app> <servlet> <servlet-name>Sample</servlet-name> <servlet-class>SampleServlet</servlet-class> </servlet> <servlet> <servlet-name>Included</servlet-name> <servlet-class>IncludedServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Sample</servlet-name> <url-pattern>/servlet/Sample</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Included</servlet-name> <url-pattern>/resource/Included</url-pattern> </servlet-mapping> </webapp>
以下は「SampleServlet」から「IncludedServlet」を呼び出すサンプルです。それぞれ指定の方法で呼び出しています。「ServletRequest」の「getRequestDispatcher」はアプリケーションルートからの絶対パスでも指定可能で、その場合は「ServletContext」の「getRequestDispatcher」と同じ方法で指定します。「/」から始まっているかどうかで区別されています。
public final class SampleServlet extends HttpServlet{ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ response.setContentType("text/html; charset=EUC-JP"); PrintWriter writer=response.getWriter(); writer.println("<html><body>"); //ServletRequet.getRequestDispatcher request.getRequestDispatcher("../resource/Included").include(request,response); //ServletContext.getRequestDispatcher getServletContext().getRequestDispatcher("/resource/Included").include(request,response); //ServletContext.getNamedDispatcher getServletContext().getNamedDispatcher("Included").include(request,response); writer.println("</body></html"); } }
では「include」メソッドが呼び出された後、呼び出された側のサーブレットはどのように処理されるのでしょうか。「include」も「forward」も同じなのですが、同じHTTPのメソッドが指定されたものとして呼び出されます。GETが指定された場合には、include, forwardもGETが指定されたものとして呼び出されます。つまりSampleServletでdoGetが実行された場合には、IncludedServletでもdoGetが呼び出される事になります。
public final class IncludedServlet extends HttpServlet{ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ response.setContentType("text/html; charset=EUC-JP"); PrintWriter writer=response.getWriter(); writer.println("<p>hello!</p>"); } }
「IncludedServlet」が上記のような場合、「SampleServlet」から送出されるHTMLは以下のようになります。
<html><body> <p>hello!</p> <p>hello!</p> <p>hello!</p> </body></html>
(実習課題1)
4章の実習課題3のプログラムを改良しなさい。
- 1つのHTMLファイル(任意)を「include」して表示するようにする事。