HttpServlet
クラスは、GenericServlet
クラスを拡張します。開発するサーブレットクラスの大半で、HttpServlet
クラスが拡張されます。HttpServlet
を使用してプログラミングを行うには、service
メソッドをオーバーライドするか、1 つ以上の次の HTTP 特有のリクエスト処理メソッドをオーバーライドする必要があります。
doGet
doPost
doPut
doDelete
doHead
doOptions
doTrace
HttpServletRequest
。HTTP ヘッダーと、その他のクライアントリクエスト情報が含まれています。
HttpServletResponse
。ブラウザに HTML を返すことができます。
JRun では、GenericServlet
を拡張するサーブレットに対してサーブレットリクエストが行われるたびに、service
メソッドが呼び出されます。service
メソッドをオーバーライドする必要があります。また、オプションで init
メソッドや destroy
メソッドをオーバーライドすることもできます。
HttpServlet
を拡張するサーブレットの場合は、service
メソッドのデフォルトの実装で、リクエストが適切な doXxx
メソッドに転送されます。ここで Xxx
はリクエストのタイプ (GET
または POST
) です。たとえば、サーブレットで HTTP GET
リクエストが受信されると、service
メソッドによって doGet
メソッドが呼び出されます。デフォルトの service
メソッドをオーバーライドする場合、サーブレットは HTTP リクエストの全種類を処理するか、適切な doXxx
メソッドにリクエストをディスパッチするロジックを含む必要があります。
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>"); } }
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: <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>リクエスト情報を表示しますか? "); out.println("<input type=¥"Checkbox¥" name=¥"requestInfo¥" checked>"); // Cookie 情報を表示するチェックボックス out.println("<p>Cookie を表示しますか? "); 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
メソッドを処理することを忘れ、それからサーブレットにリクエストをポストするフォームを追加した場合は、サーブレットがエラーを返さないようにする必要があります。これを避けるための最も一般的な方法は、デフォルトで 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 を開きます。
次の表で説明するように、HttpServlet
クラスには、追加の HTTP リクエストタイプをサポートするメソッドが用意されています。HTTP バージョン 1.1 ではすべてのリクエストタイプがサポートされていますが、HTTP バージョン 1.0 では GET
、HEAD
、POST
だけがサポートされています。