ITと創作でねこを飼いたい

プログラミングやITで勉強したこと、疑問をまとめます。

Spring MVCのform:selectタグの使い方

今回は、Spring MVCのform:selectタグにフォーカスします!(課題でぶつかったので)

参考プログラム

まずは前準備
User.java(userId,name,ageのgetter,setterとコンストラクタ)

public class User {
    
    private int userId;
    private String name;
    private int age;
    
    User(int userId, String name, int age){
        this.userId = userId;
        this.name = name;
        this.age = age;
    }
    
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
}

RegisterForm.java
Spring MVCのformタグを勉強している人にはおそらくお馴染み(?)
私的に言わせてもらうなら「欲しい情報を入れて取り出す、枠組みオブジェクト」

import java.io.Serializable;

public class RegisterForm implements Serializable{

    private int id;
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

InputController.java
次は肝心のコントローラー!
今回はGetでindex.jspに飛ばし、Postで同じURLに入ってRegisterForm.java の中の入力値をresult.jspで取り出します。

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/")
public class InputController {

    @RequestMapping(method = RequestMethod.GET)
    public String behaveCheck(Model model) {
        List<User> userlist = new ArrayList<>();
        userlist.add(new User(1,"a",20));
        userlist.add(new User(2,"b",22));
        userlist.add(new User(3,"c",24));
        userlist.add(new User(4,"d",23));
        
        RegisterForm registerForm = new RegisterForm();
        model.addAttribute(registerForm);
        model.addAttribute("userlist", userlist);
        return "index";
    }
    
    @RequestMapping(method = RequestMethod.POST)
    public String behaveResult(Model model,RegisterForm registerForm) {
        model.addAttribute(registerForm);
        return "result";
    }
}

ポイントはselectで選択するリストもmodelに格納すること!!
(今回はuserlistに相当します)

index.jsp
ここでようやくform : selectの登場です。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>入力</title>
</head>
<body>
    <form:form modelAttribute="registerForm">
    ユーザーセレクト
    <form:select path="id">
    <form:options items="${userlist}" itemLabel="name" itemValue="userId"/> 
    </form:select>
        テキスト入力<form:input path="text" />
        <form:button>送信</form:button>
    </form:form>
</body>
</html>

ポイントは
pathの中の値はRegisterForm.java のフィールドだけ
form:optionsのitems属性にはmodelに格納したリスト(今回はuserlist)
form:optionsのitemLabel,itemValueにはuser(リストに入っているオブジェクト)のフィールドを指定する
itemLabel→jspに表示される値
itemValue→registerFormに格納される値(今回はregisterFormのidにselectしたuserIdが入ります)

result.jsp
InputControllerを経由してregisterFormに格納された値を確認
(EL式で出力しただけ!適当!)

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>結果</title>
</head>
<body>
${registerForm.id}
${registerForm.text}
</body>
</html>

${registerForm.id}でselectしたuserIdが表示
${registerForm.text}でテキストボックスに入れたテキストが出力

まとめ

これで出力されたuserIdの人が、がテキスト「〜(任意)〜」を入力したんだってのが管理できるわけだ! 今回は以上!