Struts2: Actualización de los valores de una "Lista de objetos" dentro de un mapa
Hay un objetoObjectA
que tiene una lista deObjectB
. Hay unTreeMap
dentro deObjectB
. EstaTreeMap
tiene unString
como llave y unList
de otro objetoObjectC
como valor. EstaTreeMap
y ellist
dentro se ha mostrado en eljsp
utilizando las:iterator
ys:textfield
y se está mostrando correctamente. es decir, los "valores" dentro del campo de texto s: son correctos. Ahora, el problema surge cuando se modifica el campo de texto. ¿Cómo capturamos los valores modificados dentro de ObjectC en la clase de acción? Con el código dado aquí, la clave ("Clave1") aparece en la acción pero el valor es nulo.
Código Java
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....
Código JSP
<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 renderizado: <input type="text" id="review-act1_objA_objB_0__allPlainFields_'Key1'__6__attr112" value="Correct Value" name="objA.objB[0].allPlainFields['Key1'][0].attr112">
La estructura del objeto en la vista "VAriables" de eclipse muestra:
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
**** En la vista "Variables" de Eclipse, el valor para allPlainFields es **: ** {Key1 =}
EDITAR (27-Feb-2013):
Intenté esto pero no funcionó. Los valores aparecen en jsp pero cuando se envían, no entran en acción:
EnAction
clase:
private TreeMap<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>();
//get,set and setting two keys in map "mykey1" and "mykey2"
EnObjectCList
clase:
private ArrayList<ObjectC> paramMdlList;
//default constructor, get, set
EnJSP
:
<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>
Cuando se envíe el formulario,updateTreeMap
método de laaction
se llama. El mapa se imprime como se mencionó.aquí :
public String updateTreeMap(){
for (Map.Entry<String, ObjectCList> entry : testTreeMap.entrySet())
{
System.out.println(entry.getKey() + "/" + entry.getValue());
}
return SUCCESS;
}
Lo que está "impreso": mykey1 / mykey2 / i.e.valores nulos
La siguiente pantalla muestra los valores que vienen en jsp