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

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

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

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

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

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

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

doPostメソッドの処理の流れ

ここでは、POSTリクエストに対応したメソッドdoPost()を取り上げている。そのAPI仕様を見る前に、doPost()の処理の流れを大まかに見てみよう。

POSTリクエストの処理するdoPost()は、サーバーにあるデータベースなどの情報を更新する処理のために使われる。クライアントから送られてくる画面入力情報は、GETとは違って外部から見えないので、クレジット番号などの入力に使える。処理の流れは次のようになっている。

そのAPI仕様を見てみよう。

doPost()メソッドのAPI仕様

doPost(HttpServletRequest req, HttpServletResponse resp)

戻り値の型

protected void

内容

サーブレットにPOSTリクエストを処理させるためにサーバー(サービスメソッド経由)によって呼び戻される。

 

HTTP POSTメソッドは、無制限の長さのデータをウェブサーバーに一回で送信する、そして、クレジットカード番号のような情報を知らせる時に役に立つ。

このメソッドをオーバーライドする時、リクエストデータを読み、レスポンスヘッダーを書き、レスポンスのためのライターまたは出力ストリームオブジェクトを取得して、そして最後に、レスポンスデータを書く。Content TypeとEncodingを含むことがベストである。プリントライターオブジェクトを使う時、プリントライターオブジェクトにアクセスする前にContent Typeを設定する。

(さらなる詳細は、API仕様書を参照してください。)

 

引数:

req -クライアントが生成するサーブレットへのリクエストを含む HttpServletRequestオブジェクト

resp - サーブレットがクライアントに送る返信を含む HttpServletResponseオブジェクト

 

例外:

java.io.IOException - もしサーブレットがリクエストを操作する時に、入力あるいは出力エラーが検出されるならば。

ServletException - もしPOSTのためのリクエストが処理できなかったならば。

では、実際のサーブレットの作成をサンプルプログラムで見てみよう。

HTML画面でリクエストを指定するサンプルプログラム

このサンプルプログラムは、サーブレットにHTMLで書かれた画面からGETリクエストとPOSTリクエストを選んで送信することができるようになっている。

HTMLファイルトサーブレットの配置は次のようになっている。

GETリクエストかPOSTリクエストの送信を選択するHTML画面表示のためのコードがservletget.htmlである。GETリクエストの送信は次のようなコードになっている。

<form action="/Servlet/ServletGetRequest" method="get">

また、POSTリクエストの場合は、この「method=」の部分が「"post"」となっている。全てのコードを次に示す。

入力画面からPOSTリクエストを受け取ったサーブレットは、doPost()メソッドの中でレスポンスを返す処理を行う。この時、POSTリクエストなので、データベースに見立てたアクセスカウンタの更新処理を行っている。

実行結果

ブラウザにURL:http://localhost:8080/Servlet/servletpost.html を入力し、Enterを押す。

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

POSTリクエスト送信ボタンを押す。この時は、サーブレットのdoPost()処理が実行されて、POSTリクエストによってアクセス回数が正常にインクリメントされたことをレスポンスとして表示する。

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

もう一度、POSTリクエストを送信すると、更新後のアクセス回数がインクリメントされる。

もし、POSTリクエストではなく、GETリクエストを送信するとどうなるかというと、エラー画面が表示される。表示内容を見るとGETリクエストをサポートしていないことが分かる。

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

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

  • [1] アノテーションの宣言をする。
  • [2] HttpServletを継承して、ServletPostクラスを定義する。
  • [3] データベースにある情報に見立てた変数accessCountInDatabaseを定義する。
  • [4] doGet()メソッドをオーバーライドして定義する。
  • [5] カウンターをインクリメントするためにincrementAccessCountInDatabase()メソッドを呼び出す。
  • [6] Content Typeを設定する。
  • [7] HTMLを出力するためのoutオブジェクトを取得する。
  • [8]-[11] outオブジェクトに「POSTリクエストを受信」と「アクセス回数」を表示するHTMLコードを出力する。
  • [20][21] 変数accessCountInDatabaseの値を戻すメソッドloadAccessCountInDatabase()を定義する。
  • [30]-[31] 変数accessCountInDatabaseの値をインクリメントするメソッドincrementAccessCountInDatabase ()を定義する。

 

まとめ

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

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

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

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメントを残す

*

ゼロからエンジニアを目指す方へ
短期間でエンジニアになる方法

必要な勉強や技術の最新動向、本当に使えるIT資格、学習に役立つ国からの奨励金などの情報を無料でお届け

資料を見てみる