Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring创建动态表单的更好方法?_Java_Spring_Spring Mvc - Fatal编程技术网

Java 使用Spring创建动态表单的更好方法?

Java 使用Spring创建动态表单的更好方法?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我想知道的是,当使用SpringMVC和SpringForms时,是否有更简单/更好的方法来处理动态表单(通过js向dom添加表单项) 具有具有多个行项目的发票对象的映像 public class Invocie { private List LineItems; public Invoice() { lineItems = ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.inst

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

具有具有多个行项目的发票对象的映像

public class Invocie {
    private List LineItems;

    public Invoice() {
        lineItems = ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class));
    }
}
公共类发票{
专用列表行项目;
公共发票(){
lineItems=ListUtils.lazyList(新的ArrayList(),FactoryUtils.instancefactory(LineItem.class));
}
}
显示属于我当前使用的发票的项目



要添加行项目,我有一些js计算新索引并将其添加到DOM中。删除行项目时,我当前必须对所有索引重新编号,这是我希望避免的部分,是否可能?

您可以使用以下方法

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

关于,

我发现,在JSP中添加/设置项时,也需要使用GrowthList进行装饰,以避免出现一些错误。(还创建了一个定制的SpringList impl。它基本上完成了双重装饰。)

lineItems=GrowthList.decoration(ListUtils.lazyList(new ArrayList(),FactoryUtils.instancefactory(LineItem.class));
我同意。问题当然是删除项目

您可以使用html中的语法。因此,如果您使用javascript从列表中删除一个项目(例如,在索引2中),那么您将使用以下内容标记该索引:



然后,当表单提交时,spring将看到标记并为lineItems放入一个空项(基于lazylist工厂),而不是忽略它。

我已经实现了一个教程,可以帮助您在客户端使用jQuery和spring为表单备份对象自动填充列表来解决这个问题

编辑
来自Webarchive的链接

我今天一直在努力解决这个问题,并找到了一些描述的解决方案。

他们确实走在一起。这个问题其实不是问题,我想知道是否有比apache commons中的lazyList更好的方法。好吧,我不想这么说,但是没有办法让Spring控制器接受PHP接受的东西,我的意思是将[]放在路径中?@eggsy84动态删除对象怎么样?
lineItems = GrowthList.decorate(ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class)));