webentwicklung-frage-antwort-db.com.de

Rufen Sie in EL direkte Methoden oder Methoden mit Argumenten/Variablen/Parametern auf

Wie kann ich in JSF 2.0 direkte Methoden oder Methoden mit Argumenten/Variablen/Parametern in EL aufrufen?

Beispiel: Abrufen der Listengröße in EL:

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

Oder eine Aktionsmethode mit Argumenten aufrufen:

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

Dies scheint in meiner Umgebung nicht zu funktionieren. Klammern scheint es nicht zu mögen.

javax.el.ELException: Fehler beim Parsen: # {bean.list.size ()}
com.Sun.el.parser.ParseException: Encountered "("

23
DD.

In Standard-EL vor EL 2.2 von Java EE 6 können Sie Methoden wie nicht direkt aufrufen
#{bean.method()} noch Methoden mit Argumenten wie #{bean.method(arg1, arg2) aufrufen.

Wenn ein Upgrade auf einen EL 2.2/Java EE 6-kompatiblen Container (Tomcat 7, Glassfish 3, JBoss AS 6 usw.) nicht möglich ist und Sie derzeit EL 2.1/Java EE 5 (Tomcat 6, Glassfish 2, JBoss AS) verwenden 4, etc), dann ist Ihre beste Wette die Installation von JBoss EL . JBoss EL ist eine EL 2.1-kompatible Implementierung, die dieselben Funktionen wie EL 2.2 unterstützt. Bei der Installation von JBoss EL müssen Sie den jboss-el.jar in den /WEB-INF/lib einfügen und dem web.xml Folgendes hinzufügen, vorausgesetzt, Sie verwenden Mojarra:

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

Oder wenn Sie MyFaces verwenden:

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

Eine Alternative für Ihren speziellen Fall ist die Verwendung von JSTLs fn:length :

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

Eine andere Alternative besteht darin, der Bean einen Getter hinzuzufügen, der List#size() oder in bestimmten Fällen eine benutzerdefinierte EL-Funktion zurückgibt.


Beachten Sie daher, dass das Aufrufen von Methoden mit Argumenten in EL keine JSF 2.0-spezifische Funktion ist. Es ist eine EL 2.2-spezifische Funktion. EL 2.2 ist Teil von Java EE 6, zu dem auch JSF 2.0 gehört. Es ist also sieht aus wie eine JSF 2.0-spezifische Funktion, ist es aber nicht. JSF 2.0 ist abwärtskompatibel mit Servlet 2.5/EL 2.1, dem diese Funktion fehlt. Auf der anderen Seite ist JSF 1.x abwärtskompatibel mit Servlet 3.0/EL 2.2, so dass es auch möglich wäre, diese Funktion in JSF 1.x zu verwenden, und auch JBoss EL auf Servlet 2.5/EL 2.1.

53
BalusC

Die Antwort von BalusC ist richtig. Wenn Sie jedoch maven verwenden, sollten Sie die transitive Abhängigkeit von el-api 1.0 wie folgt ausschließen:

<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