ほかのファイルからのコンテンツのインクルード

次の方法で、サーブレットにコンテンツをインクルードできます。

RequestDispatcher オブジェクトの使用方法については、"制御の受け渡し" を参照してください。

include メソッドの使用

RequestDispatcher オブジェクトの include メソッドを使用してサーブレットに複数のタイプのコンテンツをインクルードできます。

include メソッドを使用するとき、呼び出し側サーブレットは include メソッドを呼び出す前と後に ServletOutputStreamPrintWriter、または out に書き込むことができます(out は JSP の場合のみ)。必要な場合は、ServletRequest オブジェクトの setAttribute メソッドを使用してターゲットのサーブレットまたは JSP に情報を渡すことができます。"制御の受け渡し" を参照してください。

次の例では、サーブレットをインクルードします。

import java.io.*; 
import javax.servlet.*;
import javax.servlet.http.*;

public class TestCallerInclude extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException { 
  resp.setContentType("text/html");
  PrintWriter out = resp.getWriter();
  out.println("<html><head><title>Calling Another Servlet");
  out.println("</title></head><body>");
  out.println("<h1>Calling Another Servlet</h1>");
  out.println("<p>This text comes from testCallerInclude.");

  // ServletContext を取得します。
  ServletContext sc = this.getServletContext();
  // RequestDispatcher でサーブレットをラップします。
  RequestDispatcher rd = sc.getRequestDispatcher("/servlet/includeMe");
  if (rd !=null) {
    // サーブレットをインクルードします。
    try {
      // インクルードされたサーブレットの制御は、それ自体のバッファにしかありません。
      // したがって、呼び出し側サーブレットのバッファにアクセスできません。
      rd.include(req, resp);
    }
    catch (Exception e) {
      sc.log("Problem invoking servlet.", e);
    }
  }
  // HTML を終了します。
  out.println("</body></html>"); 
}
}

getResource メソッドの使用

ServletContext オブジェクトの getResource メソッドを使用してサーブレットにコンテンツをインクルードします。getResource メソッドは URL オブジェクトを返します。その後は、この URL オブジェクトを使用してコンテンツにアクセスできます。URL オブジェクトを使用する利点は、ブラウザに返す前にコンテンツを解析できることです。

次の例では、getResource メソッドによってコンテンツをインクルードします。

import java.io.*; 
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestGetResource extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException { 
  resp.setContentType("text/html");
  ServletOutputStream out = resp.getOutputStream();
  out.println("<html><head><title>Including Content");
  out.println("</title></head><body>");
  out.println("<h1>Including Content through getResource</h1>");
  out.println("<p>This text comes from the calling class.");

  // ServletContext を取得します。
  ServletContext sc = this.getServletContext();
  try {
    // リソースを取得します。
    URL u = sc.getResource("/includedText.htm");
    if (u !=null) {
      // コンテンツにアクセスし、InputStream に割り当てます。
      InputStream in = (InputStream)u.getContent();
      byte[] buf = new byte[255];
      int numRead = in.read(buf);
      while(numRead != -1){
        out.write(buf, 0, numRead);
        numRead = in.read(buf);
      }
    }else {
      out.println("<p>u was null");
    }
  }
  catch (Exception e) {
    sc.log("Problem including content.", e);
  }
  // HTML を終了します。
  out.println("</body></html>"); 
}
}