HttpServlet の使用

HttpServlet クラスは、GenericServlet クラスを拡張します。開発するサーブレットクラスの大半で、HttpServlet クラスが拡張されます。HttpServlet を使用してプログラミングを行うには、service メソッドをオーバーライドするか、1 つ以上の次の HTTP 特有のリクエスト処理メソッドをオーバーライドする必要があります。

これらのメソッドはそれぞれ次のパラメータを取ります。

service メソッドのオーバーライド

JRun では、GenericServlet を拡張するサーブレットに対してサーブレットリクエストが行われるたびに、service メソッドが呼び出されます。service メソッドをオーバーライドする必要があります。また、オプションで init メソッドや destroy メソッドをオーバーライドすることもできます。

HttpServlet を拡張するサーブレットの場合は、service メソッドのデフォルトの実装で、リクエストが適切な doXxx メソッドに転送されます。ここで Xxx はリクエストのタイプ (GET または POST) です。たとえば、サーブレットで HTTP GET リクエストが受信されると、service メソッドによって doGet メソッドが呼び出されます。デフォルトの service メソッドをオーバーライドする場合、サーブレットは HTTP リクエストの全種類を処理するか、適切な doXxx メソッドにリクエストをディスパッチするロジックを含む必要があります。

doGet メソッドのオーバーライド

JRun は doGet メソッドを、HTTP GET リクエストのために呼び出します。ユーザーが URL を入力、リンクをクリック、または method=GET を指定するフォームを送信した場合、Web ブラウザにより HTTP GET リクエストが送信されます。GET メソッドは、ページをリクエストするための最も一般的なメソッドです。

次の例は、doGet メソッドをオーバーライドするサーブレットを示しています。

import java.io.*; 
import javax.servlet.*;
import javax.servlet.http.*;
public class DisplayInfo extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException { 
  resp.setContentType("text/html; charset=UTF-8");
  PrintWriter out = resp.getWriter();
  out.println("<html><head><title>情報の表示");
  out.println("</title></head><body>");
  out.println("リクエスト URI:" + req.getRequestURI() + "<br>");
  out.println("</body></html>");
} 
}

doPost メソッドのオーバーライド

JRun は、HTTP POST リクエストのために doPost メソッドを呼び出します。ユーザーが method=POST を指定するフォームを送信した場合、Web ブラウザにより HTTP POST リクエストが送信されます。

次の例は、POST リクエストを使用してサーブレットを呼び出す HTML フォームを示しています。

<html><head><title>システムへのログイン</title></head>
  <body bgcolor="Silver">
    <h1>システムへのログイン</h1>
    <!-- ログインフォームの表示 -->
      <form action="/servlet/selectionForm" method="POST">
        <p>Name:&nbsp;
        <input type="Text" name="myName" size="30">
        <p>
        <input type="Submit" value="Log In">
      </form>
  </body>
</html>

次の例は、doPost メソッドを使用して、渡された値にアクセスするサーブレットを示しています。

import java.io.*; 
import javax.servlet.*;
import javax.servlet.http.*;
public class SelectionForm extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException {
  resp.setContentType("text/html; charset=UTF-8"); 
  PrintWriter out = resp.getWriter();
  String thisName = "Unknown Name";
  // ログインフォームからユーザー名を取得します。
  String[] attrArray = req.getParameterValues("myName");
  // 呼び出し側フォームには、myName の値が 1 つしかないと想定します。
  if(attrArray != null) {
    thisName = attrArray[0];
  }
  out.println("<html><head><title>表示する情報を選択");
  out.println("</title></head><body>");
  out.println("<h1>Welcome " + thisName + "</h2>");
  out.println("<h2>表示する情報を選択</h2>");
  // ¥ を使用して、二重引用符をエスケープします。
  out.println("<form action=¥"/servlet/displayInfo¥" 
method=¥"post¥">");
  // HTTP リクエスト情報を表示するチェックボックス
  out.println("<p>リクエスト情報を表示しますか?&nbsp;");
  out.println("<input type=¥"Checkbox¥" name=¥"requestInfo¥" 
checked>");
  // Cookie 情報を表示するチェックボックス
  out.println("<p>Cookie を表示しますか?&nbsp;");
  out.println("<input type=¥"Checkbox¥" name=¥"showCookies¥" 
checked>"); 
  out.println("<br>");
  out.println("<input type=¥"Submit¥">"); 
  out.println("</form>");
  out.println("</body></html>");
} 
}

doGet メソッドとdoPost メソッド両方のオーバーライド

ほとんどのサーブレットは、doGet メソッドに応答します。ただし、開発者が doPost メソッドを処理することを忘れ、それからサーブレットにリクエストをポストするフォームを追加した場合は、サーブレットがエラーを返さないようにする必要があります。これを避けるための最も一般的な方法は、デフォルトで doPost メソッドから doGet メソッドに制御を渡すことです。

次の例は、両方のメソッドを実装したサーブレットを示しています。

import javax.servlet.*;
import javax.servlet.http.*;
public class GetServletConfigInfo extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws IOException, ServletException {
    ... //ここでサーブレットを実装します。
  }
  public void doPost(HttpServletRequest request, HttpServletResponse 
response) throws IOException, ServletException {
    doGet(request, response);
  }
}

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

その他の HTTP メソッドのオーバーライド

次の表で説明するように、HttpServlet クラスには、追加の HTTP リクエストタイプをサポートするメソッドが用意されています。HTTP バージョン 1.1 ではすべてのリクエストタイプがサポートされていますが、HTTP バージョン 1.0 では GETHEADPOST だけがサポートされています。
リクエストタイプ
メソッド
コメント
DELETE
doDelete
ターゲットのリソースを削除するようにサーバにリクエストします。
DELETE リクエストの詳細については、HTTP のドキュメントを参照してください。
PUT
doPut
リソースをリクエストします。
PUT リクエストの詳細については、HTTP のドキュメントを参照してください。
HEAD
doHead
doGet メソッドを実行しますが、返すのはヘッダーだけです。
OPTIONS
doOptions
サポートされているオプションのリストを返します。通常、このメソッドをオーバーライドする必要はありません。
TRACE
doTrace
すべてのヘッダーのリストを返します。通常、このメソッドをオーバーライドする必要はありません。