我有一个事件对象,里面有一个
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>
所以我修改了代码。显示表格是正确的,但我出错了,结果是
input
。如果我删除 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>
Struts 可以访问操作 bean 的索引属性,例如
List
、Map
等,但要求元素类应该是像 Map<ObjectA, ObjectC>
这样的 Java Bean,其中 ObjectC
包装 List<ObjectB>
.
然后使用 Struts 类型转换 填充索引属性,如本答案中所示如何在我的操作中从 JSP 获取更新的列表值。
通过集合的属性对集合进行索引
也可以通过以下方式获取集合的唯一元素 传递该元素的给定属性的值。默认情况下, 集合元素的属性由
使用
Class-conversion.properties
,其中
KeyProperty_xxx=yyy
是返回集合的 bean 类的属性,xxx
是我们要索引的集合元素的属性 开。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; }
我在进行以下更改后使其工作。
<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>