【发布时间】:2013-02-21 16:06:31
【问题描述】:
有一个对象ObjectA 有一个ObjectB 列表。在ObjectB 中有一个TreeMap。这个TreeMap 有一个String 作为键和一个List 另一个对象ObjectC 作为值。这个TreeMap 和内部的list 已使用s:iterator 和s:textfield 显示在jsp 上,并且它正在正确显示。即 s:textfield 中的“值”是正确的。现在,修改文本字段时出现问题。我们如何在动作类的 ObjectC 中捕获修改后的值?使用此处给出的代码,键(“Key1”)进入操作,但值为 null。
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....
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:
<input type="text" id="review-act1_objA_objB_0__allPlainFields_'Key1'__6__attr112" value="Correct Value" name="objA.objB[0].allPlainFields['Key1'][0].attr112">
eclipse“变量”视图中的对象结构展示:
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
****在 Eclipse“变量”视图中,allPlainFields 的值为**:** {Key1=}
编辑(2013 年 2 月 27 日):
试过这个,但没有用。这些值出现在 jsp 上,但在提交时,它们不会起作用:
在Action 类中:
private TreeMap<String,ObjectCList> testTreeMap = new TreeMap<String,ObjectCList>();
//get,set and setting two keys in map "mykey1" and "mykey2"
在ObjectCList类中:
private ArrayList<ObjectC> paramMdlList;
//default constructor, get, set
在JSP:
<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>
提交表单时,会调用action 的updateTreeMap 方法。地图打印如上here:
public String updateTreeMap(){
for (Map.Entry<String, ObjectCList> entry : testTreeMap.entrySet())
{
System.out.println(entry.getKey() + "/" + entry.getValue());
}
return SUCCESS;
}
什么是“印刷”: 我的钥匙1/ 我的钥匙2/ 即空值
下面的屏幕显示来自 jsp 的值
【问题讨论】:
-
@Roman,另一个链接是列表中的地图。这个用于列表内的地图内的列表。从逻辑上讲,这应该以类似的方式工作,但令人惊讶的是它不是。
-
你收到第一个问题的答案了吗?每次更改结构时,我们都应该复制彼此的代码?为什么要多次问同一个问题。通过回答问题赚取声望,然后将其用于赏金。
-
@Roman,是的,我确实收到了第一个问题的答案,我也接受了。看起来里面的另一个级别的集合不起作用。它看起来像同一个问题,但事实并非如此。你之前有遇到过这样的问题吗?
-
我不明白,就我而言,我从来没有,从来没有使用过这样的表达方式,不必要的复杂性会导致错误和数月、数年的工作。
标签: java collections struts2 treemap ognl