Category: RichFaces

geo-faces – JSF Komponentenbibliothek für interaktive Karten

Es gibt mal wieder etwas Neues aus dem Hause Google:(siehe Kommentare) geo-faces – eine JSF Komponentenbibliothek zum Erzeugen von interaktiven Karten mit OpenLayers.

Damit wird es sehr einfach unter Java serverbasiert Karten in JSF-Applikationen zu integrieren. Das ganze wurde unter Verwendung des RichFaces CDK implementiert und sieht in den ersten Demos schon sehr ordentlich aus.

Ausprobiert habe ich es noch nicht, vielleicht kann ich es in einem kommenden Projekt nutzen; dann werde ich auf jeden Fall hier wieder berichten.

[Update 18.12.09:] Sollte es speziell um Google Maps gehen, empfiehlt es sich vielleicht das GMaps4JSF Projekt in Betracht zu ziehen.

Share

RichFaces: Query preparation for form ’null‘ requested

Hatte heute ein kleines Problem mit meinen schönen Ajax-Knöpfchen in der JSF-/RichFaces Anwendung, die wir gerade entwickeln. Die Knöpfe (in meinem Fall so etwas in der Art: <a4j:commandLink […] ><h:graphicImage […] /></a4j:commandLink>) wollten einfach keine Wirkung zeigen – egal welches Rädchen ich drehte.

Also erst mal das A4J-Logging aktiviert:

<a4j:log popup="false" level="ALL" style="width: 800px; height: 300px;"/>

Und siehe da, schon erhält man eine Ausgabe, die ich nach kurzem Grübeln entschlüsseln konnte: Query preparation for form ’null‘ requested: Ja klar! Ich hatte doch tatsächlich die umschließenden form-Tags vergessen!

Also schnell die <h:form> und </h:form> drum herum und wieder bewahrheitet sich die alte Weisheit „Kaum macht man es richtig, schon geht es!“

Wo wir schon bei Weisheiten sind: Manchmal sieht man eben vor lauter Bäumen den Wald nicht mehr.

Share

JSF / RichFaces: Doppelklick auf Tabellenzeile

Hier wird ein kurzes Beispiel gezeigt, wie man auf einer JSF-Seite unter Verwendung von RichFaces bzw. Ajax4jsf auf einen Doppelklick in einer DataTable mit einer Action reagieren kann.

Die Tabelle listet Personen auf, beim Doppelklick auf eine Zeile soll eine Maske zur Bearbeitung der selektierten Person geöffnet werden. In diesem Fall wurde nicht die „normale“ DataTable verwendet, sondern die ExtendedDataTable. Sie sieht in etwa so aus:

datatable

Zuerst der Codeausschnitt der JSF-Seite:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<h:form id="personen">
    <rich:extendedDataTable value="#{personListBean.fullPersonList}"
        var="person" id="persontable" 
        width="886px" height="400px" sortMode="single" selectionMode="single" >
        <a4j:support event="onRowDblClick" action="#{PersonEditBean.prepareEdit}">
            <f:setPropertyActionListener value="#{person}"
                target="#{PersonEditBean.selectedPerson}" />
        </a4j:support>
        <rich:column sortable="true" sortBy="#{person.nachname}"
            filterBy="#{person.nachname}" filterEvent="onkeyup"
            width="170px" label="Nachname">
            <f:facet name="header">
                <h:outputText value="Nachname"/>
            </f:facet>
            <h:outputText value="#{person.nachname}"/>
        </rich:column> 
        <rich:column sortable="true" sortBy="#{person.vorname}">
        <!-- [...] -->
        <!-- [weitere Columns ...] -->
    </rich:extendedDataTable>
</h:form>

Der entscheidende Code:
In Zeile 3 wird über var=“person“ die Variable für die verknüpften Instanzen in den Zeilen angelegt.
Die Zeilen 5 bis 8 definieren das AJAX Doppelklick Event. Als Action wird im PersonEditBean die Methode prepareEdit() angegeben. Dort geschieht eigentlich nichts weiter als das Umkopieren der Werte. Damit überhaupt die richtige (also die doppelgeklickte) Person verwendet wird, ist der PropertyActionListener nötig (Zeile 6 und 7).

Bleibt noch zu klären, wie denn nun die Maske zum Editieren der Person zum Zuge kommt. Dies wurde hier einfach mit einer klassischen Navigation geregelt; hier der Ausschnitt aus der faces-config.xml:

1
2
3
4
5
6
7
8
9
<navigation-rule>
    <from-view-id>/[...]/personen.jsp</from-view-id>
    <navigation-case>
        <from-action>#{PersonEditBean.prepareEdit}</from-action>
        <from-outcome>prepare_erfolgreich</from-outcome>
        <to-view-id>/[...]/editperson.jsp</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

Die prepareEdit() Methode liefert als Ergebnis den String „prepare_erfolgreich“ und schon wird weitergeleitet. Immer? Eigentlich schon, lediglich der Internet Explorer will mal wieder nicht. Dagegen hilft aber Zeile 7 („<redirect/>“). Vielen Dank für diesen Hinweis aus Ralph’s Java Blog!

Share