Struts2将对象内的映射绑定到action属性

时间:2013-02-19 13:42:17

标签: jsp struts2 ognl

第1部分: 有一个对象(ObjectA)有另一个对象(ObjectB)。在对象B中有一个Hashmap。这个hashmap有一个字符串作为键,另一个对象“ObjectC”作为值。这个hashmap已经使用s:iterator和s:textfield显示在jsp上,并且正确显示。即,s:textfield中的“values”是正确的,但“name”不是。 现在,修改文本字段时出现问题。我们如何捕获动作类中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> 

1 个答案:

答案 0 :(得分:0)

在您的情况下, objB 是一个ListHashMapHashMapList的每一个元素。{/ {} p>

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>