目的
Thymeleafでは、標準でいくつかのユーティリティ関数が用意されています。
${#dates.format()} とか、${#strings.isEmpty()} とかとか。
このユーティリティ機能のことを、式ユーティリティオブジェクト とか言うらしいです。
(初めて知った・・・( ゚ ρ ゚ )ボー
便利ではあるんですが、意外と痒いところに手が届かなかったりするんですよね。
というわけなので、今回はそのユーティリティ機能を独自に作成してみましょう!ってお話です。
標準機能
例としていくつか紹介しておきますが、今回はよく使いそうなやつを抜粋しました。
ほかにもいろいろな処理があるので、詳しくは調べてみてください。
#strings
- ${#strings.isEmpty(string)}
- 文字列がブランクorNullであるかを判定する
- ${#strings.contains(string, ‘sample’)}
- 文字列に特定の文字列が含まれているかを判定する
- ${#strings.toUpperCase(string)}
- 文字列を大文字に変換する
#numbers
- ${#numbers.formatInteger(number, 3, ‘COMMA’)}
- 数値を指定桁数でカンマ区切りに設定する
- COMMAのほかにも、POINTやWHITESPACEなどが指定できる
#arrays、#lists
- ${#arrays.length(stringArray)}
- ${#lists.length(stringArray)}
- 配列(リスト)の要素数を取得する
- ${#arrays.isEmpty(stringArray)}
- ${#lists.isEmpty(stringArray)}
- 配列(リスト)が空であるかを判定する
#date
- ${ #dates.format( dateObject, ‘yyyy/MM/dd’ ) }”
- Date型をフォーマットする
#calendars
- ${#calendars.format(#calendars.createNow(), ‘yyyy年MM月dd日 HH時mm分ss秒’)}
- 現在の日時をフォーマットして出力する
- ${#calendars.createNowForTimeZone(‘GMT+0900’)}
- タイムゾーンを指定してCalendarオブジェクトを生成する
#temporals
LacalDateやLocalDataTimeを扱うことができるらしい。。。
基本的に、#datesや#calendarsと同じ
独自に作成するには?
Thymeleafからアクセスしたいクラスに対し、@componentアノテーションを指定する
@Component
public class CommonUtil {
/**
* 日付文字列を指定のフォーマットでDate型へ変換して返却する。
* 変換できない場合はNULLを返却するため要注意
*/
public Date getDate( String dateStr, String input ) {
if( dateStr == null || "".equals(dateStr) ) return null;
SimpleDateFormat f1 = new SimpleDateFormat( input );
try {
f1.setLenient(false);
return f1.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
Thymeleaf側では、@クラス名.メソッド名(引数) でアクセスする
${#dates.format( @commonUtil.getDate(dateStr, 'yyyyMMdd'), 'yyyy/MM/dd' )}"
上記の例では、日付文字列を独自ユーティリティを使用しDate型へ変換し、再度フォーマットを指定して出力しています。
なぜこんなことをしているかというと、データベースにはyyyyMMddのCHAR(8)で格納しており、
画面へ出力する際には、”/”(スラッシュ)区切りで出力したいため、
一度Date型へ変換することで正確な日付でフォーマットするようにしています。
あえてString→Stringのフォーマットを用意してもいいと思いますが、
せっかくDate型→Stringが標準であるので、そちらを極力使おうというコーディングですね。
まとめ
Thymeleafでは、独自に式ユーティリティオブジェクトが作成できる。
作り方は、
1.Javaクラスに@component アノテーションを指定
2.Thymeleaf側は、@クラス名.メソッド名(引数) でアクセスする
以上。(*・ω・)*_ _)ペコリ
コメント