我有这个bean类
Class Address {
private String addressId;
private Set<Location> setOfLocations;
// more attributes
//getters and setters
}
Class Location{
private Long locationId;
private String locationName
private String nearestHospital;
//getters and setters
}
在jsp中我有一个用于Address类成员的textField控件,还有一个用于locationName和nearestHospital的Location类成员。
Address类成员映射正常,因为模型驱动的接口将它们映射到各自的字段。问题是我如何将位置textFields映射到Address类
答案 0 :(得分:0)
使用类型转换和list
代替set
,这样可以将新项目添加到列表中:
<s:textfield name="locations[%{locations.size()}].locationName"/>
如果你想使用一套,那么我不知道如何在不花费一些时间的情况下实现你想要的东西,但你会想要开始here。
另一方面,如果您希望能够显示和编辑现有集合,那么如果您使用list
而不是collection
,这应该会有效:
<s:iterator var="listItem" value="yourList" status="listStatus">
<s:set name="paramName">yourList[${ listStatus.index }].someField</s:set>
<s:textfield name="%{#paramName}" value="%{#listItem.someField}"/>
</s:iterator>
在这里,您的模型将有一个名为yourList
的列表。 yourList中的项目包含一个名为someField
的字段。我们可以通过将请求参数名称设置为yourList[2].someField
形式将值设置到字段上,以便OGNL
对此进行评估并将参数值设置为yourList的第2项的someField字段
使用上面显示的课程,但将位置更改为列表,我们会:
<s:iterator var="location" value="listOfLocations" status="locationStatus">
<s:set name="paramName">listOfLocations[${ locationStatus.index }]</s:set>
<s:hidden name="%{#paramName}.locationId" value="%{#location.locationId}"/>
<s:textfield name="%{#paramName}.locationName" value="%{#location.locationName}"/>
<s:textfield name="%{#paramName}.nearestHospital" value="%{#location.nearestHospital}"/>
</s:iterator>
或者,如果您使用JSTL
,则会执行相同的操作:
<c:forEach var="location" items="${ listOfLocations }" varStatus="locationStatus">
<s:set name="paramName">listOfLocations[${ locationStatus.index }]</s:set>
<s:hidden name="%{#paramName}.locationId" value="%{#location.locationId}"/>
<s:textfield name="%{#paramName}.locationName" value="%{#location.locationName}"/>
<s:textfield name="%{#paramName}.nearestHospital" value="%{#location.nearestHospital}"/>
</c:forEach>