web-dev-qa-db-ja.com

ELの直接メソッドまたは引数/変数/パラメータを持つメソッドを呼び出す

JSF 2.0では、ELの直接メソッドまたは引数/変数/パラメータを持つメソッドをどのように呼び出すことができますか?

たとえば、ELでリストのサイズを取得します。

<h:outputText value="#{bean.list.size()}" />

または、引数を使用してアクションメソッドを呼び出す:

<h:commandButton value="edit" action="#{bean.edit(item)}" />

これは私の環境では動作しないようです。括弧が好きではないようです。

javax.el.E​​LException:解析エラー:#{bean.list.size()}
com.Sun.el.parser.ParseException: "("が発生しました

26
DD.

EL 2.2より前の標準ELでは、Java EE 6 からのメソッドを直接呼び出すことはできません。
#{bean.method()}も、#{bean.method(arg1, arg2)のような引数を持つメソッドを呼び出しません。

EL 2.2/Javaにアップグレードする場合、EE 6準拠のコンテナー(Tomcat 7、Glassfish 3、JBoss AS 6など)がオプションではなく、現在EL 2.1/Javaを使用している場合_ EE 5(Tomcat 6、Glassfish 2、JBoss AS 4など)の場合、最善の策は JBoss EL をインストールすることです。 JBoss ELはEL 2.1準拠の実装であり、EL 2.2と同じ機能をサポートします。 JBoss ELのインストールは、 _jboss-el.jar_ を_/WEB-INF/lib_に入れ、以下を_web.xml_に追加することです。モハラ:

_<context-param>     
    <param-name>com.Sun.faces.expressionFactory</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>   
</context-param>
_

または、MyFacesを使用している場合:

_<context-param>     
    <param-name>org.Apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>   
</context-param>
_

あなたの特定のケースの代替は、JSTLの _fn:length_ を使用することです:

_<h:outputText value="#{fn:length(bean.list)}" />
_

もう1つの方法は、List#size()を返すゲッターをBeanに追加するか、特定のケースでは カスタムEL関数 を追加することです。


したがって、ELで引数を使用してメソッドを呼び出すことは、JSF 2.0固有の機能ではないことに注意してください。これはEL 2.2固有の機能です。 EL 2.2はJava EE 6の一部であり、JSF 2.0もその一部です。つまり、JSF 2.0固有の機能のように見えますが、そうではありません。 JSF 2.0は、この機能のないServlet 2.5/EL 2.1と下位互換性があります。一方、JSF 1.xはServlet 3.0/EL 2.2との上位互換性があるため、JSF 1.xでこの機能を使用することもできます。さらに、Servlet 2.5/EL 2.1でJBoss ELを使用することもできます。

54
BalusC

BalusCの答えは正しいですが、mavenを使用する場合は、次のようなel-api 1.0推移的依存関係を除外する必要があります。

<dependency>
    <groupId>org.jboss.seam</groupId>
    <artifactId>jboss-el</artifactId>
    <version>2.0.0.GA</version>
    <!-- exclude el-api 1.0 transitive dependency -->
    <exclusions>
        <exclusion>
            <groupId>javax.el</groupId>
            <artifactId>el-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
1
Hrotkó Gábor