我正在使用Spring框架,JSP页面来显示和验证表单。
我来自PHP世界,其中somefield[]
等字段名称由数组(Java中的ArrayList
)表示。我想从表单中的输入中获取字符串集合。
我已经定义了private List<String> waypoints;
,它可以完美地运行,但在JSP中我必须保留符号somefield[0]
,somefield[1]
,somefield[2]
等等。
问题:
这会带来不便,导致只有两个字段的序列:somefield[0]
,somefield[9]
实际上会生成10个字段。
我只是显示现有字段值的代码。
<c:forEach items="${routeAddInput.waypoints}" var="waypoint" varStatus="status">
<input name="waypoints[${status.index}]" type="text" value="${waypoint}" placeholder="Enter name here" />
</c:forEach>
问题:
是否可以通过用户(在UI中)动态生成字段,其中索引并不重要?如果用户添加字段,我可以简单地计算下一个索引,但如果用户删除该字段,则列表中存在间隙。
问题背景:
我的Servlet方法验证表单:
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String step1ValidateForm(
@ModelAttribute("routeAddInput")
@Valid RouteAddInput form,
BindingResult result, ModelMap model) {
if (result.hasErrors()) {
return "route/add";
}
return "redirect:addDetails";
}
要验证的表单:
public class RouteAddInput {
@NotNull
@Length(min=1)
private String locationSource;
@NotNull
@Length(min=1)
private String locationDestination;
private List<String> waypoints;
public RouteAddInput() {
setLocationSource("");
setLocationDestination("");
waypointsCoords = new ArrayList<String>();
}
public String getLocationSource() {
return locationSource;
}
public void setLocationSource(String locationSource) {
this.locationSource = locationSource;
}
public String getLocationDestination() {
return locationDestination;
}
public void setLocationDestination(String locationDestination) {
this.locationDestination = locationDestination;
}
public List<String> getWaypoints() {
return waypoints;
}
public void setWaypoints(List<String> waypoints) {
this.waypoints = waypoints;
}
}
答案 0 :(得分:0)
我设法解决了这个问题。关键是使用LinkedHashMap
而不是ArrayList
。
LinkedHashMap
保留值顺序,允许保留索引。特别是整数。
所以在表单类中这个字段将是: 私人HashMap航点;
JSP forEach
中存在差异:
<c:forEach items="${routeAddInput.waypoints}" var="waypoint">
<input name="waypoints['${waypoint.key}']" type="text" value="${waypoint.value}" placeholder="Enter name here" />
</c:forEach>