2013-04-08 87 views
0

我正在使用Spring框架,JSP頁面來顯示和驗證表單。創建集合字段JSP Java

我來自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> 

問:
它是一個可以由用戶動態genereate字段(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

我設法解決這個問題。關鍵是使用LinkedHashMap而不是ArrayList

LinkedHashMap保留值順序和允許保持索引,如你所願。特別是整數。

所以在這個字段中的表格類將是: 私人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>