Mit Struts über Beans aus der Session iterieren

Alvine

Grünschnabel
Hallo,

ich habe zur Zeit einen Knoten im Kopf. Ich beschreibe mal mein Problem:

Mein Ziel ist es eine dynamische Anzahl von Bildern in meiner jsp zu realisieren.
Die Bilder sollen als Raster dargestellt werden, also z.B. 50 Bilder in 5 Reihen zu je 10 Spalten.

Ich habe es als erstes mit zwei for-Schleifen realisiert, funktionierte auch alles prima. Nur, dass mein Chef es gerne mit Struts und <logic:iterate realisiert haben möchte, und da fangen meine Probleme an.
Usere vorgehensweise um Datenmengen (Daten in Tabellen) darzustellen ist folgende:

a) Die Daten werden aus der DB gelesen
b) pro Tabellenzeile entsteht eine Bean
c) alle Beans zusammen werden gesammelt Liste in der Session gespeichert.
d) mit Hilfe eines Datagrids wird über diese Bean-Liste iteriert und die Properties der Beans den Spalten zugeordnet.

Bis auf Schritt d) soll es diesmal genause umgesetz werden.
a) der Grundpfad der Bilder kommt aus der DB z.B. /user/bilder/
Die Namen der dort abgelegten Bilder unterleigen immer der selben Namensgebung, nämlich die einer matrix

a0b0 a1b0 a2b0 a3b0 ...
a0b1 a1b1 a2b1 a3b1...
...

b) eine Tabellenzeile ist eine Bean, bedeutet hier eine Bean enthält ein Array von Strings z.B. {a1b0, a2b0, a3b0}
c) alle Beans werden als Liste in die Session gespeichert.
Bis hierher funktioniert es auch schon.

d) die bilder sollen jetzt über zwei iteratoren realisiert werden.
Code:
<logic:iterate über alle Beans

<logic:iterate name="paths" id="var" type="java.lang.String">
<img src="<%=var%>">
<bean:write name="var"/>
</logic:iterate
</logic:iterate über alle Beans

Meine Bean ist folgendermaßen aufgebaut:

Code:
public class LocationTopBean {

    private ArrayList paths;

    public LocationTopBean(Locale locale) {
        // TODO Auto-generated constructor stub
    }
    public ArrayList getPaths() {
        return paths;
    }
    public void setPaths(ArrayList paths) {
        this.paths = paths;
    }
}

Und sagen wir das meine Sessionvariable, die Liste aller Beans, "session_LocationTopBean" heißt.

Wie iteriere ich jetzt über diese Beanliste und kann meine Bilder den richtigen Pfad zuordnen?

Vielen Dank jetzt schon mal.
 
Zuletzt bearbeitet:
Also wenn ich folgendes Versuche, dann bekomme ich die anschließende Fehlermeldung:

jsp-Code:
Code:
<logic:iterate name="${session_LocationTopBean}" id="bean" type="LocationTopBean">
	<logic:iterate name="bean.paths" id="var" type="java.lang.String">
   		<img src=<%=var%>">
   			<bean:write name="var"/>
    </logic:iterate>
</logic:iterate>

Fehlermeldung:
Cannot find bean de.dsaac.displaytag.grid.SortableGrid@1d77a8e in any scope

Zur Info: bean de.dsaac.displaytag.grid.SortableGrid@1d77a8e = ${session_LocationTopBean}

Kennt jemand die Aufrufstruktur bei einer Iteration über Beans?
 
also, ich habe mein Problem gelöst.
Falls es von Interesse ist hier meine Lösung:

Code:
<table>
  <logic:iterate name="session_LocationTopBean" id="bean" type="LocationTopBean">
	<tr>
	<logic:iterate name="bean" property="paths" id="var" type="java.lang.String">
   		<td>
   		<img src="<%=var%>" width="50px" height="50px">
   		</td>
    </logic:iterate>
    </tr>
 </logic:iterate>
</table>

Das äußere <logic:iterate iteriert über das Array in der Session mit dem Namen session_LocationTopBean. Gespeichert wird das aktuelle Element in der Variablen, die ich durch id="bean" definiert habe. Und der Elementtyp ist bei mir LocationTopBean.

Das innere <logic:iterate iteriert jetzt über mein Array "paths" (wirklicher Name des Arrays in meiner Bean) in meinem LocationTopBean Object namens "bean". Gespeichert wird der String in der Variablen "var", der den Typ String entspricht.
 
DIe Lösung die du jetzt präsentierst, hat allerdings nichts mit dem Problem aus dem Post davor zu tun. Da wurde die Bean(Liste) in keinem Scope gefunden. d.h. sie war weder im Request noch in der Session.

Eine große Frage die sich mir stellt ist, warum du das Zeug in die Session tust. Nach deinem Algorithmus oben zu urteilen sitzt du da auf einer tickenden Zeitbombe. Du liest Daten einer Tabelle in Beans ein und wirfst die in eine (userspezifische) Session. Das Explodiert also gleich in zwei Richtungen: einmal wenn die ANzahl der zu holenden Daten steigt, das andere Mal, wenn sich die Benutzeranzahl erhöht.

In die Session Schreiben ist bis auf sehr weinge Ausnahmen eigentlich immer evil. Meistens ist man mit sauberem Caching der Datenbank eindeutig besser dran.

Gruß
Ollie
 

Neue Beiträge

Zurück