struts 2 : Capturing modifications to a guava table (TreeBasedTable) in action

十年热恋 提交于 2019-12-11 09:00:27

问题


There is an object (ObjectA) which has another object inside (ObjectB). There is a Guava TreeBasedTable inside the Object B. This Table has a string as row-key,column-key and another object "ObjectC" as value. This table has been displayed on the jsp using the <s:iterator/> and <s:textfield/> tags and it is being displayed correctly (the "values" inside the <s:textfield/> are correct but the "names" are not).

Now, the problem arises when the <s:textfield/> is modified. How do we capture the modified values inside ObjectC in the action class?

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 code:

<!-- 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 TreeBasedTable in Guava is similar to a map inside a map, I tried doing allPFields[#outerkey][#innerkey].attr112 but, it didn't work.

The object structure when the screen is displayed with existing values in the database

<!-- 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

And the "allPFields" looks like the following in action:

{OuterKey1=
    {InnerKey1=ObjectC[attr111=31, attr112=Hi there], 
     InnerKey2=ObjectC[attr111=40, attr112=How are you]
    }
 }

The "allPFields" value above has been picked up from the IDE console.


回答1:


As I told you in your other question, I've never used Guava TreeBasedTable;

However, according to the Official Guava Documentation, a

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

and the get method is

V get(Object rowKey, Object columnKey)

Returns the value corresponding to the given row and column keys, or null if no such mapping exists.

In Java it would be:

Object value = objA.getObjB().get(listIndex).getAllPlainFields.get(rowKey, columnKey).getAttr112;
value = "new value";

Then in OGNL you could try something (totally untested) like:

<s:textfield value="%{#fieldMap.value.attr12}"
 name="objA.objB[#fieldStatus.index].allPlainFields.get(#rowKey, #fieldMap.Key).attr112"  />

P.S: BEWARE OF TYPO... you are using allPlainFields and allPFields together... one of them is wrong, make sure that all the notations point to the right variable name.

P.P.S: I don't know your requirements, but this structure seems a little "over-designed" to me... it definitely does not respect the KISS paradigm :)



来源:https://stackoverflow.com/questions/14973381/struts-2-capturing-modifications-to-a-guava-table-treebasedtable-in-action

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!