# GET in struts und JSF



## Sascha Laurent (11. Sep 2009)

Hallo Leute,

ich beschäftige mich gerade mit Struts und JSF, und bin dabei eine kleine Adressverwaltungs-Anwendung auf jeweils einmal auf JSF und einmal auf Struts aufzubauen. Hierzu habe ich zwei Seiten. Die erste Seite zeigt mit eine Liste aller Adressen an. Die zweite Seite soll mir zu jeder Adresse jeweils Details anzeigen. Hierzu habe ich jetzt aber eine grundlegende Frage, die ich noch nicht so ganz verstehe, und ich hoffe Ihr könnt einem Laien weiterhelfen.

Ich möchte jeder Adresse in der Adressliste die ID in der Datenbank als Link mitgeben. Also in der Form

http://localhost/myaddr/addrlist.jsp?id=12

Wie kann ich die ID ermitteln, um auf der Detailseite die korrekten Adressedetails anzuzeigen? Und gibt es evtl. elegantere Wege?

Danke
Sascha


----------



## JanHH (12. Sep 2009)

URLs in der Form bekommt man mit JSF eh nur mit Umwegen hin (aber es geht). Die ID kann man als Paramter übergeben (bei h:commandLink mit faram), und dann mit

```
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("<name>");
```
auslesen.

h:commandLink generiert allerdings nur Links, die genau wie Buttons funktionieren und per javascript das Form-Submit auslösen. Ist nicht unbedingt das, was man will. Ich habe dafür mal eine eigene JSF-Komponente, die einen "richtigen" Link erzeugt, programmiert. Dabei werden dann natürlich die meisten Phasen des JSF-lifecycle übersprungen, aber das macht auch nicht unbedingt was. Ist auch eine schöne Übung im Komponenten-schreiben..


----------



## Prismapanda (14. Sep 2009)

Dazu leg ich dir mal folgende Seite ans Herz:
The BalusC Code: Using datatables
Insbesondere die Sektion über getDataTable Row.

Sagen wir du hast eine Tabelle mit deinen Adresseinträgen. Die Tabelle bindest du an die BackingBean (HtmlDataTable table) und kannst dann in der BackingBean mittels (Adresse)table.getRowData() die Adresse herausfinden, auf welche in der Tabelle geklickt wurde und entsprechend anzeigen. Wie gesagt, die Seite erklärt die Mechanismen ganz gut.
Möglicherweise gibt es ab JSF 2.0 da auch andere Möglichkeiten, damit hab ich mich noch nicht auseinandergesetzt, aber die Möglichkeit übers Binding funktionierte bei mir bisher recht gut.


----------



## JavaFips (15. Sep 2009)

JanHH hat gesagt.:


> URLs in der Form bekommt man mit JSF eh nur mit Umwegen hin (aber es geht).




Nun sind Skript-Aufrufe mit irgendwelchen IDs in der URL-Extension ja gerade in der PHP-Welt Gang und Gäbe.

Wie sieht es denn da vom Konzept bei JSF aus? Man kann so eine URL zwar auch über .htaccess / mod_rewrite ein wenig verschönern und verschleiern, dass da eigentlich eine ID angehängt wird, aber deswegen kommt man ja bei dieser Art der Übertragung nicht drumrum, dass irgendein Code die ID verarbeiten müsste.

Wenn also nicht auf dem Weg, den _Prismapanda_ anstrebt, wie ist es denn dann in JSF eigentlich *vorgesehen*, on the fly Werte zu übermitteln?


----------



## JanHH (15. Sep 2009)

In JSF ist das übermitteln von irgendwas über URLs gar nicht vorgesehen, da es ausschliesslich auf POST und Form-Submit-Buttons basiert. Es gibt zwar auch h:commandLink, aber der erzeugte Link tut auch nichts anderes als eine javascript-Funktion aufzurufen, die den Form-Submit auslöst.

Ein Mangel an JSF ist das fehlen eines Front-Controllers, der die GET-Requests verarbeitet, bevor der JSF-lifecycle aufgerufen wird. Seam liefert das quasi nach. Man kann das aber einigermassen umgehen, indem man sich seine eigene JSF-Komponente für HREFs bastelt, und wie beschrieben auf die Parameter zugfreifen, und ggf. noch per PhaseListener sich in den JSF-Zyklus einklinkt.

Ich denke, da wird sich noch einiges tun in der Zukunft, bzw. das seam-Konzept wird standardisiert werden. Die Sache mit der selbstgeschriebenen URL-Komponente hat aber auch ihren Reiz, weil man dabei eine Menge über JSF lernen kann (sowohl über das Programmieren eigener Komponenten als auch, wie man intern wieder an die Werte rankommt, und wie der Lifecycle so aussieht).


----------



## JavaFips (15. Sep 2009)

Hat das schon jemand im Einsatz? :

PrettyFaces - SEO, Bookmarks, and Navigation for JSF / JSF2 (UrlRewrite) | OcpSoft


----------



## JanHH (19. Sep 2009)

Hab das jetzt mal mit seam gemacht, ist wirklich sehr einfach.

Im der xhtml-Datei den Link mit s:link erzeugen, da den Parameter mit faram einbauen:

```
<s:link  value="#{element.name}" view="/eineseite.xhtml">
   <f:param name="id" value="#{element.id}" />
</s:link>
```

Eine stateful EJB, mit der man auf den Parameter zugreifen kann:


```
@Name("eineBean")
@stateful
public class XYZ ...
{
   private long id;
```

und ein paar Zeilen in der pages.xml:


```
<page view-id="/eineseite.xhtml">
   <param name="id" value="#{eineBean.id}" />
</page>
```

Das ist schon alles.

Ich muss sagen, wenn man einmal mit seam gearbeitet hat und sieht, wie einfach und elegant alles quasi "wie von selber" funktioniert, will man nicht mehr ohne programmieren..


----------

