使用Spring进行动态形式的更好方法?

2022-09-03 02:19:14

我想知道的是,在使用SpringMVC和Spring表单时,是否有更简单/更好的方法来处理动态表单(通过js将表单项添加到dom中)?

具有具有许多行项的发票对象的映像。

public class Invocie {
    private List LineItems;

    public Invoice() {
        lineItems = ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class));
    }
}

显示属于我当前使用的发票的项目

<forEach items="${invoice.lineItems}" varStatus="i">
  <form:input path="lineItems[${i.index}].productName" />
</c:forEach>

为了添加LineItems,我有一些js来计算新索引并将其添加到DOM中。删除LineItem时,我目前必须对所有索引重新编号,这是我想避免的部分,可能吗?


答案 1

我已经实现了一个教程,可以帮助您在客户端使用jQuery和Springs AutoPopulating列表来解决此问题,以便您形成支持对象。

http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/

编辑来自网络档案 https://web.archive.org/web/20160729163958/http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/ 的链接


答案 2

您可以使用以下内容

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;
            }

        });
    }

}

然后在 onBind 方法中,根据以下条件删除空引用:

protected void onBind(HttpServletRequest request, Object command, BindException bindException) throws Exception {
    Invoice invoice = (Invoice) command;

    invoice.getLineItems().removeAll(Collections.singletonList(null));
}    

问候


推荐