クライントからのデータ受け取り

クライアントから送信されたデータをサーブレットで受け取る方法について見てきます。

今回は、HTMLのフォームに入力されたデータをサーブレットで受け取り、レスポンスとして、受け取ったデータを出力するサンプルを作成していきます。

フォームの作成

サーブレットを作成する前に、まずはフォームを作成します。フォーム(HTMLファイル)も、Eclipse上から作成できます。

まずは新規プロジェクトを作成します。

Eclipseのメニューから「ファイル」-「新規」-「動的Webプロジェクト」をクリックします。

動的Webプロジェクト

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

「新規動的Webプロジェクト」ダイアログ

任意のプロジェクト名を入力して「次へ」をクリックします。このサンプルではプロジェクト名を「RequestRecvPJ」としています。

新規プロジェクトが作成され、プロジェクト・エクスプローラに追加されます。

新規プロジェクト

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

「新規」-「その他」

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

ウィザードを選択

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

HTMLファイル

任意のHTMLファイル名を入力し、「完了」ボタンをクリックします。このサンプルではHTMLファイル名を「FormSample.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ページを開きます。

データ送信

適当に入力し、「送信」をクリックします。

すると、サーブレットに入力したデータが渡され、レスポンスとして下記のように返されます。

データ受信