次の方法で、サーブレットにコンテンツをインクルードできます。
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>");
}
}