サーブレットサーバーのHTTPレスポンス


前の章で説明したように、Web サーバーが HTTP リクエストに応答するとき、その応答には通常、ステータス行、いくつかの応答ヘッダー、空白行、およびドキュメントが含まれます。典型的な応答は次のようになります:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>

ステータス行には、HTTP バージョン (この場合は HTTP/1.1)、ステータス コード (この場合は 200)、およびステータス コードに対応する短いメッセージ (この場合は OK) が含まれます。例)。

次の表は、Web サーバーからブラウザに返される最も便利な HTTP 1.1 応答ヘッダーをまとめたもので、Web プログラミングで頻繁に使用されます。

ヘッダー情報説明
Allow このヘッダー情報は、サーバーがサポートするリクエストメソッド (GET、POST など) を指定します。
Cache-Control このヘッダーは、応答ドキュメントを安全にキャッシュできる状況を指定します。可能な値は、public、private、または no-cache などです。パブリックはドキュメントがキャッシュ可能であることを意味し、プライベートはドキュメントが 1 人のユーザーにプライベートであり、プライベート (非共有) キャッシュにのみ保存できることを意味し、キャッシュなしはドキュメントをキャッシュすべきではないことを意味します。
Connection このヘッダーは、ブラウザが永続的な HTTP 接続を使用するかどうかを示します。値 close はブラウザーに永続的な HTTP 接続を使用しないように指示し、値 keep-alive は永続的な接続を使用することを意味します。
Content-Disposition このヘッダーを使用すると、ユーザーに応答を指定された名前のファイルにディスクに保存するようブラウザーに要求できます。
Content-Encoding 送信プロセス中、このヘッダー情報はページのエンコード方式を指定します。
Content-Language このヘッダー情報は、ドキュメントの作成に使用される言語を示します。たとえば、en、en-us、ru などです。
Content-Length このヘッダーは、応答内のバイト数を示します。この情報は、ブラウザが永続的な (キープアライブ) HTTP 接続を使用する場合にのみ必要です。
Content-Type このヘッダー情報は、応答ドキュメントの MIME (MultiPurpose Internet Mail Extension) タイプを提供します。
Expires このヘッダーは、コンテンツの有効期限が切れる時間を指定します。その後、コンテンツはキャッシュされなくなります。
Last-Modified このヘッダー情報は、ドキュメントの最終変更時刻を示します。その後、クライアントはファイルをキャッシュし、今後のリクエストで If-Modified-Since リクエスト ヘッダーを介して日付を提供できます。
Locationこのヘッダーは、ステータス コードを持つすべての応答に含める必要があります。 300 秒以内に、ブラウザにドキュメントのアドレスが通知されます。ブラウザは自動的にこの場所に再接続し、新しいドキュメントを取得します。
Refresh このヘッダーは、ブラウザーが更新されたページをできるだけ早くリクエストする方法を指定します。ページを更新する秒数を指定できます。
Retry-After このヘッダーは、503 (Service Unavailable) 応答と組み合わせて使用​​でき、クライアントにリクエストをどれだけ早く繰り返すことができるかを通知します。
Set-Cookieこのヘッダーは、ページに関連付けられた Cookie を指定します。

HTTPレスポンスヘッダーを設定するメソッド

以下のメソッドは、サーブレットプログラムでHTTPレスポンスヘッダーを設定するために使用できます。これらのメソッドは、HttpServletResponse オブジェクトを通じて利用できます。

シリアル番号メソッドと説明
1String encodeRedirectURL(String url)
sendRedirect メソッドで使用される指定された URL をエンコードします。エンコードが必要ない場合は、URL を変更せずに返します。
2String encodeURL(String url)
セッション ID を含む指定された URL をエンコードするか、エンコードが必要ない場合は URL を変更せずに返します。
3boolean containsHeader(String name)
指定された応答ヘッダーが設定されているかどうかを示すブール値を返します。
4boolean isCommitted()
応答がコミットされたかどうかを示すブール値を返します。
5void addCookie(Cookie cookie)
指定された Cookie を応答に追加します。
6void addDateHeader(String name, long date)
指定された名前と日付値を持つ応答ヘッダーを追加します。
7void addHeader(String name, String value)
指定された名前と値を持つ応答ヘッダーを追加します。
8void addIntHeader(String name, int value)
指定された名前と int 値を持つ応答ヘッダーを追加します。
9void flashBuffer()
バッファ内の内容を強制的にクライアントに書き込みます。
10void replace()
ステータス コードやヘッダーを含む、バッファー内に存在するデータをすべてクリアします。
11void replaceBuffer()
応答内の基礎となるバッファーの内容をクリアしますが、ステータス コードとヘッダーはクリアしません。
12void sendError(int sc)
指定されたステータス コードを使用してクライアントにエラー応答を送信し、バッファをクリアします。
13void sendError(int sc, String msg)
指定されたステータスを使用してクライアントにエラー応答を送信します。
14void sendRedirect(String location)
指定されたリダイレクト場所の URL を使用して、一時的なリダイレクト応答をクライアントに送信します。
15void setBufferSize(int size)
応答本文の優先バッファ サイズを設定します。
16void setCharacterEncoding(String charset)
クライアントに送信される応答の文字エンコーディング (MIME charset) を設定します。たとえば、UTF-8 です。
17void setContentLength(int len)
HTTP サーブレット応答のコンテンツ本文の長さを設定します。このメソッドは、HTTP Content-Length ヘッダーを設定します。
18void setContentType(String type)
応答がまだ送信されていない場合に、クライアントに送信される応答のコンテンツ タイプを設定します。
19void setDateHeader(文字列名、長い日付)
指定された名前と日付値を使用して応答ヘッダーを設定します。
20void setHeader(String name, String value)
指定された名前と値で応答ヘッダーを設定します。
21void setIntHeader(String name, int value)
指定された名前と int 値を使用して応答ヘッダーを設定します。
22void setLocale(Locale loc)
応答がまだ送信されていない場合は、応答の地域を設定します。
23void setStatus(int sc)
このレスポンスのステータス コードを設定します。

HTTPヘッダー応答の例

前の例でsetContentType()メソッドを確認しましたが、次の例でも同じメソッドを使用します。さらに、setIntHeader()メソッドを使用して設定します。 ヘッダーを更新します。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// 扩展 HttpServlet 类
public class Refresh extends HttpServlet {
 
  // 处理 GET 方法请求的方法
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置刷新自动加载时间为 5 秒
      response.setIntHeader("Refresh", 5);
 
      // 设置响应内容类型
      response.setContentType("text/html");
 
      // Get current time
      Calendar calendar = new GregorianCalendar();
      String am_pm;
      int hour = calendar.get(Calendar.HOUR);
      int minute = calendar.get(Calendar.MINUTE);
      int second = calendar.get(Calendar.SECOND);
      if(calendar.get(Calendar.AM_PM) == 0)
        am_pm = "AM";
      else
        am_pm = "PM";
 
      String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
    
      PrintWriter out = response.getWriter();
      String title = "自动刷新 Header 设置";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
        "<html>\n" +
        "<head><title>" + title + "</title></head>\n"+
        "<body bgcolor=\"#f0f0f0\">\n" +
        "<h1 align=\"center\">" + title + "</h1>\n" +
        "<p>当前时间是:" + CT + "</p>\n");
  }
  // 处理 POST 方法请求的方法
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

さて、上記のサーブレットを呼び出すと、現在のシステム時間が 5 秒ごとに表示されます。サーブレットを実行して少し待つと、次の結果が表示されます:

ヘッダー設定を自動的に更新します

現在の時刻は: 9:44:50 PM