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

Map struts 2:捕获对guava表(TreeBasedTable)的修改,map,struts2,guava,ognl,Map,Struts2,Guava,Ognl,有一个对象(ObjectA),其中包含另一个对象(ObjectB)。对象B中有一个Guava TreeBasedTable。该表有一个字符串作为行键、列键和另一个对象“ObjectC”作为值。此表已使用和标记显示在jsp上,并且显示正确(中的“值”正确,但“名称”不正确) 现在,修改时会出现问题。我们如何在action类中捕获ObjectC中修改的值 公共类ObjectA实现可序列化{ 私有整数attr1; 私人名单; //…能手和二传手。。。。 公共类ObjectB实现了可序列化{ 私有整数1

有一个对象(ObjectA),其中包含另一个对象(ObjectB)。对象B中有一个
Guava TreeBasedTable
。该表有一个字符串作为行键、列键和另一个对象“ObjectC”作为值。此表已使用
标记显示在jsp上,并且显示正确(
中的“值”正确,但“名称”不正确)

现在,修改
时会出现问题。我们如何在action类中捕获ObjectC中修改的值

公共类ObjectA实现可序列化{
私有整数attr1;
私人名单;
//…能手和二传手。。。。
公共类ObjectB实现了可序列化{
私有整数11;
私有表所有字段;
//…能手和二传手。。。。
公共类ObjectC实现了可序列化{
私有整数111;
公共字符串属性112;
//…能手和二传手。。。。
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>
而“allPFields”看起来像是下面的动作:

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

上面的“allPFields”值是从IDE控制台中获取的。

正如我在你的另一个问题中告诉你的,我从来没有使用过
番石榴树表

然而,根据一份报告

TreeBasedTable
,它基本上由树映射支持

问题是

V get(对象行键、对象列键)

返回与给定行键和列键对应的值,如果不存在此类映射,则返回null

Java
中,它将是:

Object value = objA.getObjB().get(listIndex).getAllPlainFields.get(rowKey, columnKey).getAttr112;
value = "new value";
然后在
OGNL
中,您可以尝试一些(完全未经测试的)方法,如:


注意:注意输入错误…您同时使用的是
所有纯字段
所有字段
。其中一个字段是错误的,请确保所有符号都指向正确的变量名


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

尝试了这个,但没有成功:```……不知何故,我无法使用OGNL使方法工作。当我使用方法时,对象(ObjB)作为null发送。啊……您是否在Struts.xml中禁用了
动态方法调用
(如果是,请重新启用它)?您是否验证了
ObjectB
中的getter是否为
getAllPFields
getAllPlainFields
?是的,
动态方法调用
设置为false..我已启用它…现在让我检查一下。操作中的objB仍然为null..
呈现为
…使用
行(rowkey)[columnkey]进行了尝试
同样如此。下面的代码带来了一个非空的
objB
运行,但是
allPlainfields
仍然是
NULL
。代码:
objA.objB[%{{fieldStatus.index}]。allPlainfields['%{rowKey}]['%{{fieldMap.key}].attr112
…还有什么线索吗?我了解您的复杂性陈述…我们需要在屏幕上显示一个表(地图,地图),从而选择。。。。
Object value = objA.getObjB().get(listIndex).getAllPlainFields.get(rowKey, columnKey).getAttr112;
value = "new value";
<s:textfield value="%{#fieldMap.value.attr12}"
 name="objA.objB[#fieldStatus.index].allPlainFields.get(#rowKey, #fieldMap.Key).attr112"  />