2010-02-03 6 views
10

J'ai des problèmes avec les fonctions EL et javascript (JSF 1.2, Facelets, Richfaces 3.3.0GA). J'ai une page qui comprend une autre composition:Concaténer les chaînes en JSF/JSP EL et Javascript

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

Et dans mon ui:composition je veux ajouter le prefix à chaque id. Par exemple:

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

Cela fonctionne bien.

Mais le problème vient quand je veux accéder aux composants dans des fonctions telles que oncomplete Je ne peux pas l'obtenir pour concaténer les chaînes correctement. Par exemple

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

J'ai essayé avec fn:join aussi bien, mais il n'exécute pas la fonction, car il se plaint d'erreurs quand il trouve le caractère « # ». Par exemple:

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

lancers francs

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(#" 

erreurs différentes si je Brace avec crochets ou # et crochets.

Qu'est-ce que je fais mal?

Et une autre question, dans une commande conditionnelle comme

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

Comment puis-je « groupe » pour être en mesure d'exécuter plusieurs actions en vrai ou faux? Par exemple quelque chose comme ceci:

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

J'ai essayé avec des parenthèses mais ne l'analyse pas correctement.

Merci d'avance.

+0

Facelets ou JSP? – Bozho

+0

J'utilise des facelets. J'ai édité le post pour ajouter cette information, qui est en effet pertinente – pakore

Répondre

19

En supposant que vous utilisez Facelets, voici une solution relativement bonne:

  • créer functions.taglib.xml dans votre ajouter un param contexte WEB-INF
  • indiquant l'emplacement:

    <context-param> 
        <param-name>facelets.LIBRARIES</param-name> 
        <param-value> 
         /WEB-INF/functions.taglib.xml 
        </param-value> 
    </context-param> 
    
  • En le xml mettre le texte suivant:

    <?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> 
    
  • dans la page, utilisez les éléments suivants:

    xmlns:fnc="http://yournamespace.com/fnc" 
    .... 
    oncomplete="#{rich:component(fnc:concat(prefix, '_examinationPanel'))}.show();" 
    
  • enfin, dans la classe Function définir la méthode simple:

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

Merci pour la réponse, je vais l'essayer dès maintenant. Une question, le ";" car la valeur param est intentionnelle? Et l'autre, n'est-ce pas la même chose que "fn: join" (qui ne fonctionne pas) – pakore

+0

hm, no. Je l'ai copié à partir de mes configs, donc ça ne semble pas faire de mal non plus. – Bozho

+0

Je l'ai essayé et ça fonctionne. Et d'ailleurs, j'ai appris une leçon sur la création de vos propres espaces de noms et fonctions :). Merci pour la réponse rapide et complète. – pakore

15

une solution plus simple est de gérer la chaîne dans la EL comme un Object et utilise la méthode concat de la classe String, quelque chose comme ceci:

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

Notez que cela ne fonctionne que dans EL 2.2 ou JBoss EL (pour EL 2.1). OP n'a pas indiqué qu'il utilise Servlet 3.0 ni JBoss Seam. – BalusC

+0

Dans ce cas, il devrait envisager d'ajouter le support EL 2.2, en particulier pour la possibilité de transmettre des paramètres dans les appels de fonction. –

Questions connexes