クライアントから送信されたデータをサーブレットで受け取る方法について見てきます。
今回は、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ページを開きます。
適当に入力し、「送信」をクリックします。
すると、サーブレットに入力したデータが渡され、レスポンスとして下記のように返されます。