コントローラーを作成する

このページではコントローラーを作成します。

com.example.search.controllersMemberController.java を追加してください。

まずは TOP 画面から作成します。

package com.example.search.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import com.example.search.domains.Member;
import com.example.search.mappers.MemberMapper;

@Controller
public class MemberController {

    private final MemberMapper memberMapper;

    @Autowired
    public MemberController(MemberMapper memberMapper) {
        this.memberMapper = memberMapper;
    }

    @GetMapping("/")
    public String index(Model model) {
        List<Member> members = memberMapper.all();
        model.addAttribute("members", members);
        return "index";
    }
}

@Autowired

まず最初のポイントは @Autowired アノテーションです。

前のページで作成した MemberMapper を使用したいわけですが、直接 new でインスタンス化はしません(そもそもMemberMapper はインターフェースですので new できません)。代わりにDI(Dependency Injection:依存性の注入)という方法を使います。

DI はかなり難しいオブジェクト指向のプログラミング手法なので、今すぐに覚えなくて構いません。ただ自分で new しない方法もある[^1]と知っておいてください。

さて @Autowired をコンストラクタに付与すると、コンストラクタを実行するときに自動的に引数の型のクラスのインスタンスがコンストラクタに渡されます。

今回の例では、MemberController のインスタンスが生成されるとき、コンストラクタに MemberMapper のインスタンスが渡されるということです。これを MemberController のプロパティである memberMapper に代入しています。

@Autowired
public MemberController(MemberMapper memberMapper) {
    this.memberMapper = memberMapper;
}

[^1]: 誤解があるといけないのですが、言語機能としてインスタンス化の方法が new 以外にあるということではありません。new の実行をいわば「裏側に隠す」プログラミング手法があるということです。

テンプレートへのデータの受け渡し

次のポイントは、テンプレートへのデータの受け渡しです。

Hello world! の例ではただシンプルな画面を返すだけでしたが、今回はコントローラーで取得したデータをテンプレートに渡す必要があります。

まずは前のページで定義した all メソッドでメンバーの一覧を取得します。

List<Member> members = memberMapper.all();

メンバー一覧の HTML を生成するためにこのデータをテンプレートに渡すには、まず org.springframework.ui.Model 型のインスタンスを index メソッドで受け取ります。

public String index(Model model) {

誰が model を渡すの??と思うかもしれませんが、こういう風に書けばフレームワークが自動的に渡してくれるのです。

org.springframework.ui.Model 型は、テンプレートへの渡すデータの管理を担当しています。addAttribute メソッドを呼んでデータを登録します。

model.addAttribute("members", members);

これで、index.html テンプレートで members という名前でメンバーの一覧データを参照できるようになりました。

次のページではテンプレートを記述します。