Concatenar cadenas en JSF / JSP EL y Javascript

Estoy teniendo problemas con EL y las funciones de JavaScript (JSF 1.2, Facelets, Richfaces 3.3.0GA). Tengo una página que incluye otra composición:

  

Y en mi ui:composition , quiero agregar el prefix a cada identificación. Por ejemplo:

  

Eso funciona bien

Pero el problema surge cuando quiero acceder a los componentes en funciones como, oncomplete ejemplo, oncomplete estoy oncomplete no puedo obtenerlas para concatenar las cadenas de caracteres correctamente. Por ejemplo

 oncomplete="#{rich:component('#{prefix}_examinationPanel')}.show();" 

Lo he intentado con fn:join también pero no ejecuta la función porque se queja de errores cuando encuentra el carácter “#”. Por ejemplo:

  oncomplete="#{rich:component(fn:join(#{prefix},'examinationPanel'))}.show()" 

tiros

 SEVERE: Servlet.service() for servlet Faces Servlet threw exception org.apache.el.parser.ParseException: Encountered "fn:join( #" at line 1, column 33. Encountered "fn:join( #" 

Diferentes errores si lo corrijo con corchetes o con # y corchetes.

¿Qué estoy haciendo mal?

Y otra pregunta, en un comando condicional como

 oncomplete="#{a}?#{b}:#{c}" 

¿Cómo puedo “agrupar” para poder ejecutar más acciones cuando sea verdadero o falso? Por ejemplo algo como esto:

 oncomplete="#{a}?(#{b}#{f}):(#{c}#{d}#{e})" 

Lo he intentado con paréntesis pero no lo analiza correctamente.

Gracias por adelantado.

Suponiendo que está utilizando Facelets, aquí hay una solución relativamente buena:

  • crea functions.taglib.xml en tu WEB-INF
  • agregue un parámetro de contexto que indique la ubicación:

      facelets.LIBRARIES  /WEB-INF/functions.taglib.xml   
  • En el xml pon lo siguiente:

        http://yournamespace.com/fnc  concat com.yourpackage.utils.Functions  java.lang.String concat(java.lang.String, java.lang.String)    
  • en la página usa lo siguiente:

     xmlns:fnc="http://yournamespace.com/fnc" .... oncomplete="#{rich:component(fnc:concat(prefix, '_examinationPanel'))}.show();" 
  • finalmente, en la clase de Function define el método simple:

     public static String concat(String string1, String string2) { return string1.concat(string2); } 

una solución más simple es administrar el String en el EL como un Objeto y usar el método concat de la clase String, algo como esto:

 #{rich:component('constantString'.concat(variable))}.show();