반응형
JSFのEL(Expression Language)表現でAND条件を使用する際の注意点について説明します。
1. エラーの原因
2. 解決方法
3. JSFのEL表現とJSPのEL表現の違う点

 

以下のようなJSFのEL式を利用して開発を行っていた際、次のような条件を指定したところエラー(The entity name must immediately follow the '&' in the entity reference.)が発生しました。

 

#{(NewState() && AA.size() == 0) ? false : true}

 

今では理由が分かっているのですぐに修正できますが、最初にエラーが発生した時は原因を見つけるのにかなり時間がかかったと記憶しています。

 


JSF(Java Server Faces)は包括的なアプリケーション開発フレームワークであり、多くの要素を含んでいます。

その中には、ビューやコンポーネントツリーの構築に使われるJSF用のビュー・ハンドラーであるFaceletsも含まれており、FaceletsはXMLベースのビュー技術です。

問題は、FaceletsがEL式の使用をサポートする役割も担っているものの、XMLベースの技術であるため、XMLの文法の影響を受けてしまうという点です。

私はJSPのEL式を思い出して何気なく「&&」をAND条件として使いましたが、「&」記号はXML文法でエンティティ指定子として使われる予約文字であったため、使用した際にエラーが発生したのです。

 

※参考までに、JSPを基本のビュー宣言言語として使用していたJSF 1.1およびJSF 1.2では、Faceletsは別のビュー宣言言語として使われていましたが、JSF 2.0以降はFaceletsが基本のビュー宣言言語に昇格し、JSPはもはや使用されなくなりました。

 

 


&」記号を表すHTMLの特殊コード「&」を使用するか、または別のEL式である「and」という文字を使います。

 

#{(NewState() && AA.size() == 0) ? false : true}
#{(NewState() and AA.size() == 0) ? false : true}

 

 

OR条件を使用する場合は、従来のJSPのEL式と同様に「||」記号と「or」という文字の両方が使用可能です。

 

 


JSFのELはJSP 2.0に含まれているELを基盤としていますが、以下のような違いがあります。

  • JSFのEL式は、開始時に「$」ではなく「#」で始まります。
  • JSFのEL式は双方向で使用できます。つまり、特定の値を取得することもできますし、更新することもできます。
  • JSFのEL式はメソッドを参照することにも使えます。
  • JSFのEL式は、一般的なJavaコードの評価にも使用できます。
  • JSFのEL式では、JSPのEL関数は公式にはサポートされていません。

 

参照リンク
How to use && in EL boolean expressions in Facelets?
https://stackoverflow.com/questions/8552901/how-to-use-in-el-boolean-expressions-in-facelets
Facelets

https://en.wikipedia.org/wiki/Facelets

原文はこちら JSF의 EL 표현식 에러 (The entity name must immediately follow the '&' in the entity reference.) 해결법


記事の内容に誤りがあったり、追加したい内容がありましたら、コメントでお知らせください。学習の助けになります。
-- 記憶の有効期限は思ったより短い。--
반응형