java - initializr - spring mvc netbeans
¿Mejor manera de formas dinámicas con Spring? (4)
Lo que me pregunto es si hay una forma mejor / más fácil de manejar formularios dinámicos (agregar elementos de formulario a la dom a través de js) al usar los formularios SpringMVC y Spring.
Imágenes que tienen un objeto de factura que tiene muchos LineItems.
public class Invocie {
private List LineItems;
public Invoice() {
lineItems = ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class));
}
}
Para mostrar los artículos que pertenecen a una factura que utilizo actualmente
<forEach items="${invoice.lineItems}" varStatus="i">
<form:input path="lineItems[${i.index}].productName" />
</c:forEach>
Para agregar LineItems tengo algunos js que calculan el nuevo índice y lo agregan al DOM. Al eliminar un elemento de línea, actualmente tengo que volver a numerar todos los índices y esa es la parte que me gustaría evitar, ¿es posible?
Descubrí que también es necesario decorar con un GrowthList para evitar algunos errores al agregar / configurar elementos en JSP. (También creó una aplicación SpringList personalizada que básicamente hace la doble decoración).
lineItems = GrowthList.decorate(ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class)));
Estoy de acuerdo. El problema es sin duda la eliminación de elementos.
Lo que puedes hacer es usar la sintaxis del marcador de primavera en el html. Entonces, si elimina un elemento (en el índice 2 por ejemplo) de la lista usando javascript, entonces marcaría ese índice con:
<input type="hidden" name="_lineItems[2]">
Luego, cuando se envíe el formulario, Spring verá el marcador y lo colocará en un elemento vacío (basado en la fábrica de lazylist) para lineItems 2 en lugar de ignorarlo.
He estado luchando con este problema hoy y he descubierto una solución que se describe here .
He implementado un tutorial que podría ayudarlo a resolver esto utilizando jQuery en el lado del cliente y la lista de Autopopulación de Springs para que forme objetos de respaldo.
http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/
EDITAR Enlace desde Webarchive https://web.archive.org/web/20160729163958/http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/
Podrías usar lo siguiente
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;
}
});
}
}
Luego, en el método onBind, eliminas las referencias nulas de acuerdo con:
protected void onBind(HttpServletRequest request, Object command, BindException bindException) throws Exception {
Invoice invoice = (Invoice) command;
invoice.getLineItems().removeAll(Collections.singletonList(null));
}
Saludos,