次の方法で、サーブレットにコンテンツをインクルードできます。
RequestDispatcher
オブジェクトの include
メソッド
ServletContext
オブジェクトの getResource
メソッド
RequestDispatcher
オブジェクトの使用方法については、"制御の受け渡し" を参照してください。
RequestDispatcher
オブジェクトの include
メソッドを使用してサーブレットに複数のタイプのコンテンツをインクルードできます。
RequestDispatcher
オブジェクトがテキスト ファイルをラップしている場合、include
メソッドはテキストを出力ストリームにコピーします。このテキストには HTML タグを含めることができます。
RequestDispatcher
オブジェクトがサーブレットをラップしている場合、include
メソッドはサーブレットを呼び出します。RequestDispatcher
オブジェクトが JSP をラップしている場合、include
メソッドは JSP を呼び出します。
include
メソッドを使用するとき、呼び出し側サーブレットは include
メソッドを呼び出す前と後に ServletOutputStream
、PrintWriter
、または 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>"); } }
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>"); } }