EL式を使ったフォーマット
EL式(Epression Laungage)とは、オブジェクトのアクセスを簡略化して記述できる式言語です。
実装は複数存在し、本ライブラリでは以下の種類をサポートします。
JEXLの方がJSPのEL式と仕様が共通しておりわかりやすいですが、SpELはSpring Framework標準の言語であるためSpring環境下で開発するのであればライブラリの追加などが不要です。
EL式の処理をJEXLに切り替える
pom.xmlにJEXLの依存関係を追加します。 本ライブラリでは、JEXL v2.1を私用します。v3.xには対応していません。
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-jexl</artifactId> <version>2.1.1</version> <scope>provided</scope> </dependency>
式言語の処理の実装として、 JexlExpressionEvaluator
を指定します。
// JexlExpressionEvaluator を指定します。 MessageInterpolator messageInterpolator = new MessageInterpolator(new JexlExpressionEvaluator()); MessageFormatter messageFormatter = new MessageFormatter(messageSource, messageInterpolator);
EL式での処理方法
メッセージ中では ${EL式}
にて定義します。
- 標準で、
java.util.Formatter
が 変数formatter
として予め登録されており、String#format(...)
の書式でフォーマットできます。 - SpELでは式中の変数を
#変数名
で参照します。 - JEXLは式中の変数は、
変数名
で参照します。
## SpELの場合 message.el=値(${#formatter.format('%1.2f', #validatedValue)}) は、{min} 以上で設定してください。 ## JEXLの場合 message.el=値(${formatter.format('%1.2f', validatedValue)}) は、{min} 以上で設してください。
param(...)
で指定したパラメータは、EL式中の変数として参照できます。
double validatedValue = 3.1; String message = messageFormatter.create("message.el") .param("validatedValue", validatedValue) .param("min", 5) .format();
標準のカスタム関数を使用する
EL式の標準文法だけでは処理が複雑になる場合があるため、クラス CustomFunctions
内のユーティリティメソッドをカスタム関数として登録しており、利用できます。
カスタム関数 | 説明 |
---|---|
empty(値) |
引数で渡した値が null または空かどうか判定します。文字列の場合は空文字かどうか、配列やCollection、Mapの場合は要素数が0からどうかも判定します。 |
defaultString(値) |
引数で渡した値が null のとき、空文字に変換します。null 出ないときは、値はそのまま。 |
join(値, 区切り文字) |
引数で渡した値(配列、Collection)を区切り文字で結合します。 |
size(値) |
引数で渡した値(配列、Collection、文字列)のサイズを返します。 |
- SpELの場合は、
#カスタム関数名(引数)
の書式で呼び出します。 - JEXLの場合は、
f:カスタム関数名(引数)
の書式で呼び出します。
## SpELの場合 message.spel=値は ${#join(#array, ',')} の何れかで設定してください。 ## JXELの場合 message.jexl=値は ${f:join(array, ',')} の何れかで設定してください。
String validatedValue = "-"; String message = messageFormatter.create("message.el") .param("validatedValue", validatedValue) .param("array", new String[]{"〇", "×", "△"}) .format();
独自のカスタム関数を登録する
SpELの場合、StaticMethodMapCreator
にて、ユーティリティクラスから、 public static
メソッドを抽出し、カスタム関数として登録します。
// ユーティリティメソッドのマップを作成します Map<String, Method> functionMap = StaticMethodMapCreator.create(SampleUtils.class); // カスタム関数を登録します。 SpelExpressionEvaluator expressionEvaluator = new SpelExpressionEvaluator(); expressionEvaluator.getCustomFunctions.putAll(functionMap); // MessageFormatterの組み立て MessageFormatter messageFormatter = new MessageFormatter(messageSource, new MessageInterpolator(expressionEvaluator));
JEXLの場合、JexlEngine#getFunction()
からカスタム関数のマップを種痘して、接頭語を指定して、ユーティリティクラスを登録します。
// カスタム関数を登録します。。 JexlExpressionEvaluator expressionEvaluator = new JexlExpressionEvaluator(); expressionEvaluator.getJexlEngine().getFunctions.put("c", SampleUtils.class); // MessageFormatterの組み立て MessageFormatter messageFormatter = new MessageFormatter(messageSource, new MessageInterpolator(expressionEvaluator));