Come creare una funzione EL personalizzata per richiamare un metodo statico?

Im new to JSF 2. La mia domanda è correlata alla risposta di BalusC a questa domanda jsf2 ajax update parts in base ai parametri della richiesta Ho provato il codice kickstart pubblicato da BalusC e ho riscontrato un errore di analisi EL:

/nameofpage.xhtml @12,64 rendered="#{bean.panels.contains('u1')}" Error Parsing: #{bean.panels.contains('u1')} 

Immagino che ciò sia causato dal fatto che non sto utilizzando un contenitore capace Servlet 3.0 / EL 2.2 con un /WEB-INF/web.xml dichiarato come per le specifiche Servlet 3.0. Sto usando Tomcat 6.

BalusC suggerì nella sua risposta di creare una funzione EL personalizzata. Ma come posso farlo usando una funzione EL personalizzata? Oppure può essere risolto semplicemente configurando alcune parti del mio progetto?

Di seguito è riportato il mio web.xml :

    Faces Servlet javax.faces.webapp.FacesServlet   Faces Servlet *.jsf   javax.faces.PROJECT_STAGE Development   index.jsp index.html   

    Prima crea una class final con un metodo public static che faccia esattamente il lavoro che desideri:

     package com.example; import java.util.Collection; public final class Functions { private Functions() { // Hide constructor. } public static boolean contains(Collection collection, Object item) { return collection.contains(item); } } 

    Quindi definiscilo come un facelet-taglib in /WEB-INF/functions.taglib.xml :

     < ?xml version="1.0" encoding="UTF-8"?>  http://example.com/functions  contains com.example.Functions boolean contains(java.util.Collection, java.lang.Object)   

    Quindi familarizzare Facelets con il nuovo taglib nel /WEB-INF/web.xml esistente:

      javax.faces.FACELETS_LIBRARIES /WEB-INF/functions.taglib.xml  

    (nota: se hai già definito javax.faces.FACELETS_LIBRARIES , puoi semplicemente aggiungere il nuovo punto e virgola separato)

    Quindi definirlo nel file XHTML Facelets come nuovo spazio dei nomi XML:

      

    Finalmente puoi usarlo come previsto:

     rendered="#{func:contains(bean.panels, 'u1')}" 

    Come alternativa completamente diversa, puoi includere anche JBoss EL nel tuo progetto. Funziona su Tomcat 6.0 e sarai in grado di invocare metodi non getter in EL. Trascina il file jboss-el.jar in /WEB-INF/lib e aggiungi quanto segue al tuo web.xml :

      com.sun.faces.expressionFactory org.jboss.el.ExpressionFactoryImpl  

    Dal momento che EL 2.2 ha un altro approccio: creare un bean @ApplicationScoped con metodi che a loro volta si riferiscono a quelle funzioni statiche. Vedi anche ao Metodi di utilità nel bean con scope dell’applicazione .