Der Artikel von Mark Roden über den Mix von ${} und #{} zur gleichen Zeit brachte mich dazu, mich noch einmal ausführlich mit dem Thema „Compute Dynamically“ und „Compute on Page Load“ zu befassen, denn der hervorragende Artikel von Paul Withers erläutert zwar die grundsätzlichen Unterschiede zwischen den beiden Berechnungsvarianten, allerdings gibt es noch ein paar Ungereimtheiten.
Um einen Überblick über die Unterschiede bei der Verwendung aufzuzeigen, sind hier zehn Varianten aufgeführt, die in einigen Fällen interessante Ergebnisse liefern.
Zur Erläuterung:
- XSP Code ist der Code in der XPage
- Java Code ist ein Screenshot des generierten Java Codes
- Page Load ist ein Screenshot, wenn die Test-XPage geöffnet wird
- Partial Refresh ist ein Screenshot nach eine Refresh des Computed Fields
- Ergebnis stellt die Bewertung der Variante dar. Ob der Code wirklich mehrfach ausgeführt wurde, ist nicht geprüft worden, sondern nur das „sichtbare“ Ergebnis im Browser
Variante 1: Compute Dynamically
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[#{javascript:java.lang.System.currentTimeMillis()}]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Wird jedesmal neu berechnet.
Variante 2: Compute on Page Load
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[${javascript:java.lang.System.currentTimeMillis()}]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Berechnung nur bei Page Load.
Variante 3: Compute Dynamically inside Compute on Page Load
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[${javascript:#{javascript:java.lang.System.currentTimeMillis()}}]]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Berechnung nur bei Page Load.
Variante 4: Compute on Page load inside Compute Dynamically
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[#{javascript:${javascript:java.lang.System.currentTimeMillis()}}]]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Berechnung nur bei Page Load.
Variante 5: Compute Dynamically inside Compute on Page Load (Hochkomma)
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[${javascript:'#{javascript:java.lang.System.currentTimeMillis()}']]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Wird jedesmal neu berechnet.
Variante 6: Compute on Page Load inside Compute Dynamically (Hochkomma)
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[#{javascript:'${javascript:java.lang.System.currentTimeMillis()}']]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Berechnung des „inneren“ Codes findet nicht mehr statt.
Variante 7: Compute on Page Load inside Compute on Page Load (Hochkomma)
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[${javascript:'${javascript:java.lang.System.currentTimeMillis()}']]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Berechnung des „inneren“ Codes findet nicht statt.
Variante 8: Compute Dynamically inside Compute Dynamically (Hochkomma)
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[#{javascript:'#{javascript:java.lang.System.currentTimeMillis()}']]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Berechnung des „inneren“ Codes findet nicht statt.
Variante 9: Compute Dynamically inside Compute Dynamically (Hochkomma + Leerzeichen)
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[#{javascript:' #{javascript:java.lang.System.currentTimeMillis()} ']]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Berechnung des „inneren“ Codes findet nicht statt.
Variante 10: Compute on Page Load inside Compute on Page Load (Hochkomma)
XSP Code
<xp:text id="computedField1"> <xp:this.value> <![CDATA[${javascript:' ${javascript:java.lang.System.currentTimeMillis()} ']]> </xp:this.value> </xp:text>
Java Code
Page Load
Partial Refresh
Ergebnis
Berechnung des „inneren“ Codes findet immer statt.