NA.*_*NA. 17 java spring spring-mvc
我想知道在使用SpringMVC和Spring表单时是否有更简单/更好的方法来处理动态表单(通过js向dom添加表单项)?
具有Invoice对象的成像具有许多LineItem.
public class Invocie {
private List LineItems;
public Invoice() {
lineItems = ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class));
}
}
Run Code Online (Sandbox Code Playgroud)
显示属于我当前使用的发票的项目
<forEach items="${invoice.lineItems}" varStatus="i">
<form:input path="lineItems[${i.index}].productName" />
</c:forEach>
Run Code Online (Sandbox Code Playgroud)
要添加LineItems,我有一些js计算新索引并将其添加到DOM.删除LineItem时,我当前必须重新编号所有索引,这是我想避免的部分,是否可能?
egg*_*y84 11
我已经实现了一个教程,可以帮助您在客户端使用jQuery解决此问题,并为您创建支持对象的Springs AutoPopulating列表.
http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/
来自Webarchive的编辑链接https://web.archive.org/web/20160729163958/http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/
您可以使用以下内容
public class InvoiceController extends SimpleFormController {
protected void initBinder(HttpServletRequest request, ServletRequetDataBinder binder) throws Exception {
binder.registerCustomEditor(List.class, "lineItems", new CustomCollectionEditor(List.class)() {
protected Object convertElement(Object lineItem) {
LineItem li = (LineItem) lineItem;
// StringUtils is a jakarta Commons lang static class
return (StringUtils.isBlank(li.getProductName())) ? null : li;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 onBind 方法中,根据以下内容删除空引用:
protected void onBind(HttpServletRequest request, Object command, BindException bindException) throws Exception {
Invoice invoice = (Invoice) command;
invoice.getLineItems().removeAll(Collections.singletonList(null));
}
Run Code Online (Sandbox Code Playgroud)
问候,