2010-07-19 9 views
20

Come posso JSF 2.0 invocare metodi diretti o metodi con argomenti/variabili/parametri in EL?Invoca metodi diretti o metodi con argomenti/variabili/parametri in EL

Per esempio, ottenere le dimensioni dell'elenco in EL:

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

O invocare un metodo di azione con argomenti:

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

Questo non sembra funzionare nel mio ambiente. Non sembra gradire le parentesi.

javax.el.ELException: errore di analisi: # {bean.list.size()}
com.sun.el.parser.ParseException: Incontrato "("

+0

duplicato? http: // StackOverflow.it/questions/206161/ –

risposta

51

In serie EL prima EL 2.2 from Java EE 6 non è possibile richiamare direttamente metodi come
#{bean.method()} né invocare metodi con argomenti come #{bean.method(arg1, arg2).

Se l'aggiornamento a un EL 2.2/Java EE 6 contenitore compliant (Tomcat 7, Glassfish 3, JBoss AS 6, ecc) è non un'opzione e al momento stai utilizzando EL 2.1/Java EE 5 (Tomcat 6, Glassfish 2, JBoss AS 4, ecc.), quindi la soluzione migliore è installare JBoss EL. JBoss EL è un'implementazione conforme a EL 2.1 che supporta le stesse funzionalità di EL 2.2. Installazione di JBoss EL è una questione di mettere il jboss-el.jar in /WEB-INF/lib e aggiungendo quanto segue alla web.xml, partendo dal presupposto che si sta utilizzando Mojarra:

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

Oppure, quando si sta utilizzando MyFaces:

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

un'alternativa per vostro caso particolare è quello di utilizzare di fn:length JSTL:

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

Un'altra alternativa è aggiungere un getter al bean che restituisce List#size() o in alcuni casi specifici uno custom EL function.


Si noti quindi che il richiamo di metodi con argomenti in EL non è una funzionalità specifica di JSF 2.0. È una caratteristica specifica di EL 2.2. EL 2.2 fa parte di Java EE 6, di cui fa parte anche JSF 2.0. Quindi lo ha l'aspetto di una caratteristica specifica di JSF 2.0, ma non lo è. JSF 2.0 è retrocompatibile con Servlet 2.5/EL 2.1 che non ha questa caratteristica. D'altra parte, JSF 1.x è compatibile con il Servlet 3.0/EL 2.2, quindi sarebbe anche possibile utilizzare questa funzione in JSF 1.x, utilizzando anche JBoss EL su Servlet 2.5/EL 2.1.

+0

E 'utilizzato per il metodo di valore di' ui: repeate' con una richiesta ajax? Fare riferimento a: http://stackoverflow.com/questions/12884049/does-not-uirepeat-work-when-ajax-request – CycDemo

0

Risposta da Arend molto buona, tranne parte sull'inserimento contesto-param per Mojarra: aggiungendo che a web.xml in realtà lo spezza su JBoss 7. Provare ad usare JBoss EL senza inserire nulla in web.xml. risposta

0

di BalusC è corretta, tuttavia, quando si utilizza Maven, è necessario escludere el-API 1.0 transitiva delle dipendenze in questo modo:

<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>