1

内部に別のオブジェクト (ObjectB) を持つオブジェクト (ObjectA) があります。オブジェクト Bの中に がありますGuava TreeBasedTable。このテーブルには、行キー、列キーとして文字列があり、値として別のオブジェクト "ObjectC" があります。<s:iterator/>このテーブルはおよびタグを使用して JSP に表示され、<s:textfield/>正しく表示されています ( 内の「値」<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 コンソールから取得されたものです。

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ています...そのうちの1つが間違っています。すべての表記が、正しい変数名を指していることを確認してください。

PPS:あなたの要件はわかりませんが、この構造は私には少し「過剰に設計されている」ように見えます...それは間違いなくKISS paradigm:)を尊重していません

于 2013-02-20T10:51:58.277 に答える