2010-02-03 39 views
10

Tengo problemas con las funciones de JavaScript y EL (JSF 1.2, Facelets, Richfaces 3.3.0GA). Tengo una página que incluye otra composición:Cadenas de concatenación en JSF/JSP EL y Javascript

<ui:include src="/pages/panels/examinationPanel.xhtml"> 
<ui:param name="prefix" value="new" /> 

Y en mi ui:composition Quiero añadir el prefix a cada ID. Por ejemplo:

<rich:modalPanel id="#{prefix}_examinationPanel"> 

Eso funciona bien.

Pero el problema viene cuando quiero acceder a los componentes en funciones como oncomplete No puedo conseguir que concatene las cadenas correctamente. Por ejemplo

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

He tratado con fn:join también, pero no ejecuta la función, ya que 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 me preparo con corchetes o con # y soportes.

¿Qué estoy haciendo mal?

Y otra pregunta, en un comando condicional como

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

¿Cómo puedo "grupo" para poder ejecutar más acciones cuando es verdadero o falso? Por ejemplo algo como esto:

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

He intentado con paréntesis pero no lo analiza correctamente.

Gracias de antemano.

+0

Facelets or JSP? – Bozho

+0

Estoy usando facelets. Edité la publicación para agregar esa información, que de hecho es relevante – pakore

Respuesta

19

Asumiendo que están utilizando Facelets, he aquí una relativamente buena solución:

  • crear functions.taglib.xml en su WEB-INF
  • añadir un parámetro contexto que indica la ubicación:

    <context-param> 
        <param-name>facelets.LIBRARIES</param-name> 
        <param-value> 
         /WEB-INF/functions.taglib.xml 
        </param-value> 
    </context-param> 
    
  • En el xml puso lo siguiente:

    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE facelet-taglib PUBLIC 
        "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" 
        "https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd"> 
    <facelet-taglib xmlns="http://java.sun.com/JSF/Facelet"> 
        <namespace>http://yournamespace.com/fnc</namespace> 
        <function> 
         <function-name>concat</function-name> 
         <function-class>com.yourpackage.utils.Functions</function-class> 
         <function-signature> 
          java.lang.String concat(java.lang.String, java.lang.String) 
         </function-signature> 
        </function> 
    </facelet-taglib> 
    
  • en la página de utilizar lo siguiente:

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

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

Gracias por la respuesta, voy a intentarlo ahora mismo. Una pregunta, el final ";" para el param-value es intencional? Y el otro, ¿no es esto lo mismo que "fn: join" (que no funciona) – pakore

+0

hm, no. Lo copié de mis configuraciones, así que tampoco parece hacer daño. – Bozho

+0

Lo he intentado y funciona. Y además, he aprendido una lección sobre cómo crear tus propios espacios de nombres y funciones :). Gracias por la respuesta rápida y completa. – pakore

15

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

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

Tenga en cuenta que esto solo funciona en EL 2.2 o JBoss EL (para EL 2.1). OP no indicó que esté usando Servlet 3.0 ni JBoss Seam. – BalusC

+0

En ese caso, debería considerar agregar soporte EL 2.2, especialmente para la capacidad de pasar parámetros en llamadas a funciones. –

Cuestiones relacionadas