有一个对象(ObjectA),其中有另一个对象(ObjectB)。对象B中有一个Guava TreeBasedTable
。该表有一个字符串作为行键,列键和另一个对象“ObjectC”作为值。此表已使用<s:iterator/>
和<s:textfield/>
标记显示在jsp上,并且正确显示(<s:textfield/>
内的“值”正确但“名称”不正确) 。
现在,修改<s:textfield/>
时会出现问题。我们如何在动作类中捕获ObjectC中的修改值?
public class ObjectA implements Serializable {
private Integer attr1;
private List<ObjectB> objB;
//...getters and setters....
public class ObjectB implements Serializable {
private Integer attr11;
private Table<String,String,ObjectC> allPFields;
// ...getters and setters....
public class ObjectC implements Serializable {
private Integer attr111;
public String attr112;
// ...getters and setters....
jsp代码:
<!-- language: lang-html -->
<s:iterator value="#objB.allPlainFields.row(#rowKey)" var="fieldMap"
status="fieldStatus">
<li><label><s:property value="#fieldMap.key" /></label><span>
<s:textfield name="<NOT SURE>" value="%{#fieldMap.value.attr12}" />
</span></li>
</s:iterator>
TreeBasedTable
中的Guava
类似于地图中的地图,我尝试allPFields[#outerkey][#innerkey].attr112
但是,它不起作用。
使用数据库中的现有值显示屏幕时的对象结构
<!-- language: lang-java -->
objA
objBList ArrayList<E> (id=668)
elementData Object[10] (id=7438)
[0] objB (id=7439)
allPFields TreeBasedTable<R,C,V> (id=7443)
backingMap TreeMap<K,V> (id=8116)
cellSet null
columnComparator NaturalOrdering (id=503)
columnKeySet null
columnMap null
factory TreeBasedTable$Factory<C,V> (id=8117)
rowKeySet null
rowKeySet StandardRowSortedTable$RowKeySortedSet (id=8118)
rowMap StandardRowSortedTable$RowSortedMap (id=8119)
rowMap null
values null
“allPFields”看起来像下面这样:
{OuterKey1=
{InnerKey1=ObjectC[attr111=31, attr112=Hi there],
InnerKey2=ObjectC[attr111=40, attr112=How are you]
}
}
上面的“allPFields”值已从IDE控制台中选取。
答案 0 :(得分:0)
正如我在你的另一个问题中告诉你的那样,我从未使用Guava TreeBasedTable
;
然而,根据Official Guava Documentation,
TreeBasedTable
,is essentially backed by a TreeMap<R, TreeMap<C, V>>
V get(Object rowKey, Object columnKey)
返回与给定行和列键对应的值,如果不存在此类映射,则返回null。
在Java
中,它将是:
Object value = objA.getObjB().get(listIndex).getAllPlainFields.get(rowKey, columnKey).getAttr112;
value = "new value";
然后在OGNL
你可以尝试一些(完全未经测试的),如:
<s:textfield value="%{#fieldMap.value.attr12}"
name="objA.objB[#fieldStatus.index].allPlainFields.get(#rowKey, #fieldMap.Key).attr112" />
PS:警告TYPO ...您正在使用allPlainFields
和allPFields
...其中一个是错误的,请确保所有符号都指向正确的变量名称。
KISS paradigm
:)