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 "("
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.
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>