ArrayList, JSTL - Verständnisproblem.

Status
Nicht offen für weitere Antworten.

Rumborak

Aktives Mitglied
Hallo zusammen,

ich hänge gerade an einem grundsätzlichen Problem zum Thema JSTL. Ich verwende Struts und möchte in einer JSP den Inhalt einer ArrayList ausgeben. Hierzu möchte ich gerne ein DynaActionForm benutzen.

Der entsprechende Code in der JSP:
Code:
<c:forEach var="item" items="${testForm.testList}">
[*]<c:out value="${item}" />
</c:forEach>
Definition in der struts-config.xml:
Code:
<form-bean name="testForm" type="org.apache.struts.action.DynaActionForm">
			<form-property name="testList" type="java.util.ArrayList" />
</form-bean>
In der Action steht folgender Code:
Code:
public class CreateProjectAction extends Action
{
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		// Bean fuer Formulareingaben:
		DynaBean testForm = (DynaBean) form;

		// Liste definieren:
		ArrayList testList = new ArrayList();
		testList.add("");

		// Daten in der Bean speichern:
		testForm.set("testList", testList);

		// Aufruf der Seite:
		return mapping.findForward("showTestForm");
	}
}
Beim Aufruf der Seite erscheint dann folgende Fehlermeldung:
Code:
Unable to find a value for "testList" in object of class "org.apache.struts.action.DynaActionForm" using operator "."
Wahrscheinlich ist das nur ein ganz dummer Fehler - ich komme nur nicht drauf. Wäre nett, wenn mir da jemand auf die Sprünge helfen könnte.....

Danke schonmal!

PS: Bei allen Beispielen im Netz, wird immer ein Key angegeben - meine ArrayList ist aber wie ein Array aufgebaut und enthält nur Elemente.
 

KSG9|sebastian

Top Contributor
Warum benutzt du JSLT ? Wenn du struts benutzt dann kannst du doch gleich die Struts-Tags benutzen, oder ?

logic:iterate dürfte das richtige für dich sein...
 

Rumborak

Aktives Mitglied
Ja, danke für die Antwort!

Das Ganze ist eigentlich für ein Formular gedacht, in dem ich Felder dynamisch hinzufügen und entfernen möchte. Also wenn der Benutzer auf den <Plus>-Button klickt, soll am Ende des Formulars eine Zeile angehängt werden. Beim Anklicken von <Minus> wird die letzte Zeile entfernt.

Jetzt kann es aber vorkommen, daß eine Zeile zwei Textfelder oder mehr enthält, z. B. [PLZ] - [Ortsname]. Dann müßte ich ja mehrere <logic:iterate />-Tags verschachteln, oder? Ich habe mir halt gedacht, das geht mit JSTL besser - außerdem interessiert´s mich grundsätzlich...
 

KSG9|sebastian

Top Contributor
uiui..ich hab mal eine Umfrage programmiert, dort hatte ich ein ähnliches Problem:

Anzahl der Felder und die Typen muss dynamisch sein
- recht easy zu machen
Inhalte der Felder müssen mit einem form-submit gespeichert werden
- besch****n zu machen

Ich hab das ganze so gelöst:

- XML Datei beschreibt die Form der Umfrage, z.B.

Code:
<umfrage>
  <name>Blah blub ?</name>
  <seite>
    <frage>Blah blub blubblub ?</frage>
    <textfeld/>
    <frage>auswahl blub ?</frage>
    <radio> 
      <auswahl>ja</auswahl>
      <auswahl>nein</auswahl>
    </radio>
  </seite>
</umfrage>

Das XML hab ich dann mit XSL noch ein bisschen modifiziert und dann in HTML ungewandelt.

Das was du vorhast ist ein bisschen ecklig, könntest du aber auch über ein XML lösen. Das anzeigen macht ein Servlet mit nem Xalan Transformer. Bei klick auf "+" wird der XML-Baum um ein Element erweitert, bei klick auf "-" eben verkürzt.
Und über das XML-Doc lässt du dann ein Stylesheet laufen welches XML in HTML wandelt.

Gruß
 

Rumborak

Aktives Mitglied
...irgendwie muß es doch möglich sein, mittels JSTL Expression-Language über eine ArrayList zu iterieren. Mit der Logic Taglibrary sieht mein Ansatz mal so aus:
Code:
<logic:iterate id="element" name="testBean" property="testList" indexId="counter" type="java.lang.String">
[*]<html:text name="testBean" property='<%="testList[" + counter + "]"%>' /> - <html:text name="testBean" property='<%="testList[" + counter + "]"%>' />
</logic:iterate>
...da gibt er halt zweimal das gleiche Feld aus - das mit der Vorbelegung nach dem Absenden klappt folglich natürlich nicht....

Ich bräuchte da wahrscheinlich zwei verschachtelte Schleifen, oder so. Hast jemand so ein Problem schonmal gehabt und kann mir einen Hinweis geben?
 

clemson

Bekanntes Mitglied
funktioniert das??
Code:
<logic:iterate id="element" name="testBean" property="testList" type="java.lang.String">
     <bean:write name="element" />
</logic:iterate>
 

Rumborak

Aktives Mitglied
Das funktioniert natürlich auch - danke für die Antwort!

Mein Problem ist aber vielmehr, wie mache ich das, wenn ich zwei Textfelder nebeneinander in einer Zeile ausgeben möchte - wie muß denn da die Collection aufgebaut sein und wie kann ich die dann auf der Seite ausgeben.....?

Die Werte in den jeweiligen Feldern sollen ja auch mit dem Feldnamen in der DynaBean gespeichert werden!
 

clemson

Bekanntes Mitglied
hab ich dich richtig verstanden? du willst hast eine collection mit mehreren feldern, und diese willst du jetzt auf deiner jsp (nebeneinander) anzeigen?

dann würd ich das irgendwie so lösen (ungetestet)...

Code:
<%
     int cols = 2; // anzahl der spalten nebeneinander
     boolean ende_zeile = false; // flag, welches angibt, ob eine zeile beendet werden soll
     boolean beginn_zeile = true; // flag, welcen angibt, ob eine neue zeile begonnen werden soll
%>
<logic:iterate id="element" name="testBean" property="testList" indexId="counter" type="java.lang.String">
     <%
          if (beginn_zeile) {
               beginn_zeile = false; // flag zurücksetzen
               %>
                    [*]
               <%
          }
     %>

          <html:text name="testBean" property='<%="testList[" + counter + "]"%>' />

     <%
          /**
          * eine zeile soll beendet werden, wenn die position des aktuellen elements,
          * dividiert durch die anzahl der gewünschten spalten, den restwert 0 besitzt (modulo).
          **/
          ende_zeile = ((counter+1) % cols) == 0; // berechnen, ob eine zeile beendet werden soll
          if (ende_zeile) {
               beginn_zeile = true; // bei beendigung einer zeile, soll beim nächsten durchlauf eine neue zeile begonnen werden
               %>
                    
               <%
          }
     %>     
</logic:iterate>
 

Rumborak

Aktives Mitglied
...Du würdest also quasi alles in einer ArrayList hintereinander abspeichern und die Anzahl der Elemente pro Zeile dann einfach in der Schleife abfragen. Wenn ich jetzt pro Zeile für jedes Feld jeweils ein Element in der Collection haben und dies über den Namen ansprechen will, muß ich dann eine HashMap nehmen? Also eine ArrayList mit n Elementen, wobei jedes Element wiederum eine HashMap ist..... wie kann man denn dann sowas in der JSP ausgeben?

Die Datenstruktur sähe so aus:
Code:
[0]["Feld1"]["Feld2"]
[1]["Feld1"]["Feld2"]
[2]["Feld1"]["Feld2"]
[3]["Feld1"]["Feld2"]
...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
0 Servlet mit ArrayList Allgemeines EE 3
D ArrayList behält Werte nicht Allgemeines EE 2
R ArrayList in JSP ausgeben Allgemeines EE 3
A Listen Ausgabe ohne forEach - JSTL Allgemeines EE 5
S JSTL foreach rückwärts? Allgemeines EE 2
Antoras JSTL Lib Versionschaos Allgemeines EE 2
S JSTL / Spring Webflow Frage Allgemeines EE 2
2 JSTL Tags für eine Bean? Allgemeines EE 4
T Hashtable value per JSTL auslesen Allgemeines EE 3
T logic:iterate durch JSTL ersetzen? Allgemeines EE 6
B JSTL Problem Allgemeines EE 8
byte JSTL EL und Enums Allgemeines EE 2
T Zu blöd für JSTL Allgemeines EE 6
M JSTL und Textausgabe mit Zeilenumbrüchen Allgemeines EE 9
T Geschachtelte JSTL-Tags Allgemeines EE 2
T JSP/JSTL kennt nur ID, soll Inhalte holen Allgemeines EE 3
M JSTL core-Tag if: Wie kann ich boolsche Variable auswerten? Allgemeines EE 3
M JSTL und JSF Allgemeines EE 2
P Value an JSTL mit EL übergeben. Allgemeines EE 2
S JSTL <c:choose>? Allgemeines EE 3
G JSTL Fehler Allgemeines EE 2
S Methoden in JSTL Allgemeines EE 2
E Eine Art Thread.sleep() in JSTL? Allgemeines EE 4
S JSTL Foreach Allgemeines EE 3
S JSTL c:out Allgemeines EE 2
S JSTL Foreach Allgemeines EE 2
J Buchempfehlung: Servlets, JSP, Struts, JSTL Allgemeines EE 3
G JSP & JSTL welche Taglib nochmal? Allgemeines EE 4
T JSTL + Struts (inkl.Hibernate) -> forEach Problem Allgemeines EE 6
R Tomcat4, JSTL und EL Allgemeines EE 2
J Problem mit sql:query [JSTL] Allgemeines EE 6
BuckRogers JMS ActiveMQ Verständnisproblem Allgemeines EE 6
S Verständnisproblem: WebSphere und HTTP Server Allgemeines EE 2

Ähnliche Java Themen

Neue Themen


Oben