クライアントへの結果の返送

サーブレットで、リクエストクライアントにダイナミックコンテンツを返すことができます。出力は、サーブレットに渡された情報やサーブレットが計算する情報に基づいて生成されます。たとえば、サーブレットは渡されたフォーム属性 (request オブジェクトを使用してアクセスするもの) を使用して、フォーマットされたデータベースデータを返すことができます。一方、アプリケーションにユーザーの環境設定を維持するメソッドがある場合は、保管されている環境設定に基づいて、サーブレットでブラウザの表示色を設定できます。

HTTP レスポンスを使用して、次のように情報を返します。

特殊文字の処理

PrintWriter のオブジェクトの print メソッドと println メソッドを使用する場合、引用符を使用するときに、特別な配慮をする必要があります。次の例に示すように、特殊文字は ¥ 記号でエスケープします。

out.println("<INPUT TYPE=¥"Submit¥" VALUE=¥"Submit¥"></FORM>");

引用符を出力に含めるには、HTML エンティティを使用できます。これらのエンティティは、ブラウザが解釈して表示しますが、サーブレットの処理では解釈されません。次の例は、引用符の HTML エンティティを示しています。

out.println("<B>&quot;ここは危ないよ。&quot; と彼が言った。</B>");

この例は、ブラウザで次のように表示されます。

"ここは危ないよ。" と彼が言った。

HTML エンティティのリストについては、http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html をご覧ください。

ヘッダーの設定

HttpServletResponse オブジェクト API には、HTTP ヘッダーを response オブジェクトに設定するメソッドがいくつか含まれています。これらのメソッドは、現在のヘッダーに既存の値がある場合は、それを置き換えます。これらのメソッドの中のいくつかがServletResponse オブジェクトから継承されています。

次の表で、これらのメソッドを説明します。
メソッド
説明
setHeader
(String name, String value)
String を使用し、便利なメソッドを持たないヘッダーを設定します。この値が int の場合は、setIntHeader メソッドを使用します。
Refresh ヘッダーを設定するには、次のコードを使用します。
response.setHeader("Refresh", "15");
setDateHeader
(String name, long date)
Date ヘッダーを設定します。
setIntHeader
(String name, int value)
int 値を取得し、便利なメソッドを持たないヘッダーを設定します。値が String の場合は、setHeader メソッドを使用します。
Expires ヘッダーを設定するには、次のコードを使用します。
response.setIntHeader("Expires", -1);
setContentLength
(int length)
バイト数を示す Content-Length ヘッダーを設定します。たとえば、次のようにコーディングします。
response.setContentLength(data.length);

HttpServletResponse インターフェイスは ServletResponse からこのメソッドを継承しています。
通常このヘッダーを変更することはありません。
setContentType()
Content-Type ヘッダーを設定します。Content-Type で、レスポンスドキュメントの MIME タイプと文字セットエンコードが識別されます。Content-Type ヘッダーを
設定するには、次のコードを使用します。
response.setContentType("text/html; 
charset=Shift_JIS");

デフォルト MIME タイプは text/plain です。一般的な MIME タイプの例は次のとおりです。
  • HTML フォーマット (.htm または .html):text/html
  • Adobe Portable Document (pdf):application/pdf
  • Microsoft Word (.doc):application/msword
  • Microsoft Excel (.xls):application/msexcel
  • Microsoft Powerpoint (.ppt):application/ms-powerpoint
  • Realaudio (.rm または .ram):audio/x-pn-realaudio
  • テキストフォーマット (.txt):text/txt
  • Zip 圧縮ファイル (.zip):application/zip
登録された MIME タイプのリストをダウンロードするには、ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/ をご覧ください。
文字セット設定の詳細については、弟 3 章、「国際化対応とローカリゼーションについて」 を参照してください。
setContentLength(int len)
Content-Length ヘッダーを設定します。
setLocale(Locale locale)
Content-Language ヘッダーと Content-Type ヘッダーの charset 値を設定します。デフォルトはサーバシステムのロケールです。
Web アプリケーションでの国際化対応テクニックの使用方法の詳細については、弟 3 章、「国際化対応とローカリゼーションについて」 を参照してください。
addCookie(Cookie cookie)
Set-Cookie ヘッダーを設定します。複数の Cookie をレスポンスに追加できます。Cookie の使用方法の詳細については、 「Cookie の処理」 を参照してください。
sendRedirect
(String location)
Location ヘッダーを設定しステータスコードを 302 (Found) に設定します。たとえば次のように、相対 URI や絶対 URI を指定することができます。
response.sendRedirect("http://
www.hamsteak.com/index.html");

相対URL を指定した場合は、JRun はリクエストを転送する前に絶対 URI を構築します。サーブレット API には、リクエストを転送するための便利なメソッドを提供する RequestDispatcher も含まれています。
詳細については、 「制御の受け渡し」 を参照してください。
setStatus(int sc)
レスポンスドキュメントのためにステータスコードを
設定します。ステータスコードには次のものがあります。
  • 1xx: Informational 有効なリクエストが受信されました。
  • 2xx: Success リクエストは有効で、レスポンスは成功しました。
  • 3xx: Redirection リクエストを処理するには、追加情報が必要です。
具体的なステータスコードの詳細については、HTTP 仕様を参照してください。
sendError(int sc)
指定されたステータスコードを使用してエラーをブラウザに送信します。エラーステータスコードには次のものがあります。
  • 4xx: Client Error リクエストが無効です。
  • 5xx: Server Error サーバは、リクエストを達成できませんでした。
具体的なステータスコードの詳細については、HTTP 仕様を参照してください。

response オブジェクトにも同等の addXxxxx メソッドがあり、既存のヘッダーを置き換えるのではなく、レスポンスに新しいヘッダーを追加します。詳細については、サーブレット API を参照してください。

次のコード例では、レスポンスヘッダーを設定し、リクエストヘッダーのリストを表示してす。

...
resp.setContentType("text/html");
int sc=200;
resp.setStatus(sc);
resp.setHeader("Cache-Control", "no-cache,must-revalidate");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-store");
resp.setDateHeader("max-age", 0);
resp.setDateHeader("Expires", 0);
Enumeration enum = req.getHeaderNames();
while (enum.hasMoreElements()) {
  String headerName = (String) enum.nextElement();
  String headerVal = req.getHeader(headerName);
  out.println(headerName + " :" + headerVal + "<BR>");
}
...  

リクエストとレスポンスに関して HTTP ヘッダーを表示するには、TCPMonitor ユーティリティを使用します。詳細については、 「TCPMonitor の使用」 を参照してください。

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。

PrintWriter の使用

PrintWriter は文字データを response オブジェクトに書き込みます。このオブジェクトには print メソッドと println メソッドがあります。PrintWriter を使用するには、java.io.* パッケージをインポートし、IOExceptions をキャッチする必要があります。

次の例は、サーブレットで PrintWriter の out メソッドを使用して、リクエストクライアントにレスポンスを返す方法を示しています。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class PrintTester extends HttpServlet {
  public void doGet ( HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
  PrintWriter out = response.getWriter();
  out.println("<html><head><title>PrintTester</title></head>");
  out.println("<body>PrintTester よりこんにちは");
  out.println( "</body></html>");
  }
}

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。

ServletOutputStream の使用

ServletOutputStream オブジェクトは、バイナリデータをクライアントに返します。このオブジェクトには print メソッドと println メソッドがあります。これは
java.io.OutputStream のサブクラスなので、flushclosewrite メソッドも備えています。ServletOutputStream を使用するには、java.io.* パッケージをインポートし、IOExceptions をキャッチする必要があります。

次の例では、サーブレットで ServletOutputStream のメソッドを使用して、リクエストクライアントにレスポンスを返します。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SOSTester extends HttpServlet {
public void doGet ( HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
  ServletOutputStream sos = response.getOutputStream();
  String s = "SOSTester よりこんにちは";
  sos.print(s);
  sos.close();
  }
}

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。