Archiv für den Monat: Oktober 2013

Damit f:ajax funktioniert

Der typische Einsatz des JSF-Tags <f:ajax> sieht ungefähr so aus:

<h:panelGrid columns="1">
    <h:inputText id="in" value="#{echo.text}">
        <f:ajax render="out" event="keyup" />
    </h:inputText>    
    <h:outputText id="out"
                  value="#{echo.upperCase}" />
</h:panelGrid>

Hier wird der eingegebene Text bei jedem Tastendruck per JavaScript an den Server geschickt. Als Antwort kommt dann der Text in Großbuchstaben zurück und wird, wieder mit JavaScript, an der entsprechenden Stelle (h:outputText) in die Webseite eingebaut. Kein Neuladen der ganzen Seite notwendig, alles gut. Es sei denn, es funktioniert nicht, und stattdessen kommt die Fehlermeldung

Eine oder mehrere Ressourcen haben das Ziel ‘head’, aber es wurde keine Komponente ‘head’ in der Ansicht definiert.

Woran liegt’s? Das benötigte JavaScript wird von JSF in den Header der Seite eingefügt, was dann beim Browser etwa so ankommt:

<script type="text/javascript" src="/Echo/javax.faces.resource/jsf.js.xhtml?ln=javax.faces"></script>

Der Punkt ist: Damit das auch tatsächlich passiert, also das <script>-Tag auch wirklich eingefügt wird, muß auch der Header eine JSF-Komponente sein. Also <head> reicht nicht, sondern es muß schon <h:head> sein. Denn nur letzteres kann als echte JSF-Komponente dafür sorgen, daß mehr an den Client geht als nur das reine head-auf und head-zu.