Thymeleafの標準オブジェクト(#maps, #strings)の使い方を完全ガイド!初心者でもわかる解説
新人
「Thymeleafで便利に使える標準オブジェクトって何がありますか?」
先輩
「Thymeleafには#mapsや#stringsといった便利な標準オブジェクトが用意されていて、テンプレート内でデータ操作が簡単にできるんだ。」
新人
「それらはどんな時に使うんですか?」
先輩
「じゃあ、#mapsと#stringsの基本的な使い方を具体的に見ていこう!」
1. Thymeleafの標準オブジェクトとは?
Thymeleafの標準オブジェクトは、テンプレート内で簡単に利用できる便利なオブジェクト群です。これにより、バックエンドで複雑な処理をせずとも、HTML内で直接データ操作や文字列操作が行えます。特に頻繁に使われるのが#mapsと#stringsです。
ポイント:標準オブジェクトを使うことで、コードがシンプルになり、保守性が向上します。
2. #mapsとは?
#mapsは、マップ(連想配列)の操作を簡単にするためのオブジェクトです。特定のキーが存在するか確認したり、値を取得したりすることができます。
基本的な使い方
<p th:text="${#maps.containsKey(myMap, 'name')}">プレースホルダー</p>
<p th:text="${#maps.get(myMap, 'age')}">プレースホルダー</p>
コントローラのコード例
@Controller
public class MapController {
@GetMapping("/map-example")
public String showMapExample(Model model) {
Map<String, Object> myMap = new HashMap<>();
myMap.put("name", "山田太郎");
myMap.put("age", 30);
model.addAttribute("myMap", myMap);
return "mapExample";
}
}
HTMLテンプレート(mapExample.html)のコード例
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>#mapsの使用例</title>
</head>
<body>
<h1>#maps の基本的な使い方</h1>
<p>名前が存在するか: <span th:text="${#maps.containsKey(myMap, 'name')}"></span></p>
<p>年齢: <span th:text="${#maps.get(myMap, 'age')}"></span></p>
</body>
</html>
実行結果
名前が存在するか: true
年齢: 30
ポイント:#maps.containsKeyでキーの存在確認、#maps.getで値の取得が可能です。
3. #stringsとは?
#stringsは、文字列操作を簡単にするためのオブジェクトです。大文字・小文字変換、トリム、置換などがHTMLテンプレート内で簡単に実行できます。
基本的な使い方
<p th:text="${#strings.toUpperCase('hello')}">プレースホルダー</p>
<p th:text="${#strings.substring('Hello, World!', 0, 5)}">プレースホルダー</p>
コントローラのコード例
@Controller
public class StringController {
@GetMapping("/string-example")
public String showStringExample(Model model) {
model.addAttribute("message", " hello world ");
return "stringExample";
}
}
HTMLテンプレート(stringExample.html)のコード例
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>#stringsの使用例</title>
</head>
<body>
<h1>#strings の基本的な使い方</h1>
<p>大文字変換: <span th:text="${#strings.toUpperCase(message)}"></span></p>
<p>トリム後: <span th:text="${#strings.trim(message)}"></span></p>
</body>
</html>
実行結果
大文字変換: HELLO WORLD
トリム後: hello world
ポイント:#stringsはテンプレート内での文字列処理を大幅に簡略化してくれます。
4. #mapsの具体的な使用例
#mapsは、連想配列(Map)の操作に便利なメソッドを提供します。ここでは、キーの存在確認、値の取得、サイズの確認、空チェックなど、実際に使用される場面での使い方を紹介します。
コントローラのコード例
@Controller
public class MapExampleController {
@GetMapping("/map-usage")
public String showMapUsage(Model model) {
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("username", "tanaka");
userInfo.put("email", "tanaka@example.com");
userInfo.put("age", 25);
model.addAttribute("userInfo", userInfo);
return "mapUsage";
}
}
HTMLテンプレート(mapUsage.html)のコード例
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>#mapsの具体的な使用例</title>
</head>
<body>
<h1>#maps の具体的な使用例</h1>
<p>ユーザー名が存在するか: <span th:text="${#maps.containsKey(userInfo, 'username')}"></span></p>
<p>メールアドレス: <span th:text="${#maps.get(userInfo, 'email')}"></span></p>
<p>ユーザー情報の項目数: <span th:text="${#maps.size(userInfo)}"></span></p>
<p>マップが空かどうか: <span th:text="${#maps.isEmpty(userInfo)}"></span></p>
</body>
</html>
実行結果
ユーザー名が存在するか: true
メールアドレス: tanaka@example.com
ユーザー情報の項目数: 3
マップが空かどうか: false
ポイント:#mapsを使うことで、テンプレート内で柔軟にマップデータを扱えます。特に、フォームデータやAPIレスポンスを扱う際に便利です。
5. #stringsの具体的な使用例
#stringsは、文字列の変換や操作に役立つメソッドが豊富に揃っています。以下に、頻繁に使われる文字列操作の実例を示します。
コントローラのコード例
@Controller
public class StringExampleController {
@GetMapping("/string-usage")
public String showStringUsage(Model model) {
model.addAttribute("sampleText", " Thymeleaf Example ");
model.addAttribute("email", "user@example.com");
return "stringUsage";
}
}
HTMLテンプレート(stringUsage.html)のコード例
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>#stringsの具体的な使用例</title>
</head>
<body>
<h1>#strings の具体的な使用例</h1>
<p>元の文字列: <span th:text="${sampleText}"></span></p>
<p>トリム後: <span th:text="${#strings.trim(sampleText)}"></span></p>
<p>小文字変換: <span th:text="${#strings.toLowerCase(sampleText)}"></span></p>
<p>大文字変換: <span th:text="${#strings.toUpperCase(sampleText)}"></span></p>
<p>メールのドメイン部分: <span th:text="${#strings.substringAfter(email, '@')}"></span></p>
</body>
</html>
実行結果
元の文字列: Thymeleaf Example
トリム後: Thymeleaf Example
小文字変換: thymeleaf example
大文字変換: THYMELEAF EXAMPLE
メールのドメイン部分: example.com
ポイント:テンプレート内で文字列操作が直接できるため、バックエンドでの余計な処理が不要になります。特に、表示用の文字列整形に便利です。
6. #maps と #strings の使い分け
#mapsと#stringsは、それぞれ異なる目的で使用されますが、実際の開発では両方を組み合わせて使う場面が多くあります。ここでは、具体的な使い分け方を説明します。
#mapsを使用するケース
- オブジェクトや連想配列のデータをテンプレートで処理したいとき
- フォームデータやAPIレスポンスから特定の値を取り出したいとき
- キーの存在確認やデータの数を確認したいとき
#stringsを使用するケース
- 表示用の文字列を整形したいとき(トリム、置換、大文字・小文字変換など)
- ユーザー名やメールアドレスの一部を抽出したいとき
- 文字列の結合や特定の部分を取得したいとき
組み合わせの例
<p th:text="${#strings.toUpperCase(#maps.get(userInfo, 'username'))}">ユーザー名表示</p>
実行結果
TANAKA
ポイント:#mapsで値を取得し、#stringsで文字列操作を行うことで、テンプレート内で柔軟な処理が可能です。
7. #maps と #strings を使用する際の注意点
Thymeleafの標準オブジェクトである#mapsと#stringsは便利ですが、使用する際にはいくつかの注意点があります。以下に初心者でも理解しやすいように、よくある注意点をまとめました。
#maps の注意点
- キーが存在しない場合はnullが返る:存在しないキーを取得しようとすると
nullが返るため、テンプレートで直接表示すると"null"と表示されることがあります。#maps.containsKeyで事前に確認しましょう。 - ネストされたマップに注意:深い階層のマップを扱う場合、キーの指定を間違えないようにしてください。
- NullPointerExceptionを防ぐ:マップ自体が
nullの時にアクセスするとエラーになるので、#maps.isEmptyでのチェックが推奨されます。
#strings の注意点
- null値処理に注意:
#strings.trim(null)のようにnullを渡すと、空文字が返りますが、期待する挙動か確認が必要です。 - パフォーマンスに注意:大量の文字列処理をテンプレート内で行うと、レンダリングが遅くなることがあります。必要に応じてコントローラ側で処理しましょう。
- インジェクションのリスク:ユーザー入力を直接表示する際は、HTMLエスケープされることを確認してください。
th:textは自動エスケープされますが、th:utextはエスケープされないため注意が必要です。
8. 実践!簡単なWebアプリケーションに標準オブジェクトを活用してみよう
ここでは、実際に#mapsと#stringsを組み合わせて使用する簡単なWebアプリケーションを作成してみましょう。ユーザー情報を表示しつつ、文字列整形を行います。
ステップ1: コントローラの作成
@Controller
public class UserController {
@GetMapping("/user-info")
public String showUserInfo(Model model) {
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("username", " yamada ");
userInfo.put("email", "yamada@example.com");
userInfo.put("age", 28);
model.addAttribute("userInfo", userInfo);
return "userInfo";
}
}
ステップ2: HTMLテンプレートの作成(userInfo.html)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>ユーザー情報の表示</title>
</head>
<body>
<h1>ユーザー情報</h1>
<p>ユーザー名(トリム後、大文字変換): <span th:text="${#strings.toUpperCase(#strings.trim(#maps.get(userInfo, 'username')))}"></span></p>
<p>メールアドレス: <span th:text="${#maps.get(userInfo, 'email')}"></span></p>
<p>メールドメイン部分: <span th:text="${#strings.substringAfter(#maps.get(userInfo, 'email'), '@')}"></span></p>
<p>年齢: <span th:text="${#maps.get(userInfo, 'age')}"></span></p>
</body>
</html>
ステップ3: 実行結果
ユーザー名(トリム後、大文字変換): YAMADA
メールアドレス: yamada@example.com
メールドメイン部分: example.com
年齢: 28
ポイント:
#maps.getでデータを取得し、#stringsで文字列整形を行っています。- ユーザー名のトリムと大文字変換を同時に行うことで、表示を整えています。
- メールアドレスからドメイン部分を抽出し、テンプレート内で簡潔に処理しています。
9. まとめ(#maps と #strings のポイント復習)
この記事では、Thymeleafの標準オブジェクトである#mapsと#stringsの基本的な使い方から実践的な活用方法まで解説しました。
振り返りポイント
- #maps: 連想配列の値取得やキーの存在確認に便利。データの項目数や空チェックも可能。
- #strings: 文字列整形(トリム、大文字・小文字変換、部分抽出など)が簡単にできる。
- テンプレート内で
#mapsと#stringsを組み合わせることで、バックエンドでの処理を減らし、保守性が向上。 - 使用時は
null値やインジェクションリスクに注意すること。
今回の実践例を通じて、#mapsと#stringsの実用的な使い方を理解できたと思います。これからの開発で積極的に活用し、コードの簡略化と効率化を目指してください!