创建集合字段JSP Java

时间:2013-04-08 16:01:38

标签: java spring jsp servlets

我正在使用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;
    }
}

1 个答案:

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