【问题标题】:Struts2 binding a map inside an object to an action attributeStruts2 将对象内部的映射绑定到动作属性
【发布时间】:2013-02-19 13:42:16
【问题描述】:

第 1 部分: 有一个对象 (ObjectA) 具有另一个对象 (ObjectB)。对象 B 中有一个 Hashmap。这个 hashmap 有一个字符串作为键,另一个对象“ObjectC”作为值。此哈希图已使用 s:iterator 和 s:textfield 显示在 jsp 上,并且显示正确。即 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 Map<String,ObjectC> myMap;
    // ...getters and setters....
public class ObjectC implements Serializable {
private Integer attr111;
public String attr112;
    // ...getters and setters....

jsp代码:

<s:iterator value="#objB.myMap" 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> 

【问题讨论】:

  • 通过提交表单?不确定问题是什么——您是说您在表单中使用了正确的符号但它不起作用?
  • @Dave jsp 代码已添加到问题中。该值正在正确显示,但是当将相同的表达式放在“名称”属性中时,当使用修改后的值提交表单时,该值不会出现在操作中
  • 名字就是名字;您需要在对象图之后为其命名:OGNL 所做的只是将表达式转换为调用。它无法知道fieldMap 实际上不是一个名为fieldMap 的属性。
  • 那么名字应该是objA.objB.myMap('%{#fieldMap.key}').attr112 吗?
  • 戴夫,感谢您对此进行调查。

标签: jsp struts2 ognl


【解决方案1】:

在您的情况下,objB 是一个 List 包含一个 HashMap,然后是一个 HashMap 用于 List 的每个元素。

objA
  |--- objB[0]
    |-- objC[A]
    |-- objC[B]
    |-- objC[C]
  |--- objB[1]
    |-- objC[X]
    |-- objC[Y]
    |-- objC[Z]
  |--- objB[n]
    |-- objC[N1]
    |-- objC[N2]
    |-- objC[N3]

然后您需要两个迭代器和以下OGNL 表示法,以引用具有name 属性的单个元素:

<s:iterator value="objA.objB" var="listRow" status="listStatus">
<!-- Iterating the List -->
    <s:iterator value="#listRow.myMap" var="mapRow" >
    <!-- Iterating the Map -->
        <li>
            <label>
                <s:property value="#mapRow.key"/>
            </label>
            <span>
                <s:textfield value="%{#mapRow.value.attr12}"  
                  name="objA.objB[#listStatus.index].myMap[#mapRow.key].attr112"
                />
            </span>
        </li>
    </s:iterator> 
</s:iterator> 

【讨论】:

  • Andrea,抱歉...IDE 对象结构和控制台输出已附加到原始问题中。最初我认为,一张地图就足够了,但看起来它必须是来自番石榴的 TreeBasedTable,这使得它更加复杂。你能看看吗?尽管 TreeBasedTable 是地图中的地图,但如果您希望我为此打开另一个问题,请告诉我。我试过做 mymap[#outerkey][#innerkey].attr112 但是没有用。
  • 嗯,不错 :D 我从来没有用过那些东西,但是如果你看看你如何在 Java 中访问你的对象,那么它是完全相同的(语法不同,但语义相同) 在 OGNL 中。我可以建议您从根级别的单个 TreeBasedTable 对象(objA 的兄弟)开始,只是为了测试您是否可以使用 OGNL 从 JSP 正确获取和返回其值;一旦实现了这一点,就开始深入研究具有所有复杂性的双/三迭代。希望有帮助
  • Andrea,对于我的地图问题,您的解决方案会奏效。我已经为番石榴表打开了另一个讨论。感谢您抽出时间来看看这个。 [链接]stackoverflow.com/q/14973381/2087216
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2021-04-30
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多