/standalone-el

EL式を単独で使用するためのライブラリ

Primary LanguageJavaApache License 2.0Apache-2.0

Standalone-EL

Servletコンテナ非依存のスタンドアローンでEL2.2を利用可能にするライブラリ。

License

Apache License 2.0.

参考

参考にしたプログラム

BeanValidation1.1の実装であるHibernateValidator5.xのパッケージ「org.hibernate.validator.internal.engine.messageinterpolation.el」内のクラス。

EL式の各クラスの役割が説明されているサイト。

同じようなライブラリ

使い方

ダウンロード

Mavenのセントラルリポジトリからダウンロードします。

<dependency>
    <groupId>com.github.mygreen</groupId>
    <artifactId>standalone-el</artifactId>
    <version>0.2</version>
</dependency>

ELProcessorを呼ぶ場合

ELProcessor elProc = new ELProcessor();

// 変数の登録
elProc.setVariable("currentDate", new Date());
elProc.setVariable("formatter", new FormatterWrapper(Locale.getDefault()));

String eval = elProc.eval("formatter.format('%1$tY/%1$tm/%1$td', currentDate)", String.class);

System.out.println(eval);

EL関数を使用する場合

// EL関数として呼び出すクラスの定義。
public class MyFunction {
        // staticメソッドで定義します。
    public static int sum(int a, int b) {
        return a + b;
    }
}

// ELProcessorにEL関数として登録する。
ELProcessor elProc = new ELProcessor();

/*
 * 第1引数 - EL式中で呼び出すための接頭語。
 * 第2引数 - EL式中で呼び出す関数名。空文字("")で指定した場合、Javaの関数名が使用されます。
 * 第3引数 - 呼び出すJavaのクラス名を指定します。
 * 第4引数 - 呼び出すメソッド名(static)の形式を指定します。
 *          戻り値と関数名の間にスペースを空けます。さらに、引数が複数ある場合、カンマで区切ります。その際にスペースは空けないようにします。
 */
elProc.defineFunction("my", "sum", "my.MyFunction", "int sum(int,int)");

elProc.setVariable("num", 5);

// EL式の評価
int eval = elProc.eval("my:sum(num, 2)", int.class);

EL関数を使用する場合(TLDファイルから読み込む場合)

ver.0.2から追加された、TldLoderを使用します。

// TLDファイルの読み込み
TldLoader loader = new TldLoader();
Taglib taglib = loader.load(/** tldファイルのInputStream */);

ELProcessor elProc = new ELProcessor();

//EL関数の登録
final String prefix = taglib.getShortName();
for(Function function : taglib.getFunctions()) {

    final String className = function.getFunctionClass();
    final String signature = function.getFunctionSignature();
    final String name = function.getName();

    elProc.defineFunction(prefix, name, className, signature);
}

LocalELContextを直接呼ぶ場合

LocalELContext context = new LocalELContext();

// EL式内で利用するローカル変数の作成
ExpressionFactory expressionFactory = ExpressionFactory.newInstance();

ValueExpression var1 =  expressionFactory.createValueExpression(new Date(), Date.class);
context.setVariable("currentDate", var1);

ValueExpression varFormatter = expressionFactory.createValueExpression(new FormatterWrapper(Locale.getDefault()), FormatterWrapper.class);
context.setVariable("formatter", varFormatter);

// 式の評価
ValueExpression eval = expressionFactory.createValueExpression(context, "${formatter.format('%1$tY/%1$tm/%1$td%n', currentDate)}", String.class);
System.out.println(eval.getValue(context));

注意事項

EL式中で呼び出すオブジェクトの中のメソッドは、オーバライドしていると、区別つかないためラップなどして使用する。

'java.util.Formatter#formatter'は、FormatterWrapperクラスでラップして呼び出している。