0

我正在使用 Spring 框架、JSP 页面来显示和验证表单。

我来自 PHP 世界,其中字段名称somefield[]由数组(ArrayList在 Java 中)表示。我想从表单中的输入中获取字符串集合。

我已经定义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;
    }
}
4

1 回答 1

0

我已经设法解决了这个问题。关键是使用LinkedHashMap而不是ArrayList.

LinkedHashMap保留值顺序并允许根据需要保留索引。特别是整数。

所以在表单类中这个字段将是:private HashMap waypoints;

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>
于 2013-04-08T16:47:09.267 回答