2013-02-20 54 views
1

存在一個對象(ObjectA),其中有另一個對象(ObjectB)。對象B中有一個Guava TreeBasedTable。此表具有一個字符串作爲行鍵,列鍵和另一個對象「ObjectC」作爲值。該表已使用<s:iterator/><s:textfield/>標籤在jsp上顯示,並且它正確顯示(<s:textfield/>中的「值」是正確的,但「名稱」不是)。struts 2:捕獲操作中的番石榴表(TreeBasedTable)的修改

現在,問題出現在<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> 

一個TreeBasedTableGuava類似於地圖的地圖裏面,我試圖做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

正如我在另一個問題中告訴你的,我從未使用Guava TreeBasedTable;

然而,根據Official Guava Documentation,一個

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

get method

V get(Object rowKey, Object columnKey)

返回值correspon ding給定的行和列鍵,如果不存在這樣的映射,則返回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 ...其中一個是錯誤的,請確保所有符號指向正確的值riable名字。

P.P.S:我不知道你的要求,但是這種結構似乎有點「過度設計」給我......它絕對不尊重KISS paradigm :)

+0

試過這個,但沒有工作:''....不知何故,我一直無法讓方法使用OGNL。在我使用方法的那一刻,對象(ObjB)被髮送爲空。 – Vickym 2013-02-20 11:16:36

+0

啊......你有沒有在Struts.xml中禁用「動態方法調用」(如果是的話,重新啓用它)?你是否驗證過ObjectB中的getter是getAllPFields還是getAllPlainFields? – 2013-02-20 11:22:34

+0

是的,'動態方法調用'被設置爲false ..我已經啓用它...讓我現在檢查。 – Vickym 2013-02-20 11:33:50