クライアントから発せられたリクエストには様々なものがあるが、その中で今回はGETというリクエストが来た際の処理について説明する。
目次
サーブレットのGETリクエスト処理
クライアントからのリクエストはサーブレットに渡され、そのサーブレットがリクエストの中にあるメソッドに対応した処理を行う。リクエストに含まれるメソッドには、次の図が示すようにGET、POSTなどいくつかの種類がある。そのひとつがGETリクエストである。
GETリクエストは、HttpServletクラスを継承したサーブレットクラスで処理される。このサーブレットクラスで、GETリクエストに対応したHttpServletクラスのメソッドdoGet()をオーバーライドして、要求にあった処理をさせる。
この例では、サービスメソッドのdoGet()をオーバーライドしている。このdoGet()メソッドの中に、レスポンスとしてクライアントに返すデータの処理や表示する画面をHTMLで記述することになる。
1 2 3 4 5 6 7 8 |
@WebServlet("/ServletGetRequest")//[1] public class ServletGet extends HttpServlet {//[2] static int accessCountInDatabase = 0;//[3] protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[4] …. } } |
doGet()の処理の流れ
ここでは、GETリクエストに対応したメソッド:doGet()を取り上げている。そのAPI仕様を見る前に、doGet()の処理の流れを大まかに見てみよう。
GETメソッドを処理するdoGet()だが、基本的にサーバーにあるデータベースなどの情報を読むだけで、情報の変更を行わない処理のために使われる。また、クライアントから送られてくる画面入力情報が外部に公開されるので、クレジット番号などの入力には使えない。処理の流れは次のようになっている。
そのAPI仕様を見てみよう。
doGet()メソッドのAPI仕様
doGet(HttpServletRequest req, HttpServletResponse resp)
戻り値の型 |
protected void |
内容 |
サーブレットにGETリクエストを処理させるためにサーバー によって呼び出される。 GET リクエストをサポートするために、このメソッドをオーバーライドすることは、また自動的にHTTP HEADリクエストをサポートする。HEAD リクエストはリクエストヘッダーフィールドだけで、返信の中にBODYがないGETリクエストである。 このメソッドをオーバーライドする時、リクエストデータを読み、返信ヘッダーを書き、返信のためのライターまたは出力ストリームオブジェクトを取得して、そして最後に、レスポンスデータを書く。Content TypeとEncodingを含むことがベストである。レスポンスを返すためにプリントライターオブジェクトを使う時、プリントライターオブジェクトにアクセスする前にContent Typeを設定する。 (さらなる詳細は、API仕様書を参照してください。)
引数: req -クライアントが生成するサーブレットへのリクエストを含む HttpServletRequestオブジェクト resp -サーブレットがクライアントに送る返信を含む HttpServletResponseオブジェクト 例外: java.io.IOException - もし、サーブレットがGET リクエストを操作する時に、入力もしくは出力エラーが検出されるならば。 ServletException - もし、GETリクエストのための処理できなかったならば。 |
では、実際のサーブレットの作成をサンプルプログラムで見てみよう。
GETリクエストを処理するサンプルプログラム
このサンプルプログラムラムでは、GETリクエストの処理をdoGet()メソッドで実装している。サーブレットは、この時、GETリクエストなので、データベースに見立てたアクセスカウンタの表示処理を行っている。カウンタの更新処理は行わない。
サーブレットの配置とプログラムのコードは次のようになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ServletGetRequest")//[1] public class ServletGet extends HttpServlet {//[2] static int accessCountInDatabase = 0;//[3] protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[4] response.setContentType("text/html; charset=Shift_JIS");//[5] PrintWriter out = response.getWriter();//[6] out.println("<html><head></head><body>");//[7] out.println("<p>GETリクエストを受信</p>");//[8] out.println("<p>アクセス回数:" + loadAccessCountInDatabase() + "回</p>");//[9] out.println("</body></html>");//[10] } int loadAccessCountInDatabase() {//[20] return accessCountInDatabase;//[21] } } |
実行結果
ブラウザにURL:http://localhost:8080/Servlet/ServletGetRequest を入力し、Enterを押す。
表示されるブラウザ画面:
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] アノテーションの宣言をする。
- [2] HttpServletを継承して、ServletGetクラスを定義する。
- [3] データベースにある情報に見立てた変数accessCountInDatabaseを定義する。
- [4] doGet()メソッドをオーバーライドして定義する。
- [5] Content Typeを設定する。
- [6] HTMLを出力するためのoutオブジェクトを取得する。
- [7]-[10] outオブジェクトに「GETリクエストを受信」と「アクセス回数」を表示するHTMLコードを出力する。
- [20][21] 変数accessCountInDatabaseの値を戻すメソッドloadAccessCountInDatabase()を定義する。
HTML画面でリクエストを指定するサンプルプログラム
このサンプルプログラムは、前のセクションのサーブレットにHTMLで書かれた画面からGETリクエストとPOSTリクエストを選んで送信することができるようになっている。
サーブレットの配置とプログラムのコードは次のようになっている。
GETリクエストかPOSTリクエストの送信を選択するHTML画面表示のためのコードがservletget.htmlである。GETリクエストの送信は次のようなコードになっている。
<form action="/Servlet/ServletGetRequest" method="get">
また、POSTリクエストの場合は、この「method=」の部分が「"post"」となっている。全てのコードを次に示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html lang="ja"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <title>GETリクエストサンプル</title> </head> <body> <p>リクエストを送信する</p> <form action="/Servlet/ServletGetRequest" method="get"> <input type="submit" value="GETリクエスト送信" style="WIDTH: 200px; HEIGHT: 20px"> </form> <p></p> <form action="/Servlet/ServletGetRequest" method="post"> <input type="submit" value="POSTリクエスト送信" style="WIDTH: 200px; HEIGHT: 20px"> </form> </body> </html> |
入力画面からGETリクエストを受け取ったサーブレットは、doGet()メソッドの中でレスポンスを返す処理を行う。
実行結果
ブラウザにURL:http://localhost:8080/Servlet/servletget.htmlを入力し、Enterを押す。
表示されるブラウザ画面:
GETリクエスト送信ボタンを押す。この時は、サーブレットのdoGet()処理が実行されて、GETリクエストが正常に処理されたことをレスポンスとして表示する。
表示されるブラウザ画面:
もし、GETリクエストではなく、POSTリクエストを送信するとどうなるかというと、エラー画面が表示される。表示内容を見るとPOSTリクエストをサポートしていないことが分かる。
表示されるブラウザ画面:
まとめ
クライアントからの要求に応じて様々な処理結果をブラウザ上に出力できることがわかるだろう。サンプルプログラムを使って処理結果を自分なりに変えてみるなど、色々とやってみよう。