山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

【Spring MVC】サーバー側(Controller)で設定した値を JSP で使用する

Web アプリケーションでの基本的な動きだが、サーバー側で作成したオブジェクトを JSP や Thymeleaf で表示(利用)することは必ずある。今回は Spring MVC を使用したサンプルを紹介する。

実行結果イメージ

まず、サンプルの実行結果を掲載しておく。

Controller 側

リクエストを受け付けるコントローラのメソッドがこちら。

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Model model) {
		// String
		model.addAttribute("att1", "ほげ");

		// Integer
		model.addAttribute("att2", 1);

		// List
		List<String> list = new ArrayList<>();
		list.add("リスト1");
		list.add("リスト2");
		list.add("リスト3");
		model.addAttribute("att3", list);

		// Map
		Map<String,String> map = new HashMap<>();
		map.put("key1", "value1");
		map.put("key2", "value2");
		map.put("key3", "value3");
		model.addAttribute("att4", map);

		// 独自クラス
		ClassA classA = new ClassA();
		classA.setName("山崎屋");
		classA.setAge(19);
		model.addAttribute("att5", classA);

		return "home";
	}

home メソッドには @RequestMapping アノテーションを付与し、クライアントからのリクエストを処理することを宣言している。

@RequestMapping については以下の記事で紹介している。
【Spring MVC】@RequestMapping の基本 - 山崎屋の技術メモ

さて本題。
home メソッドでは Model オブジェクトを引数で受け取っている。これは Spring が用意したクラスで、JSP に渡したいオブジェクトを addAttribute することになる。

サンプルでは String、Integer、リスト、マップ、独自クラスの5つを addAttribute している。

独自クラスのフィールドには、対応する Getter が必要なので注意する(JSP が Getterを使用してフィールドの値を取得している)。独自クラスのソースは後で紹介する。

addAttribute の第一引数は識別子。JSP でオブジェクトを取り出すときに使う名前。値はなんでも良いが、分かりやすい名前を付ける。今回はサンプルなので att1、att2・・・ としている。

第二引数は JSP に渡したいオブジェクトや値を指定する。

JSP 側

こちらもまずソースコード(抜粋)。

	<h3>String</h3>
	<p>${att1}</p>
	
	<h3>Integer</h3>
	<p>${att2}</p>

	<h3>List 要素指定</h3>
	<p>${att3[0]}</p>
	<p>${att3[1]}</p>
	<p>${att3[2]}</p>

	<h3>List ForEachでまわす</h3>
	<c:forEach var="str" items="${att3}">
		<p><c:out value="${str}" /></p>
	</c:forEach>
	
	<h3>Map</h3>
	<p>${att4.get("key1")}</p>
	<p>${att4.get("key2")}</p>
	<p>${att4.get("key3")}</p>	
	
	<h3>独自クラス</h3>
	<p>${att5.name}</p>
	<p>${att5.age}</p>

Model に addAttribute したときに第一引数に指定した識別子を ${} で囲むことで、オブジェクトの値を取得できる。リストの要素を指定して取得するときは ${att2[0]} のように [] の中に要素を数字で指定する。forEach でまわすときは JSTL の c:forEach を使用する。

独自クラスのフィールドにアクセスしたい場合、 ${} 内で「識別子.フィールド名」のように指定する。前にも書いたが、フィールドには Getter が必要になるので注意する。

ソース全量

最後にソースの全量を掲載しておく。

Controller。

package org.yyama.web;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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
public class HomeController {

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Model model) {
		// String
		model.addAttribute("att1", "ほげ");

		// Integer
		model.addAttribute("att2", 1);

		// List
		List<String> list = new ArrayList<>();
		list.add("リスト1");
		list.add("リスト2");
		list.add("リスト3");
		model.addAttribute("att3", list);

		// Map
		Map<String,String> map = new HashMap<>();
		map.put("key1", "value1");
		map.put("key2", "value2");
		map.put("key3", "value3");
		model.addAttribute("att4", map);

		// 独自クラス
		ClassA classA = new ClassA();
		classA.setName("山崎屋");
		classA.setAge(19);
		model.addAttribute("att5", classA);

		return "home";
	}

	// 独自クラスの宣言
	public class ClassA {
		private String name;
		private int age;

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

		public String getName() {
			return name;
		}

		public void setAge(int age) {
			this.age = age;
		}

		public int getAge() {
			return age;
		}

	}
}

JSP。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Home</title>
</head>
<body>
	<h3>String</h3>
	<p>${att1}</p>
	
	<h3>Integer</h3>
	<p>${att2}</p>

	<h3>List 要素指定</h3>
	<p>${att3[0]}</p>
	<p>${att3[1]}</p>
	<p>${att3[2]}</p>

	<h3>List ForEachでまわす</h3>
	<c:forEach var="str" items="${att3}">
		<p><c:out value="${str}" /></p>
	</c:forEach>
	
	<h3>Map</h3>
	<p>${att4.get("key1")}</p>
	<p>${att4.get("key2")}</p>
	<p>${att4.get("key3")}</p>	
	
	<h3>独自クラス</h3>
	<p>${att5.name}</p>
	<p>${att5.age}</p>

</body>
</html>

pom.xml。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.yyama</groupId>
	<artifactId>web</artifactId>
	<name>Sample</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<org.springframework-version>5.0.2.RELEASE</org.springframework-version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>2.3.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

	</dependencies>
</project>

以上。

↓↓↓ Spring Framework 関連の記事をまとめました。
yyama1556.hateblo.jp