HttpServlet
クラスにより、GenericServlet
クラスが拡張されます。開発するサーブレット クラスの大半で、HttpServlet
クラスが拡張されます。HttpServlet
を使用してプログラミングするには、service
メソッド、または HTTP 固有の要求処理メソッドのどちらかを書き換える必要があります。
doGet
doPost
doPut
doDelete
doHead
doOptions
doTrace
HttpServletRequest
。HTTP ヘッダと、その他のクライアント要求情報が含まれています。
HttpServletResponse
。ブラウザに HTML を返すことができます。
service
メソッドは、サーブレットが要求されるたびに呼び出されます。
GenericServlet
を拡張するサーブレットの場合、service
メソッドを書き換える必要があります。また、init
メソッドや destroy
メソッドを書き換えることもできます。
HttpServlet
を拡張するサーブレットの場合、service
メソッドの既定の実装で、要求が適切な doXxx
メソッドに転送されるようになっています。たとえば、HTTP GET
要求が受信されると、service
メソッドにより、doGet
メソッドが呼び出されます。既定の service
メソッドを書き換える場合、このメソッドで HTTP 要求の全種類を処理できるようになっているか、または適切な doXxx
メソッドに対して要求をディスパッチするロジックが含まれている必要があります。
doGet
メソッドは、HTTP GET
要求のために呼び出されます。ユーザが URL をタイプ、リンクをクリック、または method=GET
を指定するフォームを送信した場合、Web ブラウザにより HTTP 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"); PrintWriter out = resp.getWriter(); out.println("<html><head><title>Display Information"); out.println("</title></head><body>"); out.println("<h1>displayInfo Servlet</h1>"); out.println("<h2>Request Information</h2>"); out.println("Scheme:" + req.getScheme() + "<br>"); out.println("Server Name:" + req.getServerName() + "<br>"); out.println("RemoteAddr:" + req.getRemoteAddr() + "<br>"); out.println("RemoteHost:" + req.getRemoteHost() + "<br>"); out.println("Method:" + req.getMethod() + "<br>"); out.println("Query String:" + req.getQueryString() + "<br>"); out.println("Request URI:" + req.getRequestURI() + "<br>"); out.println("Servlet Path:" + req.getServletPath() + "<br>"); out.println("</body></html>"); } }
doPost
メソッドは、HTTP POST
要求のために呼び出されます。ユーザが method=POST
を指定するフォームを送信した場合、Web ブラウザにより HTTP POST
要求が送信されます。
以下に示すのは、POST
要求を通じてサーブレットを呼び出す HTML フォームの例です。
<html>
<head> <title> Login to the System </title> </head> <body bgcolor="Silver"> <h1> Login to the System </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"); 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>Choose Information to Display"); out.println("</title></head><body>"); out.println("<h1>Welcome " + thisName + "</h2>"); out.println("<h2>Choose Information to Display</h2>"); // ¥ を使用して、二重引用符をエスケープします。 out.println("<form action=¥"/servlet/displayInfo¥" method=¥"post¥">"); // HTTP 要求情報を表示するチェックボックス out.println("<p>Display request information? "); out.println("<input type=¥"Checkbox¥" name=¥"requestInfo¥" checked>"); // クッキー情報を表示するチェックボックス out.println("<p>Display cookies? "); out.println("<input type=¥"Checkbox¥" name=¥"showCookies¥" checked>"); out.println("<br>"); out.println("<input type=¥"Submit¥">"); out.println("</form>"); out.println("</body></html>"); } }
次の表で説明するように、HttpServlet
クラスには、その他の HTTP 要求タイプをサポートするメソッドが用意されています。HTTP/1.1 ではすべての要求タイプがサポートされていますが、HTTP/1.0 では GET
、HEAD
、および POST
だけがサポートされている点に注意してください。