サーブレット【 Controller(MVCのC)】

(ブログ記事の一覧は「こちら」)

サーブレットは、サーバー上で動的なWebページを作成するJavaの技術です。

サーブレットを使用したWebアプリの基本的な作成方法について説明していきます。

自動生成されるサーブレットファイル

JavaによるWebアプリの開発環境の構築」で作成したプロジェクトに含まれているサーブレットファイル「MainServlet.java」は、以下のJavaプログラムになっています。

f:id:MJeeeey:20201119213703j:plain

生成されるメソッドは以下の通りです。

  • コンストラク
  • doGet
  • doPost

「doGet」はGETリクエストでの通信、「doPost」はPOSTリクエストでの通信で使用されます。

GET: URLに付加してリクエストを行う
POST: Bodyに含めてリクエストを行う

簡単な修正

「doGet」内のプログラムを以下のように修正してみましょう。(出力結果は同じです)

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("Served at: ");
        out.println(request.getContextPath());
    }

今後は、PrintWriterクラスのオブジェクトを明示した、上記の方法で説明します。


Webアプリなので、HTMLタグも追加して記述する方が良いです。以下のようになります。(出力結果は同じです)

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("<title>test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("Served at: ");
        out.println(request.getContextPath());
        out.println("</body>");
        out.println("</html>");
    }

上記からわかるように、サーブレットでHTMLタグを追加すると記述量が多くなってしまいます。次に説明する「JSP」の方がすっきりとHTMLを記述することができます。

サンプル(入力画面、結果画面の作成)

テキストボックスと送信ボタンを含む「入力画面」のHTMLを用意して、送信されたテキストデータをサーブレットで受信して「結果画面」に表示するWebアプリのサンプルを作成してみましょう。

構成は以下のようになります。
入力画面「HTMLファイル」 ⇒ 結果画面「サーブレット

入力画面(HTMLファイル)の作成

「プロジェクト名」を右クリックして、「新規」-「HTMLファイル」を選択します。

f:id:MJeeeey:20201123232008j:plain:w540

ダイアログが表示されたら、「form.html」として作成します。以下のように追加されることを確認してください。

f:id:MJeeeey:20201123232420j:plain:w480

入力項目は「名前」と「趣味」を用意します。
以下のように、bodyタグ内にフォームを記述します。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <form action="/ServletAppTest/MainServlet" method="post">
        名前:<input type="text" name="name">
        趣味:<input type="text" name="hobby">
        <input type="submit" value="送信する">
    </form>

</body>
</html>

送信先はformタグのaction属性に「/{プロジェクトファイル名}/{サーブレットの@WebServlet}」とセットします。(上の例では「/ServletAppTest/MainServlet」)
また、method属性を「POST」として、POSTリクエストで送信しています。


結果画面の作成(サーブレットの編集)

「doPost」メソッドを以下のように記述します。

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 文字コードをセット(日本語の文字化けを避ける)
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

        // パラメータを取得
        String strName = request.getParameter("name");
        String strHobby = request.getParameter("hobby");

        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("<title>ユーザー情報</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>" + strName + "</p>");
        out.println("<p>" + strHobby + "</p>");
        out.println("</body>");
        out.println("</html>");
    }

実行

「form.html」(HTMLファイル名)を右クリックして、「実行」-「サーバーで実行」を選択します。

f:id:MJeeeey:20201123233202j:plain:w540

テキストボックスに入力して送信ボタンを押すと、入力したテキストが出力される画面に移動することを確認してください。

課題

上記のサンプルについて、入力項目を「名前」「趣味」から、「特技」を加えたものに修正してください。