AddTruck.jsp 页面形式如下:
<form:form method="post" modelAttribute="truckDto" action="myController">
<form:checkbox path="operatingDays[0].weekDays"
value="MONDAY" class="weekday" id="weekday-mon"/>
<form:checkbox path="operatingDays[1].weekDays"
value="TUESDAY" class="weekday" id="weekday-tue"/>
//同样是一周的所有日子,直到星期日,operatingDays
的索引一直在递增,直到一周结束。
TruckDto 具有ArrayList
对象的以下属性:
private List<TruckOperatingDays> operatingDays = new ArrayList<TruckOperatingDays>();
//getter setter below
TruckOperatingDays POJO的getter-setter方法具有以下属性:
@Enumerated(EnumType.STRING)
@Column(name = "week_days")
private WeekDaysEnum weekDays;
@Column(name = "opening_hours")
private String openingHours;
@Column(name = "closing_hours")
private String closingHours;
当我提交表单时,我会根据需要在控制器中获取值,并且可以将值保存到我的数据库中而没有任何问题。问题出在“编辑”时间。
当我打开此页面以编辑先前在数据库中保存的值时,由于operatingDays
的索引位置在表单中是静态的并且ArrayList
从中传递,因此我无法选中已选中的复选框controller不会将值设置为表单中的输入字段/复选框。
请注意,我无法使用JSTL foreach
循环生成ArrayList
中的表单字段,因为我还需要在星期一,星期二等时间显示标签。
我的表单字段是否可以通过我的DTO proeprties自动绑定,就像我们可以绑定简单的输入字段一样没有问题?
答案 0 :(得分:0)
您仍然可以使用JSTL,只需添加一个额外的列表来存储工作日(注意:此示例假定您的ArrayList返回所有7天但有些天可能为空(未选中))。
<%
String[] days = new String[]{ "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" };
pageContext.setAttribute("wDays", days);
%>
//and then use JSTL
<c:forEach items=${operatingDays} var="day", varStatus="counter">
<form:checkbox path=${day.weekDays}
value=${wDays[counter]} class="weekday" id="weekday-mon"/>
</c:forEach>
如果您想避免使用scriptlet,可以使用&lt; c:set&gt;在您的JSP页面中填充工作日列表或只填充Java代码中的日期列表(而不是在JSP中)