4.2 フォームからデータを送る方法

4.2 フォームからデータを送る方法

本節では、Webブラウザからの入力データをWebサーバーへ送るための2つの送信方法である、「GET送信」と「POST送信」について学習します。

4.2.1 GET送信とPOST送信の違い

GET送信とPOST送信には明確な違いがあります。その違いについて説明していきます。

GET送信

入力されたフォームデータをURLの後ろに含めてサーバーへ送信する方式です。
http://www.google.co.jp/search?aq=f&sourceid=chrome
上記のURLのように、「?」記号の後のデータがGET送信で送られている情報です。

POST送信

Webサーバーへ送るデータ本体に、入力されたフォームデータを含めて送信する方式です。
POST送信はGET送信と違い、URLの後ろに含めないので、データが送られているかどうかは目に見える形では分かりません。

この2つの送信はただ方式が違うだけではありません。POST送信と違い、GET送信ではURLに含めてデータを送信するので、大量のデータや画像ファイル等の文字列で表現しきれないデータを送信することができません。
また、URLに送信データが見えてしまうので、セキュリティ面でも注意が必要となります。
特に理由が無ければ、POST送信を利用してデータを送るほうが良いでしょう。

4.2.2 HTMLからのデータを送信する時の指定方法

HTMLで送信方法を指定する方法は、以下の3つがあります。

GET送信でデータを送信する場合のHTMLでの指定方法

① リンクタグを使用する方法。(<a href="URL?XX=xx&…" >)
② フォームタグを使用してmethod属性をgetにする方法。(<form action="URL" method="get">)
③ Webブラウザのアドレスバーに直接URLを指定する方法。

POST送信でデータを送信する場合のHTMLでの指定方法

① フォームタグを使用してmethod属性をpostにする方法。(<form action="URL" method="post">)

上記で示した通り、GET送信はフォームやリンクから指定する方法と、Webブラウザから直接アクセスする方法の3つのパターンがあります。POST送信は、<form>タグのmethod属性をpostに指定した場合にしか設定できません。このパターンの違いをしっかり覚えておきましょう。

また、GET送信なのかPOST送信なのかに応じて、サーブレット内で呼び出すメソッドの種類が異なります。どちらもHttpServletクラスで定義されたものをオーバーライドするメソッドなので、メソッド名や引数などを正確に記述する必要があります。

書式:doGet()メソッド

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    GET送信アクセス時の処理
}

書式:doPost()メソッド

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    POST送信アクセス時の処理
}

4.2.3 送信データをJavaプログラム内で扱う方法

Web画面から送られたデータをJavaのプログラム内で扱う場合、getParameter()メソッドを利用します。Javaの場合、POST送信であっても、GET送信であっても、値の取得方法に違いはありません。なお、このgetParameter()メソッドはrequestオブジェクトの変数から利用することが可能です。

書式:送信データを受け取る

String 変数名 = request.getParameter("部品名");

凡例:送信データを受け取る

送信元のフォーム部品に記述したname属性の値を使って送信先で値を取得するので、必ず同じ値を使う必要があります。また、getParameter()メソッドの戻り値はString型となるため、戻り値を受け取る変数はString型で定義する必要があります。

凡例:チェックボックスの送信データを受け取る場合

もし、送信元のフォーム部品がチェックボックスの場合は、送信するデータがString型の配列になるため、getParameter()メソッドではなく、getParameterValues ()メソッドを使います。

doPost()メソッドを利用するサーブレット

HTMLの別画面(送信元)からPOST送信された入力データを送信先のサーブレットで受け取り、Webブラウザに表示します。doPost()メソッドが動作しデータが画面に表示されることを確認しましょう。

① 親フォルダの入力または選択: web_basic/src/main/webapp/ch04
② ファイル名: postForm.html
③ アクセスURL: http://localhost:8080/web_basic/ch04/postForm.html

postForm.html

<html>
    <head>
        <meta charset="UTF-8">
        <title>POST送信データを扱うサーブレット</title>
    </head>
    <body>
        <h2>POST送信フォーム</h2>
        <form action="../PostReceiptServlet" method="post">
            お名前:<input type="text" name="onamae">
            <input type="submit" value="送信">
        </form>
    </body>
</html>

① ソース・フォルダ: web_basic/src/main/java
② パッケージ: ch04
③ 名前: PostReceiptServlet
④ スーパークラス: jakarta.servlet.http.HttpServlet
⑤ アクセスURL: postForm.htmlからの画面遷移でアクセスされる

PostReceiptServlet.java

package ch04;

import java.io.IOException;
import java.io.PrintWriter;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/PostReceiptServlet")
public class PostReceiptServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //パラメータの取得
        String name = request.getParameter("onamae");

        //画面出力
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("お名前は" + name + "さんですね。");
    }
}

解説

今回のプログラムは、データを入力するWeb画面の「postForm.html」と、データの受け取り先のサーブレット「PostReceiptServlet.java」の2つのファイルから構成されています。
まず、データの送信元である「postForm.html」について解説します。このファイルでは8行目から11行目のPOST送信用のフォームを定義しています。

 8: <form action="../PostReceiptServlet" method="post">
 9:     お名前:<input type="text" name="onamae">
10:     <input type="submit" value="送信">
11: </form>

8行目では、データの送信先を「../PostReceiptServlet」に指定し、送信方法を「post」に設定しています。9行目では、お名前を入力するためのテキストボックスの部品名を、「onamae」に設定しています。10行目では、データを送信する実行ボタンの表示名を「送信」に設定しています。この送信ボタンがないと、データを送ることができないので、<form>タグを利用する場合は送信ボタンを一緒に設置することを忘れないようにしましょう。

次は、データの受け取り先の「PostReceiptServlet.java」の処理について説明を行います。
「PostReceiptServlet.java」では、今までのサーブレットとは異なり、15~16行目でdoPost()メソッドをオーバーライドしています。「postForm.html」からデータがPOST送信されているためdoPost()メソッドが呼び出され実行されます。

15: protected void doPost(HttpServletRequest request, HttpServletResponse response)
16: throws ServletException, IOException {

18行目では、送信されたデータの取得を行なっています。データを取得する方法は、POST送信であってもGET送信であってもgetParameter()メソッドを使うことに変わりありません。

18: String name = request.getParameter("onamae");

doPostメソッドの引数であるrequest変数のgetParameter()メソッドに取得したい部品名を指定することで、その部品名のフォームデータを取得することができます。

最後に、このプログラムはPOST送信アクセスを前提に作成されているため、doGet()メソッドが存在していません。この状態でGET送信アクセスをするとエラーになってしまうので、注意が必要です。
試しに、「postForm.jsp」の9行目にある「method=”post”」を「method=”get”」に変えて実行してみましょう。

methodをgetに変更し実行すると、図のようにエラーが表示されます。このように、doPost()メソッドのみのサーブレットの場合は、GET送信アクセスを受けることができないので注意しておきましょう。もちろんその逆として、doGet()メソッドのみのサーブレットの場合は、POST送信アクセスを受け取ることはできません。
そのため、どちらの送信形式で届けるべきか、また、送信先のJavaファイルではその送信形式で受け取る準備ができているのかは、プログラムを設計・記述する際にしっかり意識するべきポイントになります。


NEXT>> 4.3 本章のまとめ