読者です 読者をやめる 読者になる 読者になる

山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

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

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

実行結果イメージ

まず、サンプルの実行結果を掲載しておく。
f:id:yyama1556:20170430133140p:plain

Controller 側

コントローラのサンプル(抜粋)がこちら。

@Controller
public class HomeController {

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

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

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

		return "home";
	}

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

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

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

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

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

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

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

JSP

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

	<h3>String</h3>
	${att1}<br />
	<br />
	
	<h3>List 要素指定</h3>
	${att2[0]}<br />
	${att2[1]}<br />
	${att2[2]}<br />
	<br />
	
	<h3>List ForEachでまわす</h3>
	<c:forEach var="str" items="${att2}">
		<c:out value="${str}" /><br />
	</c:forEach>
	<br />
	
	<h3>独自クラス</h3>
	${att3.name}<br />
	${att3.age}<br />
	<br />

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

独自クラスのフィールドにアクセスしたい場合、 ${} 内で「識別子.フィールド名」のように指定する。

ソース全量

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

Controller。

package org.yyama.web;

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

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

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

		// 独自クラス
		ClassA classA = new ClassA();
		classA.setName("山崎屋");
		classA.setAge(19);
		model.addAttribute("att3", 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"
	pageEncoding="utf-8"%>
<html>
<head>
<title>Home</title>
</head>
<body>
	<h3>String</h3>
	${att1}<br />
	<br />
	
	<h3>List 要素指定</h3>
	${att2[0]}<br />
	${att2[1]}<br />
	${att2[2]}<br />
	<br />
	
	<h3>List ForEachでまわす</h3>
	<c:forEach var="str" items="${att2}">
		<c:out value="${str}" /><br />
	</c:forEach>
	<br />
	
	<h3>独自クラス</h3>
	${att3.name}<br />
	${att3.age}<br />
	<br />
	
</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>4.3.8.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

SpringによるWebアプリケーションスーパーサンプル 第2版

SpringによるWebアプリケーションスーパーサンプル 第2版