職業訓練覚え書き

48日目(Spring Framework6)

formタグ

使用時にJSPに以下を記述
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

 

★フォームのname属性=フィールドになるようにクラスを定義
アクセッサ、デフォルトコンストラクタも必要
(基本的にデフォルトコンストラクタは暗黙的に追加してくれるが、引数ありのコンストラクタを定義した場合は明示的に用意する必要がある。このformタグに限らず)

 

使ってみる
入力欄4つのcontact.jspを作成

  • 氏名
  • アドレス
  • 年齢
  • 問い合わせ内容(必須)

 

Controllerクラス

Controller①

Getリクエスト時(domainオブジェクト生成)
 @GetMapping("/contact")
 public String contactGet(Model model) {

  model.addAttribute("contact", new Contact());
  return "contact";
 }

 

contact.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form action="" method="post" modelAttribute="contact">
※modelAttribute属性の値と@ModelAttribute("contact") が対応
 <p>氏名: <form:input path="name" /></p>
 <p>メール: <form:input path="mail" /></p>
 <p>年齢: <form:input path="age" /></p>
 <p>お問い合わせ: <form:textarea path="message" /></p>
 <input type="submit" />
</form:form>

 

この3つが初出

  • <form:form>…<form>
  • <form:input>…input type="text"
  • <form:textarea>…input type="textarea"

 

Controller②
 @PostMapping("/contact")
 public String contactPost(
       @ModelAttribute("contact") Contact contact,
       Model model) {
    // バリデーション
    if(contact.getMessage().isEmpty()) {
      // 入力に不備がある
      model.addAttribute("error", "内容は必須です");
      return "contact";
    } else {
      return "contactDone";
    }
  }

 

 

ほかのform部品
  • <form:password />
  • <form:textarea />
  • <form:radiobutton />
  • <form:checkbox />
  • <form:select>

<form:password />、<form:textarea />はさらっと触れるだけ

 

<form:radiobutton />
<form:checkbox />
<form:select>

 

これらを実際に使って学習

アンケート調査
 

 入力項目

  ※selectが少し難しいので一旦後回し

 

Survey.java

 フィールド、アクセッサ用意

 

SurveyController.java
 

●@GetMappingでは、addAttribute()メソッド第一引数JSPに渡す値、第二引数で受渡用のドメインオブジェクトの生成を記述

●@PostMappingではSurveyオブジェクトを受け取る
 (@ModelAttribute("survey") Survey survey)
個人情報に同意しているかどうかのみ入力チェックを行い、同意ありなら完了ページに遷移、なしならフォーム画面に戻す

 

survey.jsp

年代選択
 <form:radiobutton value="20歳未満" path="ageGroup" />20歳未満
 <form:radiobutton value="20歳以上" path="ageGroup" checked="checked" />20歳以上


興味の選択
 <form:checkbox path="interest" value="文学"/>文学

個人情報の扱いの同意
 <form:checkbox path="privacy" />同意する
 ※boolean型でパラメータを受け取るようにすればvalue属性は不要

 

surveyDone.jsp

 完了画面

 

ここまでで一旦動作確認し、地域(Areaをselect)を記述

 

domain内にAreaクラスを定義

<form:select>では以下の属性がある

  • itemValue="1"などの値が入る属性
  • itemLavel="アジア"などの名前が入る属性

そのため今回はAreaクラスに以下を記述

  • valueの値を格納するInteger型id
  • 地域名を格納するString型name
  • それらのアクセッサ
  • 引数ありのコンストラクタ(デフォルトコンストラクタは明示的に記述)

 

Survey.java

 以下のフィールドを追記し、アクセッサも用意

 private Area area;

 

ServeyController.java

 メソッドを一つ追加
 private List<Area> getAreaList(){
    List<Area> areaList = new ArrayList<>();
    // ※ここで引数ありコンストラクタが役に立つ
    areaList.add(new Area(1, "アジア"));
    areaList.add(new Area(2, "アフリカ"));
    areaList.add(new Area(3, "ヨーロッパ"));

    return areaList;
 }

 

 @GetMappingのメソッド内に追記
 // 選択肢リスト用
 List<Area> areaList = getAreaList();
 model.addAttribute("areaList", areaList);

 Post時も利用可能にするため、↑の記述を@PostMappingにコピペ
 ※ただし、引数にModel型オブジェクトの記述の追記が必要

 

survey.jsp

 <form:select path="area.id" items="${areaList}" itemLabel="name" itemValue="id" />

 SurveyController内でareaListにaddした分が選択肢になっている 

 

今日はここまで。

Springだと、入力不備で元の画面に戻す時に入力値の保持が簡単だったり、メリットが多いのがだんだんわかってきた。

ただまだまだ霧の中を進んでる感が半端ないので、できれば本とか買って授業外でも学習したいところだけどデザインパターンの話とかも普通に出てくるみたいな

なのでデザインパターンをつまみ食いしつつ、授業の内容の理解も深めたい所存

 

また来週