JavaのServletでGET・POSTを受け取るには?リンク・フォームとdoGet・doPostの関係

最終更新日

Schoo Java入門 中級 第4回 Webアプリケーションの動作原理と画面連携

本記事は、Schooの「Java入門 中級【2026年版】」第4回「Webアプリケーションの動作原理と画面連携」に関連する補足記事です。ブラウザの操作がServletのどの処理につながるのかを整理します。

通常のリンクをクリックしてページを開くと、ブラウザはGETリクエストを送ります。送信先がServletなら、そこで doGet() が呼ばれます。一方、method="post" のフォームを送信すると、POSTリクエストが届き、doPost() が呼ばれます。

「画面を開いたらなぜこのメソッドが動くのか」「ボタンを押したのにdoPostが動かないのはなぜか」。この疑問を、お問い合わせ画面を開いて内容を送る例で確認していきます。

Schoo コースページ:Java入門 中級【2026年版】

ブラウザの操作とGET・POSTの対応

ブラウザでの操作送るHTTPメソッドServletの処理
アドレス欄にURLを入力して開くGETdoGet()
通常のリンクをクリックするGETdoGet()
method="get" のフォームを送信GETdoGet()
method="post" のフォームを送信POSTdoPost()
フォームの method を省略して送信GET(既定値)doGet()

この表は、JavaScriptなどで送信方法を変更せず、Servletに対応するURLへアクセスする場合の動きです。同じページ内の見出しへ移動する href="#section" のようなリンクは、新しいページを取得するリクエストとは別です。

送信ボタンを押したこと自体が、POSTを意味するわけではありません。検索ボタンでも登録ボタンでも、通常のフォームでは method の指定が送信方法を決めます。

同じURLで、入力画面を開いて内容を送る

今回のWebアプリは /lesson04 に配置し、お問い合わせ用のURLを /lesson04/contact とします。この同じURLへ、最初はGET、送信時はPOSTを送ります。

図解:同じURLでも、開くときはGET・送るときはPOST
① リンクから入力画面を開く
ブラウザ:案内ページ
お問い合わせはこちら
リンクをクリック
GET /lesson04/contact
入力画面を要求する
サーバー:ContactServlet
doGet()
入力フォームのHTMLを返す
HTMLのレスポンス
ブラウザ:お問い合わせ画面
お問い合わせ内容
送信
② 内容を入力して送信する
ブラウザ:お問い合わせ画面
営業時間を教えてください
送信
method="post" のフォーム
POST /lesson04/contact
本文に入力内容を入れて送る
サーバー:同じContactServlet
doPost()
入力内容を取得し、結果のHTMLを返す
HTMLのレスポンス
ブラウザ:受け取り結果
入力内容を受け取りました。

①と②は別々のリクエストです。矢印は上から、ブラウザが送るリクエストと、サーバーが返すレスポンスを表しています。

doGet() は入力画面のHTMLを返し、doPost() は送られた内容を確認して結果のHTMLを返します。URLが同じでも、リクエストの種類が違えば実行される処理と表示内容は変わります。

まず送信先URLでServletが決まる

@WebServlet("/contact")
public class ContactServlet extends HttpServlet {
    // GETとPOSTを受け取る処理を書く
}

@WebServlet("/contact") は、このクラスがアプリ内の /contact へのリクエストを受け取るという指定です。ContactServlet.java というファイル名をURLに書くわけではありません。

図解:URLでServletを選び、HTTPメソッドで処理を選ぶ
今回の送信先URL
http://localhost:8080/lesson04/contact
/lesson04
Webアプリの配置先
コンテキストパス
/contact
アプリ内のServletのURL
@WebServlet("/contact")
同じContactServletに届いたあと
GET のリクエスト
doGet()
POST のリクエスト
doPost()

/lesson04 はこの例のWebアプリの配置先で、コンテキストパスと呼びます。アプリ名を変えたらこの部分も変わります。@WebServlet には、その内側の /contact を指定します。

リンククリックでdoGet()を動かす

<a href="/lesson04/contact">お問い合わせはこちら</a>

リンクをクリックすると、ブラウザは GET /lesson04/contact を送ります。サーバーはURLに対応する ContactServlet に処理を渡し、doGet() が入力画面を返します。アドレス欄に同じURLを入力して開いた場合もGETです。

通常のリンクには、フォームのように method="post" を指定する仕組みはありません。リンクにこの属性を付けてもPOSTには変わりません。

フォーム送信でdoPost()を動かす

<form action="/lesson04/contact" method="post">
    <label>
        お問い合わせ内容
        <textarea name="message" required></textarea>
    </label>
    <button type="submit">送信</button>
</form>
  • action:どのURLへ送るか。今回は /lesson04/contact
  • method:どのHTTPメソッドで送るか。今回は post
  • name:入力値を取り出すための名前。今回は message

このフォームを送信すると POST /lesson04/contact が送られ、doPost() が呼ばれます。method="get" に変更すれば、同じボタンでもGETになります。

doGet()doPost() を順番に実行するよう、自分で呼び出す必要はありません。TomcatなどのServletコンテナがリクエストを受け取り、HttpServletservice() を通して、HTTPメソッドに対応する処理を呼び出します。

Servletのコード全体

次は example パッケージに置く ContactServlet.java です。授業サンプルのTomcat 10系に合わせ、jakarta.servlet を使います。この例では、リクエストの受け取りとHTMLの返却を一つのクラスで追えるようにしています。

package example;

import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/contact")
public class ContactServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
            throws IOException {
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        String action = request.getContextPath() + "/contact";

        out.println("<!DOCTYPE html>");
        out.println("<html lang=\"ja\"><head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("<title>お問い合わせ</title></head><body>");
        out.println("<h1>お問い合わせ</h1>");
        out.println("<form action=\"" + action + "\" method=\"post\">");
        out.println("<label>お問い合わせ内容");
        out.println("<textarea name=\"message\" required></textarea>");
        out.println("</label>");
        out.println("<button type=\"submit\">送信</button>");
        out.println("</form></body></html>");
    }

    @Override
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
            throws IOException {
        request.setCharacterEncoding("UTF-8");
        String message = request.getParameter("message");

        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html lang=\"ja\"><head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("<title>受け取り結果</title></head><body>");

        if (message == null || message.isBlank()) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            out.println("<p>お問い合わせ内容を入力してください。</p>");
        } else {
            out.println("<p>入力内容を受け取りました。</p>");
        }

        out.println("</body></html>");
    }
}

response.getWriter() で取得する out は、ブラウザへ返すHTMLを書き込むためのものです。System.out.println() のようにサーバーのコンソールへ表示する処理とは異なります。

request.getContextPath() は、今回なら /lesson04 を返します。ここに "/contact" を足すので、生成されるフォームの送信先は /lesson04/contact になります。

このサンプルは入力内容を受け取って応答するところまでで、メール送信やデータベースへの保存は行いません。入力された文字列もそのままHTMLへ埋め込まず、決められた結果メッセージを返しています。

POSTでも、取得する入力値は文字列

request.setCharacterEncoding("UTF-8");
String message = request.getParameter("message");

フォームの name="message" と、取得する名前 "message" が対応しています。request.setCharacterEncoding("UTF-8") は、POST本文を文字として読み取る際の文字コードを、値の取得前に指定しています。

GET・POSTは送り方の違いであり、入力値のJavaの型を変えるものではありません。どちらも getParameter() の戻り値は String です。数値として計算する場合の変換は、フォームの入力値を数値に変換する記事で扱っています。

実際に動かすときの確認順

  1. アプリをTomcatで起動し、http://localhost:8080/lesson04/contact を開く。入力フォームが表示されれば、GETを受け取れている。
  2. 内容を入力して送信する。「入力内容を受け取りました。」と表示されれば、POSTの処理が動いている。
  3. ブラウザの開発者ツールでNetwork(ネットワーク)を開き、送信時の通信を選ぶ。Request Methodが POST、送信先が /lesson04/contact かを確認する。

ポート番号やコンテキストパスは、自分のTomcatの設定に合わせてください。URLを直接開く方法で確認できるのはGETなので、POSTの動作確認はフォームを送信して行います。

doPost()が動かないときに見る場所

起きていること確認するポイント
送信しても入力画面に戻るmethod="post" かを確認。この例でGETが届くと doGet() が再びフォームを返す。
404になる送信先の action、コンテキストパス、@WebServlet の指定、アプリの起動を確認。
GETでは開けるがPOSTで405になる対象のServletに doPost() があるか確認。GET用の処理があってもPOSTには自動で対応しない。
入力値がnullになるフォームの namegetParameter() の名前が一致しているか確認。

GETは画面表示や検索、POSTは送信された内容の処理に使うよう設計します。doGet() に登録・削除を書くと、リンクを開くだけでもその処理が動いてしまいます。

確認問題

アプリのコンテキストパスは /lesson04 です。次のServletで、GETなら入力画面、POSTなら入力内容の受け取り結果を返すものとします。

@WebServlet("/entry")
public class EntryServlet extends HttpServlet {
    // doGet(): 入力画面を返す
    // doPost(): 入力内容を受け取る
}
  1. <a href="/lesson04/entry">申し込み</a> をクリックすると、GET・POSTのどちらが送られ、どのメソッドが呼ばれますか。
  2. 送信先を /lesson04/entry とし、名前を name="userName" の入力欄に入れてPOSTで送信するフォームを書いてください。
  3. 問題2の入力値をServletで取得する1行を書いてください。戻り値の型も答えてください。
  4. 問題2のフォームから method 属性を削除しました。送信ボタンを押すと、どのメソッドが呼ばれますか。
  5. URLをアドレス欄に入力して開きましたが、doPost() が動きません。理由と、POSTを確認する方法を答えてください。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

まとめ

  • 通常のリンクやアドレス欄からページを開くとGET。Servletでは doGet() が処理する。
  • フォームは method="post" でPOSTになり、doPost() が処理する。
  • URLでServletが決まり、HTTPメソッドで doGet()doPost() が選ばれる。
  • 入力値はGETでもPOSTでも getParameter() で文字列として取得する。

関連する記事

シェアする