[Spring] DBレコードによるセレクトメニューの作成

投稿者: | 2021年2月8日

Spring Boot 2 を使い、HTML上にあるセレクトボックスのメニューを、データベースに格納されたレコードからセットするページを作成します。

View部分にはThymeleafを使用しています。

mysqlのテーブルに格納されたレコードを取得し

HTML画面上のセレクトメニューにセットし、表示します。

Entity Classの作成

まずEntity Classを作成します。今回は、IDと名前の2カラム(フィールド)だけの構成とします。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class MenuData {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column
	private long id;
	
	@Column(length=50, nullable = false)
	private String name;

	public long getId() {
		return id;
		
	}
	
	public void setId(long id) {
		this.id = id;
		
	}
	
	public String getName() {
		return name;
		
	}

	public void setName(String name) {
		this.name = name;
		
	}
	
}

Repository Interfaceの作成

データベースアクセスを行う為のRepository Interfaceです。JpaRepositoryを継承して、先に作成したEntity Classをセットするだけ。

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface MenuDataRepository extends JpaRepository<MenuData, Long> {
	
}

Controller Classの作成

次にController Classです。先に作成したrepositoryでテーブルを全件検索し、”menulist”オブジェクトに格納して、”index”へ渡しています。

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MenuSampleController {

	@Autowired
	MenuDataRepository repository;
	
	@RequestMapping(value="/", method=RequestMethod.GET)
	@Transactional(readOnly=false)
	public ModelAndView index(@ModelAttribute("formModel") MenuData sedata, ModelAndView mav) {
		mav.setViewName("index");
		List<MenuData> list = (List<MenuData>)repository.findAll();
		mav.addObject("menulist", list);
		return mav;
		
	}
	
}

Viewの作成

先に作成した Controller Class にてパラメータの渡し先となっていた “index” です。ファイル名は index.html です。

“menulist”を展開して、メニューへセットしています。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
	<head>
		<title>top page</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	</head>
	<body>
		<table>
				<tr>
					<td><label for="categoryId">カテゴリ</label></td>
					<td>
						<select name="categoryId" th:value="*{id}">
							<option value="">==</option>
							<option th:each="item : ${menulist}" th:value="${item.id}" th:text="${item.name}" th:selected="${item.id} == *{id}"></option>
						</select>
					</td>
				</tr>
		</table>		
	</body>
</html>

データベースへの接続情報を application.properties へ記述し、起動します。

テーブルが存在しなければ、初回アクセス時に作成されます。

レコードを格納しておけば、セレクトメニューに値が表示されるハズ。