概要
Spring MVCにてさまざまなフォーム部品を扱う方法についてまとめた。
テキストボックス、ラジオボタン、チェックボックスなどを画面表示⇒POST送信⇒取得する方法について紹介する。
前提
Mavenプロジェクトの作成方法と基本的な画面疎通については以下を参照。
概要 Spring MVCフレームワークを使用して開発を進める際、Mavenプロジェクトの基本的なセットアップ方法についてまとめた。 前提 プロジェクトの具体的な作成方法については以下に記載。 [siteca[…]
概要 Springを学びなおすにあたり、Spring MVCでHello Worldしたのでその基本的な方法についてまとめた。 前回はBean定義ファイルをJavaのアノテーションベースで作成したが、今回はXMLベースで作成する。 […]
事前準備
フォーム部品を表示する画面、コントローラー、フォームを作成する。
FooController.java
package com.example.prototype.web.controller.foo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.prototype.web.form.foo.FooForm;
@Controller
@RequestMapping(value = "foo") // ①
public class FooController {
/** ロガー */
private static final Logger logger = LoggerFactory.getLogger(FooController.class);
// フォーム入力画面へリダイレクト
@GetMapping("/") // ②
public String top() {
return "redirect:/foo/input"; // ③
}
// フォーム入力画面表示
@GetMapping(value = "input") // ④
public String input(Model model) {
model.addAttribute("fooForm", new FooForm());
return "foo/input";
}
}
「http://コンテキストパス/foo」から始まるURLと紐づけるURLマッピング設定。
「http://コンテキストパス/foo/」にGETリクエストした際に紐づけるURLマッピング設定。
「http://コンテキストパス/foo/input」にリダイレクトする。
「http://コンテキストパス/foo/input」にGETリクエストした際に紐づけるURLマッピング設定。
FooFormインスタンスを作成して画面に渡している。
FooForm.java
package com.example.prototype.web.form.foo;
import java.io.Serializable;
import lombok.Data;
@Data
public class FooForm implements Serializable{
// フォーム部品を追加していく
}
FooFormのフィールドに画面に表示させたいフォーム部品と紐づく変数を宣言していく。
input.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<%@ include file="/WEB-INF/common/header_common.jsp"%>
<title>さまざまなフォーム部品</title>
</head>
<body>
<div class="container mt-5">
<h2 class="text-center">さまざまなフォーム部品</h2>
<form:form modelAttribute="fooForm" class="mt-4">
<table class="table table-bordered">
<tr>
<!-- ここにフィールドをバインドさせる -->
</tr>
</table>
<div class="form-group text-center">
<button type="submit" name="send" class="btn btn-primary">送信</button>
</div>
</form:form>
</div>
</body>
</html>
※後述する@PostMappingアノテーションに紐づける
さまざまなフォーム部品
さまざまなフォーム部品の使用方法について紹介する。
テキストフィールド
テキストフィールドを表示してフォームにバインドする。
フォーム
String型のnameフィールドを追加する。
FooForm.java
// 名前
private String name;
画面
jspにテキストボックスを追加する。
input.jsp
<table class="table table-bordered">
<tr>
<th class="col-3">名前</th>
<td class="col-7">
<form:input path="name" cssClass="form-control" />
</td>
</tr>
</table>
上記の<form>タグを指定しjspを作成すると、HTML出力時には以下のように出力される。
コントローラー
送信された値はフォームにバインドされる。
FooController.java
// 送信パラメータの取得
@PostMapping(value = "input", params = "send") // ①
public String send(@ModelAttribute("fooForm") FooForm form) { // ②
logger.info("★★★name:" + form.getName() + "★★★\n");
return "redirect:/foo/input";
}
画面側にてPOST送信且つ、<button>タグのname属性に”send”と指定したことによりハンドラメソッドと紐づくマッピング設定。
画面から送信された”fooForm”(<form>タグに設定)をFooFormオブジェクトに紐づけている。
上記を記載することで、画面入力値がフォームオブジェクトのフィールドにバインドされる。
数値フィールド
数値フィールドを表示してフォームにバインドする。
フォーム
Integer型のageフィールドを追加する。
※プリミティブのint型にするとデフォルトで0を保持するため、数値フィールドに「0」が表示されるので注意
FooForm.java
// 年齢
private Integer age;
画面
jspに数値フィールドを追加する。
input.jsp
<tr>
<th class="col-3">年齢</th>
<td class="col-7">
<form:input path="age" type="number" cssClass="form-control" />
</td>
</tr>
上記の<form>タグを指定しjspを作成すると、HTML出力時には以下のように出力される。
パスワードフィールド
パスワードフィールドを表示してフォームにバインドする。
フォーム
String型のpasswordフィールドを追加する。
FooForm.java
// パスワード
private String password;
画面
jspにパスワードフィールドを追加する。
input.jsp
<tr>
<th class="col-3">パスワード</th>
<td class="col-7">
<form:password path="password" cssClass="form-control" />
</td>
</tr>
上記の<form>タグを指定しjspを作成すると、HTML出力時には以下のように出力される。
日付フィールド
日付フィールドを表示してフォームにバインドする。
フォーム
Date型のbirthdayフィールドを追加する。
FooForm.java
// 生年月日
@DateTimeFormat(pattern = "yyyy-MM-dd") // ①
private Date birthday;
画面から送られた文字列の日付パラメータをDate型に変換するためのフォーマット。
画面
jspに日付フィールドを追加する。
input.jsp
<tr>
<th class="col-3">生年月日</th>
<td class="col-7">
<form:input type="date" path="birthday" cssClass="form-control" />
</td>
</tr>
上記の<form>タグを指定しjspを作成すると、HTML出力時には以下のように出力される。
テキストエリア
テキストエリアを表示してフォームにバインドする。
フォーム
String型のbikouフィールドを追加する。
FooForm.java
// 備考
private String bikou;
画面
jspにテキストエリアを追加する。
input.jsp
<tr>
<th class="col-3">備考</th>
<td class="col-7">
<form:textarea path="bikou" cssClass="form-control" rows="5" />
</td>
</tr>
上記の<form>タグを指定しjspを作成すると、HTML出力時には以下のように出力される。
チェックボックス
チェックボックスを表示してフォームにバインドする。
単体の場合
1つのチェックボックスを表示してフォームにバインドする。
フォーム
String型のisAcceptフィールドを追加する。
FooForm.java
// 同意確認
private String isAccept;
画面
jspにチェックボックスを追加する。
input.jsp
<tr>
<th class="col-3">同意確認</th>
<td class="col-7">
<div class="form-check">
<form:checkbox path="isAccept" cssClass="form-check-input" value="1" label="同意する" />
</div>
</td>
</tr>
上記の<form>タグを指定しjspを作成すると、HTML出力時には以下のように出力される。
<label for=”isAccept1″>同意する</label>
<input type=”hidden” name=”_isAccept” value=”on”>
複数の場合
複数のチェックボックスを表示してフォームにバインドする。
フォーム
List<String>型のrolesを定義する。
<FooForm.java
// 認証者確認
private List<String> roles;
画面
<form>タグで意図したCSSをきかせることができなかったため、以下のように実装した。
input.jsp
<tr>
<th class="col-3">認証者確認</th>
<td class="col-7">
<div class="form-group">
<div class="form-check">
<form:checkbox path="roles" cssClass="form-check-input" value="1" />
<label class="form-check-label" for="roles1">利用者</label>
</div>
<div class="form-check">
<form:checkbox path="roles" cssClass="form-check-input" value="2" />
<label class="form-check-label" for="roles2">管理者</label>
</div>
<div class="form-check">
<form:checkbox path="roles" cssClass="form-check-input" value="3" />
<label class="form-check-label" for="roles3">承認者</label>
</div>
</div>
</td>
</tr>
ラジオボタン
ラジオボタンを表示してフォームにバインドする。
フォーム
String型のgenderフィールドを追加する。
FooForm.java
// 性別
private String gender;
画面
jspにラジオボタンを追加する。
input.jsp
<tr>
<th class="col-3">性別</th>
<td class="col-7">
<div class="form-check">
<form:radiobutton path="gender" value="1" cssClass="form-check-input" label="男性"/>
</div>
<div class="form-check">
<form:radiobutton path="gender" value="2" cssClass="form-check-input" label="女性"/>
</div>
</td>
</tr>
上記の<form>タグを指定しjspを作成すると、HTML出力時には以下のように出力される。
<label for=”gender1″>男性</label>
セレクトボックス
セレクトボックスを表示してフォームにバインドする。
フォーム
String型のhobbyフィールドを追加する。
FooForm.java
// 趣味
private String
コントローラー
コントローラーにて例えば以下のようにMapオブジェクトを渡すと動的にセレクトボックスを作成できる。
FooController.java
// フォーム入力画面表示
@GetMapping(value = "input")
public String input(Model model) {
model.addAttribute("fooForm", new FooForm());
var hobbies = new HashMap<String, String>();
hobbies.put("", "選択してください");
hobbies.put("1", "映画鑑賞");
hobbies.put("2", "読書");
hobbies.put("3", "ハイキング");
model.addAttribute("hobbies", hobbies); // ①
return "foo/input";
}
作成したMapオブジェクトのhobbiesを画面に渡す。
画面
jspにセレクトボックスを追加する。
input.jsp
<tr>
<th class="col-3">趣味</th>
<td class="col-7">
<div class="form-group">
<form:select path="hobby" cssClass="form-control" items="${hobbies}" />
</div>
</td>
</tr>
上記の<form>タグを指定しjspを作成すると、HTML出力時には以下のように出力される。
<option value=””>選択してください</option>
<option value=”1″>映画鑑賞</option>
<option value=”2″>読書</option>
<option value=”3″>ハイキング</option>
</select>
「items=”${hobbies}”」としていることで、サーバーから渡されたhobbiesマップをもとにセレクトボックスを作成している。