将textfield值插入struts2中的集合中

时间:2012-07-22 11:50:11

标签: struts2

我有这个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类的Set成员中的位置对象

1 个答案:

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