クライアントから送信されたデータをサーブレットで受け取る方法について見てきます。
今回は、HTMLのフォームに入力されたデータをサーブレットで受け取り、レスポンスとして、受け取ったデータを出力するサンプルを作成していきます。
フォームの作成
サーブレットを作成する前に、まずはフォームを作成します。フォーム(HTMLファイル)も、Eclipse上から作成できます。
まずは新規プロジェクトを作成します。
Eclipseのメニューから「ファイル」-「新規」-「動的Webプロジェクト」をクリックします。

「新規動的Webプロジェクト」ダイアログが表示されます。

任意のプロジェクト名を入力して「次へ」をクリックします。このサンプルではプロジェクト名を「RequestRecvPJ」としています。
新規プロジェクトが作成され、プロジェクト・エクスプローラに追加されます。

続いて、今作成したプロジェクトを選択した状態で、メニューの「新規」-「その他」をクリックします。

「ウィザードを選択」ダイアログが表示されます。

「Web」-「HTMLファイル」を選択し、「次へ」ボタンをクリックします。

任意のHTMLファイル名を入力し、「完了」ボタンをクリックします。このサンプルではHTMLファイル名を「FormSample.html」としています。
プロジェクト・エクスプローラに「FormSample.html」が追加されます。

「FormSample.html」を開いて、下記のようなHTMLを入力します。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>サーブレットへのデータ送信</title> </head> <body> <h1>サーブレットへのデータ送信</h1> <form action="RequestRecv" method="GET"> <p>好きなゲームは?</p> <input type="TEXT" name="Game" size=40> <p>初めて購入したハードは?</p> <input type="checkbox" name="Hard" value="ファミコン">ファミコン<br /> <input type="checkbox" name="Hard" value="スーパーファミコン">スーパーファミコン<br /> <input type="checkbox" name="Hard" value="セガサターン">セガサターン<br /> <input type="checkbox" name="Hard" value="プレーステーション">プレイステーション<br /><br /> <input type="submit" value="送信"> </form> </body> </html>
以上でフォームは完成です。

サーブレットの作成
続いて、サーブレットを作成します。
プロジェクトを選択した状態で、メニューの「新規」-「サーブレット」をクリックします。

「サーブレット作成」ダイアログが表示されます。

「Javaパッケージ」と「クラス名」に任意の名前を入力します。
ここでは、それぞれ「sample_pkg02」、「RequestRecv」と入力します。
入力後、「完了」をクリックします。
プロジェクト・エクスプローラに「sample_pkg02」パッケージと「RequestRecv.java」が追加されます。

「RequestRecv.java」をダブルクリックして開いてください。
RequestRecv.javaを開くと、いくつか警告が表示されています。
まずはこの警告を消してください。警告の消し方はこちらを参照してください。
フォーム作成時、method属性に”Get”を指定したので、doGet()メソッドに、フォームから受け取ったデータを出力するコードを記述します。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String gameName = request.getParameter("Game");
String hardName = request.getParameter("Hard");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>あなたの回答</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>あなたの回答</h1>");
out.println("好きなゲームは" + gameName + "です。");
out.println("初めて購入したハードは" + hardName + "です。");
out.println("</body>");
out.println("</html>");
}
データの取得にはHttpServletRequestクラスのgetParameter()メソッドを使用します。
メソッドの引数には、フォームHTMLで記述したinputタグのname属性の値を指定します。
クライアントから送信されるデータの取得は、主に下記メソッドを使用します。
- public String getParameter(String)
- 引数にパラメータの名前を指定し、そのパラメータの値を取得します。パラメータが存在しない場合はNullが返されます。
- public String[ ] getParameterValues(String)
- ひとつのパラメータに対し、複数の値が指定された場合にこのメソッドを使用します。値はString型の配列で返されます。パラメータが存在しない場合はNullが返されます。
- public Enumeration getParameterNames( )
- クライアントから送信されるすべてのパラメータの名前を取得します。
文字エンコーディング
ここまででひととおり完成ですが、このままではサーブレットで文字化けを起こし、Webブラウザ上に正しく日本語が表示されません。
「サーブレットでの文字化け対策」に記載したように文字エンコーディング用のフィルタを作成してください。
もしくは、フィルタで記述する内容をdoGet()メソッド内で記述しても構いません。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String gameName = request.getParameter("Game");
String hardName = request.getParameter("Hard");
:
setCharacterEncoding()メソッドでパラメータデータのエンコード方式を指定します。
このメソッドは、必ず、値を取得する前(上記サンプルではgetParameterメソッドを呼び出す前)に指定してください。
動作確認
以上でサンプルサーブレットは完成です。早速、動作確認をしてみましょう。
まず、フォームのWebページを開きます。

適当に入力し、「送信」をクリックします。
すると、サーブレットに入力したデータが渡され、レスポンスとして下記のように返されます。
