Struts2: Aktualisieren der Werte einer "Liste von Objekten" in einer Karte
Es gibt ein ObjektObjectA
die hat eine Liste vonObjectB
. Da ist einTreeMap
in derObjectB
. DieseTreeMap
hat einString
als Schlüssel und aList
eines anderen ObjektsObjectC
als Wert. DieseTreeMap
und daslist
innen wurde auf dem angezeigtjsp
Verwendung ders:iterator
unds:textfield
und es wird korrekt angezeigt. d.h. die "Werte" innerhalb des s: -Textfelds sind korrekt. Jetzt tritt das Problem auf, wenn das Textfeld geändert wird. Wie erfassen wir die geänderten Werte in ObjectC in der Aktionsklasse? Mit dem hier angegebenen Code kommt der Schlüssel ("Key1") in die Aktion, aber der Wert ist null.
Java-Code
public class ObjectA implements Serializable {
private Integer attr1;
private List<ObjectB> objB;
//...getters and setters....
public class ObjectB implements Serializable {
private Integer attr11;
private TreeMap<String,List<ObjectC>> allPlainFields;
// ...getters and setters....
public class ObjectC implements Serializable {
private Integer attr111;
public String attr112;
// ...getters and setters....
JSP-Code
<s:iterator value="objA.objB" var="currentObjB" status="currentGroupStatus">
<s:iterator value="#currentObjB.allPlainFields" var="parentMap" status="headerStatus">
<s:iterator value="#parentMap.value" var="fieldList" status="fieldStatus">
<s:textfield name="objA.objB[%{#currentGroupStatus.index}].allPlainFields['%{#parentMap.key}'][%{#fieldStatus.index}].attr112"/>
</s:iterator>
</s:iterator>
HTML gerendert: <input type="text" id="review-act1_objA_objB_0__allPlainFields_'Key1'__6__attr112" value="Correct Value" name="objA.objB[0].allPlainFields['Key1'][0].attr112">
Die Objektstruktur in der Ansicht "VAriables" von Eclipse zeigt:
objA Object A (id=955)
objB ArrayList<E> (id=966)
elementData Object[10] (id=967)
[0] ObjectB (id=968)
allPlainFields TreeMap<K,V> (id=972)
comparator null
descendingMap null
entrySet TreeMap$EntrySet (id=979)
keySet null
modCount 1
navigableKeySet null
root TreeMap$Entry<K,V> (id=980)
size 1
values null
[1] ObjectB (id=969)
[2] ObjectB (id=970)
[3] ObjectB (id=971)
[4] null
[5] null
[6] null
[7] null
[8] null
[9] null
modCount 4
size 4
**** In der Eclipse-Ansicht "Variablen" ist der Wert für allPlainFields **: ** {Key1 =}
BEARBEITEN (27.02.2013):
Versuchte dies aber hat nicht funktioniert. Die Werte erscheinen auf jsp, aber wenn sie übermittelt werden, werden sie nicht wirksam:
ImAction
Klasse:
private TreeMap<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>();
//get,set and setting two keys in map "mykey1" and "mykey2"
ImObjectCList
Klasse:
private ArrayList<ObjectC> paramMdlList;
//default constructor, get, set
ImJSP
:
<s:form id="test-map" method="post">
<s:iterator value="testTreeMap" var="pMap" status="hStatus">
<li><label><s:property value="%{#pMap.key}" /></label>
<s:iterator value="%{#pMap.value.paramMdlList}" var="pList" status="innerStatus">
<s:textfield name="testTreeMap['%{#pMap.key}'].paramMdlList[%{#innerStatus.index}].attr111"/>
<s:textfield name="testTreeMap['%{#pMap.key}'].paramMdlList[%{#innerStatus.index}].attr112"/>
</s:iterator>
</li>
</s:iterator>
<s:submit value=" " type='button' id="btnh1" action="saveTreeMap">
<span>Save TreeMap</span>
</s:submit>
</s:form>
Wenn das Formular gesendet wird,updateTreeMap
Methode deraction
wird genannt. Die Karte wird wie erwähnt gedrucktHier :
public String updateTreeMap(){
for (Map.Entry<String, ObjectCList> entry : testTreeMap.entrySet())
{
System.out.println(entry.getKey() + "/" + entry.getValue());
}
return SUCCESS;
}
Was ist "gedruckt": mykey1 / mykey2 / d.h.Nullwerte
Der folgende Bildschirm zeigt die Werte in jsp