Bei der Verwendung eines Output Scripts muss darauf geachtet werden, dass kein Code verwendet wird, der eine Zeichenfolge beinhaltet, die eine „Compute On Load„-ähnliche Syntax hat: Ein Bug sorgt dafür, das bei der Verwendung von ${} (mit oder ohne Inhalt) einiges durcheinander gerät, und der komplette SSJS-Code falsch verarbeitet wird.
So gibt folgender Code wie zu erwarten eine Messagebox mit der Id des Labels aus…
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:label value="Label" id="label1"></xp:label> <xp:scriptBlock id="scriptBlock1"> <xp:this.value> <![CDATA[ var id = '#{id:label1}'; alert( id ); ]]> </xp:this.value> </xp:scriptBlock> </xp:view>
… wird aber an irgendeiner Stelle im Script Block die genannte Kombination verwendet, gerät alles in Schieflage:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:label value="Label" id="label1"></xp:label>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value>
<![CDATA[
var id = '#{id:label1}';
var bug = '${id:label1}';
alert( "id: " + id + "\nbug: " + bug);
]]>
</xp:this.value>
</xp:scriptBlock>
</xp:view>
Die Variable id ist leer, und die Variable bug wird nicht verändert:
Es spielt keine Rolle an, welcher Stelle im Script Block die fehlerhafte Variante vorkommt, auch der Inhalt zwischen den eckigen Klammern ist unbedeutent: Ein auskommentierter Code über mehrer Zeilen hat die gleiche Auswirkung!
Varianten wie z.B.
//var bug = '${ // Kein Text! //}';
oder
var bug = ${X}
werfen keine Fehler, sondern generieren im besten Fall „nur“ fehlerhaften CSJS-Code.
Erst wenn keine Anführungszeichen verwendet werden und die EL-Syntax fehlerhaft ist, tritt ein Laufzeitfehler auf.
var bug = ${/EL}
Der Bug existiert in 8.5.2 als auch in 8.5.3. Andere Versionen können ebenfalls betroffen sein.
EDIT:
Die unteren beiden Beispiele OHNE Anführungsszeichen sind soweit JSF-konform. Details siehe hier.
Pingback: “It’s not a feature, it’s a bug!” | blog@hasselba.ch