1

有一个对象(ObjectA),其中有另一个对象(ObjectB)。对象B里面有一个Guava TreeBasedTable。这个表有一个字符串作为行键,列键和另一个对象“ObjectC”作为值。该表已使用<s:iterator/>and<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>

A TreeBasedTableinGuava类似于地图中的地图,我尝试过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 控制台获取的。

4

1 回答 1

0

正如我在您的另一个问题中告诉您的那样,我从未使用过Guava TreeBasedTable;

但是,根据官方番石榴文档

TreeBasedTable, 哪个is essentially backed by a TreeMap<R, TreeMap<C, V>>

get方法是_

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:当心打字错误...您正在使用allPlainFieldsallPFields一起...其中一个是错误的,请确保所有符号都指向正确的变量名。

PPS:我不知道你的要求,但这个结构对我来说似乎有点“过度设计”......它绝对不尊重KISS paradigm:)

于 2013-02-20T10:51:58.277 回答