【Java & Tomcat】GETリクエストの処理 (doGet)※サンプルコード付き

  • このエントリーをはてなブックマークに追加
  • Pocket

クライアントから発せられたリクエストには様々なものがあるが、その中で今回はGETというリクエストが来た際の処理について説明する。

サーブレットのGETリクエスト処理

クライアントからのリクエストはサーブレットに渡され、そのサーブレットがリクエストの中にあるメソッドに対応した処理を行う。リクエストに含まれるメソッドには、次の図が示すようにGET、POSTなどいくつかの種類がある。そのひとつがGETリクエストである。

GETリクエストは、HttpServletクラスを継承したサーブレットクラスで処理される。このサーブレットクラスで、GETリクエストに対応したHttpServletクラスのメソッドdoGet()をオーバーライドして、要求にあった処理をさせる。

この例では、サービスメソッドのdoGet()をオーバーライドしている。このdoGet()メソッドの中に、レスポンスとしてクライアントに返すデータの処理や表示する画面をHTMLで記述することになる。

@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リクエストなので、データベースに見立てたアクセスカウンタの表示処理を行っている。カウンタの更新処理は行わない。

サーブレットの配置とプログラムのコードは次のようになっている。

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"」となっている。全てのコードを次に示す。

<!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リクエストをサポートしていないことが分かる。

表示されるブラウザ画面:

まとめ

クライアントからの要求に応じて様々な処理結果をブラウザ上に出力できることがわかるだろう。サンプルプログラムを使って処理結果を自分なりに変えてみるなど、色々とやってみよう。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できます。

IT講師に興味はありませんか?

・「今までIT講師をやってきたが、更に多くの講義を行いたい」

・「エンジニアとしてやってきたが講師業に魅力を感じている」

・「講師として活躍するためにベースとなる知識を知りたい」

・「様々な分野や言語の講師にチャレンジしてみたい」


という方はぜひIT講師募集のページをご覧ください。


リスキルテクノロジーでは「受講している方々にITを好きになってもらう」ことを目標に、同じ目標に向かって歩んで行ける講師の方を常に探しています。


システム開発やインフラ構築などのエンジニアリング経験を活かし、新入社員などの未経験者や経験の浅い初学者の方々に対してITトレーニングを行っていただくことになります。


テキストやカリキュラムは事前に用意されており、それらを元に講義を進めていくため、IT講師をはじめて実施する方でも安心してトレーニングを実施できます。


IT講師募集のページを見る

SNSでもご購読できます。

コメントを残す

*

未経験からの育成制度も充実
IT講師に興味はありませんか?

リスキルテクノロジーでIT講師の積極募集を開始! 経験・未経験問わずご応募可能。育成制度で講師スキル向上も目指せます

IT講師に応募する