2010-02-03 10 views
10

Ich habe Probleme mit EL und Javascript-Funktionen (JSF 1.2, Facelets, Richfaces 3.3.0GA). Ich habe eine Seite, die eine andere Zusammensetzung enthält:Verketten Strings in JSF/JSP EL und Javascript

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

Und in meinem ui:composition möchte ich die prefix jedem ID anhängen. Zum Beispiel:

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

Das funktioniert ok.

Aber das Problem kommt, wenn ich auf die Komponenten in Funktionen wie oncomplete zugreifen möchte, kann ich es nicht erhalten, um die Zeichenfolgen richtig zu verketten. Zum Beispiel

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

Ich habe auch mit fn:join versucht, aber es hat nicht die Funktion ausführen, weil es Fehler beklagt, wenn es Zeichen „#“ findet. Zum Beispiel:

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

wirft

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

Verschiedene Fehler, wenn ich es mit Klammern oder mit # und Klammern stemmen.

Was mache ich falsch?

Und eine weitere Frage, in einem bedingten Befehl wie

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

Wie kann ich „Gruppe“ in der Lage sein, weitere Aktionen auszuführen, wenn wahr oder falsch? Beispiel:

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

Ich habe mit Klammern versucht, aber es nicht richtig analysieren.

Vielen Dank im Voraus.

+0

Facelets oder JSP? – Bozho

+0

Ich benutze Facelets. Ich habe den Beitrag bearbeitet, um diese Information hinzuzufügen, die in der Tat relevant ist – pakore

Antwort

19

Sie Angenommen verwenden Facelets, ist hier eine relativ gute Lösung:

  • erstellen functions.taglib.xml in Ihrem WEB-INF
  • einen Kontext param hinzufügen, die den Ort:

    <context-param> 
        <param-name>facelets.LIBRARIES</param-name> 
        <param-value> 
         /WEB-INF/functions.taglib.xml 
        </param-value> 
    </context-param> 
    
  • In das xml setzte folgendes:

    <?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> 
    
  • in der Seite verwenden Sie die folgenden:

    xmlns:fnc="http://yournamespace.com/fnc" 
    .... 
    oncomplete="#{rich:component(fnc:concat(prefix, '_examinationPanel'))}.show();" 
    
  • schließlich in der Function Klasse definiert die einfache Methode:

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

Danke für die Antwort, ich werde es jetzt versuchen. Eine Frage, die nachstehende ";" für den param-Wert ist beabsichtigt? Und das andere, ist das nicht das gleiche wie "fn: join" (was nicht funktioniert) – pakore

+0

hm, nein. Ich habe es von meinen Konfigurationen kopiert, also scheint es auch nicht zu schaden. – Bozho

+0

Ich habe es versucht und es funktioniert. Und außerdem habe ich eine Lektion über das Erstellen eigener Namespaces und Funktionen gelernt :). Danke für die schnelle und vollständige Antwort. – pakore

15

eine einfachere Lösung ist es, den String in der Verwaltung EL wie ein Objekt und verwenden Sie die Methode concat aus der Klasse String, etwa so:

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

Beachten Sie, dass dies nur in EL 2.2 oder JBoss EL (für EL 2.1) funktioniert. OP hat nicht angegeben, dass er Servlet 3.0 oder JBoss Seam verwendet. – BalusC

+0

In diesem Fall sollte er die Unterstützung von EL 2.2 in Betracht ziehen, insbesondere für die Fähigkeit, Parameter in Funktionsaufrufen zu übergeben. –