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

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者: 株式会社NTTデータ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/21
- メディア: 大型本
- この商品を含むブログ (1件) を見る
![[改訂新版]Spring入門 ――Javaフレームワーク・より良い設計とアーキテクチャ [改訂新版]Spring入門 ――Javaフレームワーク・より良い設計とアーキテクチャ](https://images-fe.ssl-images-amazon.com/images/I/51vLPv7A-TL._SL160_.jpg)
[改訂新版]Spring入門 ――Javaフレームワーク・より良い設計とアーキテクチャ
- 作者: 長谷川裕一,大野渉,土岐孝平
- 出版社/メーカー: 技術評論社
- 発売日: 2016/06/14
- メディア: 大型本
- この商品を含むブログを見る

SpringによるWebアプリケーションスーパーサンプル 第2版
- 作者: 株式会社クロノス,阪田浩一
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2010/11/10
- メディア: 単行本
- 購入: 3人 クリック: 86回
- この商品を含むブログ (17件) を見る