Лучший способ для динамических форм с Spring?
Что мне интересно, если есть более простой/лучший способ обработки динамических форм (добавление элементов формы в dom через js) при использовании форм SpringMVC и Spring?
Изображение с объектом-фактурой, имеющим много элементов LineItems.
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 AutoPopulation для создания форм объектов.
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/
Ответ 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));
}
Привет,
Ответ 3
Я обнаружил, что также украшение с помощью GrowthList необходимо, чтобы избежать некоторых ошибок при добавлении/настройке элементов в JSP. (Также создан пользовательский SpringList impl, который в основном выполняет двойное оформление.)
lineItems = GrowthList.decorate(ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class)));
Я согласен. Проблема заключается, конечно, в удалении элементов.
Что вы можете сделать, это использовать синтаксис spring в html. Поэтому, если вы удалите элемент (например, по индексу 2) из списка с помощью javascript, вы затем отметьте этот индекс следующим образом:
<input type="hidden" name="_lineItems[2]">
Затем, когда форма отправлена spring, она увидит маркер и поместит пустой элемент (на основе lazylist factory) для lineItems 2 вместо игнорирования.
Ответ 4
Сегодня я борюсь с этой проблемой и выяснил какое-то решение, описанное здесь.