【问题标题】:How to pass a Map<ObjectA, List<ObjectB>> to action in Struts 2如何将 Map<Object, List<Object>> 传递给 Struts 2 中的操作
【发布时间】:2025-12-22 00:25:16
【问题描述】:

我有一个事件对象,里面有一个Map&lt;ObjectA, List&lt;ObjectB&gt;&gt;ObjectA 是标签,list&lt;ObjectB&gt; 是表格行。使用以下代码,我可以正确显示表格,但是当我将表单提交给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 & Roman,所以我修改了代码。显示表格是正确的,但我得到了错误,它进入了结果输入。如果我删除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>
      

【问题讨论】:

  • 在我修改为在 Object_B 的定义中具有 Map 并具有 List 详细信息后,它不起作用。 JSP 是

标签: java jsp type-conversion struts2 ognl


【解决方案1】:

Struts可以访问action bean的索引属性,例如ListMap等,但是要求元素类应该是像Map&lt;ObjectA, ObjectC&gt;这样的Java Bean,其中ObjectC包裹了@ 987654328@.

然后使用 Struts type conversion 填充索引属性,就像在这个答案 How to get updated list values from JSP in my action 中一样。

Indexing a collection by a property of that collection

也可以通过以下方式获取集合的唯一元素 传递该元素的给定属性的值。默认情况下, 集合元素的属性在 Class-conversion.properties 使用 KeyProperty_xxx=yyy,其中 xxx 是返回集合的 bean 类的属性,并且 yyy 是我们要索引的集合元素的属性 开。

举个例子,看下面两个类:

MyAction.java

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

Foo.java

/**
 * @return a unique identifier
 */
public Long getId()
{
    return id;
}

【讨论】:

    【解决方案2】:

    我在进行以下更改后使其工作。

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

    【讨论】:

      最近更新 更多