目次へ

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」して表示するようにする事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp