struts 2:捕获对guava表(TreeBasedTable)的修改

时间:2013-02-20 06:11:14

标签: map struts2 guava ognl

有一个对象(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控制台中选取。

1 个答案:

答案 0 :(得分:0)

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

然而,根据Official Guava Documentation

  

TreeBasedTableis essentially backed by a TreeMap<R, TreeMap<C, V>>

get method

  

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

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