2009-05-20 88 views
17

我想知道的是,使用SpringMVC和Spring表单时,是否有更简单/更好的方式来处理动态表单(通过js向dom添加表单项)?更好的方式与春季动态形式?

具有包含许多LineItems的Invoice对象的图像。

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> 

添加了LineItem我有一些JS计算新的索引并添加到​​DOM。当删除一个LineItem我当前不得不重新编号所有的索引,这是我想避免的部分,这有可能吗?

+0

好吧我讨厌这么说,但是没有办法让Spring Controller接受PHP接受的东西,我的意思是把[]放在路径中? – yglodt 2014-02-10 18:45:36

回答

3

您可以根据使用以下

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

问候,

+0

他们一起走。这个问题不是一个真正的问题,我想知道是否有更好的办法比从Apache公共lazyList更好的方式。 – 2009-06-26 10:55:47

1

我发现,也有装饰在JSP中添加/设置项目时,为避免出现一些错误,必须使用GrowthList。 (也创建了一个定制的SpringList impl,基本上做了双重装饰)。

lineItems = GrowthList.decorate(ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class))); 

我同意。问题当然是删除项目。

你可以做的是在HTML中使用spring marker语法。所以,如果你删除的项目(在指数2为例)从使用javascript的列表中,你会则标志着该指数具有:

<input type="hidden" name="_lineItems[2]"> 

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

1

我一直在这个问题今天挣扎,想出了一些解决方案描述here