如何传递Map <object,list <object =“”>&gt;在Struts 2中的行动</objecta,>

时间:2014-04-23 16:33:27

标签: jsp struts2 type-conversion ognl

我有一个事件对象,里面有Map<ObjectA, List<ObjectB>>ObjectA是标签,list<ObjectB>是表格行。使用以下代码,我可以正确显示表格,但是当我将表单提交到Action类时,事件中的地图为null

JSP代码:

<s:iterator value="event.planMap" var="map" >
    <h4>Plan Type: <s:property value='key' /></h4>
    <table id="plan">
    <s:iterator value="value" status="stat" var="detail" >
        <tr>
            <td><input type="text" id="name" name="event.planMap['%{#map.key}'][%{#stat.index}].name" value="<s:property value='name'/>"/></td>
            <td><input type="text" id="text" name="event.planMap['%{#map.key}'][%{#stat.index}].text" value="<s:property value='text'/>"/></td>
            <td><input type="text" id="contact" name="event.planMap['%{#map.key}'][%{#stat.index}].contact" value="<s:property value='contact'/>"/></td>
        </tr>
        </s:iterator>
    </table>
</s:iterator>

@Andrea&amp;罗马,所以我修改了代码。显示表是正确的,但我收到错误,它转到结果输入。如果我删除planMap,则操作会成功。所以至少我知道错误是planMap。修改后的代码是:

Event定义:

public Event {
    private Map<Object_A, Object_B> planMap;
    public Map<Object_A, Object_B> getPlanMap {
           return this.planMap;
    }

    public void setPlanMap(Map<Object_A, Object_B> planMap) {
           this.planMap = planMap;
    }
}

Object_B定义:

public Object_B {
    private List<Object_C> details;

    public List<Object_C> getDetials() {
           return this.details;
    }
    public void setDetails(List<Object_C> details) {
           this.details = details;
    }
}

JSP代码是:

<s:iterator value="event.planMap" status="mStat"  >
    <h4>Plan Type: <s:property value='key' /></h4>
    <table id="plan">
    <s:iterator value="value.details" status="stat">
    <tr>
        <td><input type="text" id="name" name="event.planMap['% {#mStat.index}'].details[%{#stat.index}].name" value="<s:property value='name'/>"/></td>
        <td><input type="text" id="text" name="event.planMap['%{#mStat.index}'].details[%{#stat.index}].text" value="<s:property value='text'/>"/></td>
        <td><input type="text" id="contact" name="event.planMap['%{#mStat.index}'].details[%{#stat.index}].contact" value="<s:property value='contact'/>"/></td>
    </tr>
    </s:iterator>
</table>
</s:iterator>

2 个答案:

答案 0 :(得分:1)

Struts可以访问操作bean的索引属性,例如ListMap等,但要求元素类应该是{Bean}之类的Java Bean,其中Map<ObjectA, ObjectC>包裹ObjectC

然后使用Struts type conversion填充索引属性,如此答案How to get updated list values from JSP in my action中所示。

  

通过该集合的属性索引集合

     

也可以通过获得集合的唯一元素   传递该元素的给定属性的值。默认情况下   集合元素的属性由中确定   List<ObjectB>使用Class-conversion.properties,其中KeyProperty_xxx=yyy   是返回集合的bean类的属性   xxx是我们要索引的collection元素的属性   上。

     

有关示例,请参阅以下两个类:

     

MyAction.java

yyy
     

Foo.java

/**
 * @return a Collection of Foo objects
 */
public Collection getFooCollection()
{
    return foo;
}

答案 1 :(得分:1)

我在以下更改后成功了。

<s:iterator value="event.planMap" status="mStat"  >
<h4>Plan Type: <s:property value='key' /></h4>
<table id="plan">
<s:iterator value="value.details" status="stat">
<tr>
    <td><s:textfield id="name" name="event.planMap['%{key}'].details[%{#stat.index}].name" /></td>
    <td><s:textfield  id="text" name="event.planMap['%{key}'].details[%{#stat.index}].text" /></td>
    <td><s:textfield id="contact" name="event.planMap['%{key}].details[%{#stat.index}].contact" /></td>
</tr>
</s:iterator>