Hedgehog Note

日々の開発メモです。

Faceletsを書く時のEL式まとめ

Faceletsを書く時の自分用のEL式まとめです。
EL3.0を対象にしています。

評価式

  • #{}

エスケープする場合は#の前に\をつける。#{#{}}のネスト不可。

リテラル

  • #{true}
  • #{false}
  • #{100}
  • #{100.1}
  • #{‘abc’}
  • #{“abc”}
  • #{null}

文字列内で囲い文字と同じ引用符を使う場合は\でエスケープ。
\は\でエスケープ。

[]演算子と.演算子

  • #{bean.property}
  • #{array[index]}
  • #{map.key}
  • #{map[‘key’]}

一番上の書式はgetter/setter経由で操作される。
getterはis~メソッドがある場合はそちらが呼ばれる。

算術演算子

  • #{x + y}
  • #{x - y}
  • #{x * y}
  • #{x / y}
  • #{x div y}
  • #{x % y}
  • #{x mod y}
  • #{-x}

文字列連結演算子

  • #{x += y}

文字列の連結はこれを使う。
算術演算子の+は使えない。

関係演算子

  • #{x == y}
  • #{x != y}
  • #{x < y}
  • #{x > y}
  • #{x <= y}
  • #{x >= y}
  • #{x eq y}
  • #{x ne y}
  • #{x lt y}
  • #{x gt y}
  • #{x le y}
  • #{x ge y}

‘<’, ‘<='は素で書くと事故る。

論理演算子

  • #{x == y && z == w}
  • #{x == y || z == w}
  • #{x == y and z == w}
  • #{x == y or z == w}
  • #{!x}
  • #{not x}

‘&&'は素で書くと事故る。

Empty演算子

  • #{empty x}

null、空文字、空配列、空マップ、空コレクションの場合にtrue。

三項演算子

  • #{x == y ? a : b}

代入演算子

  • #{x = y}

ページスコープの属性xにyを代入する。
xが存在しない場合はxを作成する。

セミコロン演算子

  • #{x = 100; y = 200; x + y}

C言語のカンマ演算子と同様。

予約語

  • and, or, not
  • eq, ne, lt, gt, le, ge
  • true, false
  • null
  • instanceof
  • empty
  • div, mod

ラムダ式

  • #{x -> x +1}
  • #{(x, y) -> x + y}
  • #{() -> 64}
  • #{(x, y)(3, 4)} : 結果7
  • #{v = (x, y) -> x + y; v(3, 4)} : 結果7
  • #{fact = n -> n == 0 ? 1 : n * fact(n-1); fact(5)} : 結果120

上記はEL3.0の仕様書に載っていたサンプル。

Enum

  • #{bean.enumProperty == ‘ENUM_VALUE’}

Enum.valueOf(EnumProperty.class, ‘ENUM_VALUE’)で評価する。

静的フィールドと静的メソッドの参照

  • #{Boolean.TRUE}
  • #{MyBean.CONST_VALUE}

java.lang.*配下は何もせずに使える。
他のパッケージは手動でインポートが必要。

が、自分の環境では色々試しても参照できない。なぜだ。

コレクション

  • #{{1, 2, 3}}
  • #{[1, 2, 3]}
  • #{{‘one’:1, ‘two’:2, ‘three’:3}}

上から順にセット、リスト、マップを定義。

ストリーム

  • #{[‘a’, ‘c’, ‘x’, ‘b’].stream().sorted().toList()} : 結果[a, b, c, x]
  • #{[‘a’, ‘bb’, ‘c’, ‘dd’].stream().filter(s->s.length() == 1).toList()} : 結果[a, c]

かなり色々できるが、使い所が難しい。