¿Cómo crear una función EL personalizada para invocar un método estático?

Soy nuevo en JSF 2. Mi pregunta está relacionada con la respuesta de BalusC a esta pregunta jsf2 ajax partes de actualización basadas en parámetros de solicitud Probé el código kickstart BalusC publicado y me encontré con un error de análisis EL:

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

Supongo que esto se debe a que no estoy ejecutando un contenedor compatible con Servlet 3.0 / EL 2.2 con un /WEB-INF/web.xml declarado según la especificación de Servlet 3.0. Estoy usando Tomcat 6.

BalusC sugirió en su respuesta para crear una función EL personalizada. ¿Pero cómo logro esto usando una función EL personalizada? ¿O puede solucionarse esto simplemente configurando ciertas partes de mi proyecto?

Debajo está mi web.xml :

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

Primero crea una clase final con un método public static que hace exactamente el trabajo que deseas:

 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); } } 

Luego facelet-taglib como facelet-taglib en /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)   

Luego familarize Facelets con el nuevo taglib en el /WEB-INF/web.xml existente:

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

(nota: si ya tiene javax.faces.FACELETS_LIBRARIES , puede agregar el nuevo punto y coma separados)

Luego defínalo en el archivo XHTML de Facelets como nuevo espacio de nombres XML:

  

Finalmente puedes usarlo como se pretendía:

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

Como una alternativa completamente diferente, también puede incluir JBoss EL en su proyecto. Funciona en Tomcat 6.0 y podrá invocar métodos no buscadores en EL. Coloque el archivo jboss-el.jar en /WEB-INF/lib y agregue lo siguiente a su web.xml :

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

Desde EL 2.2 hay otro enfoque: crear un bean @ApplicationScoped con métodos que a su vez se refieran a esas funciones estáticas. Ver también ao Métodos de utilidad en bean con ámbito de la aplicación .