Aquí podría ser tu PUBLICIDAD


Spring: la mejor forma de lidiar con el enlace a una lista de beans en un controlador simple

votos
2

Sin pensar demasiado, he estado haciendo algo como lo siguiente:

1) crear una lista de objetos SomeBean en función de los resultados de una llamada a la base de datos

2) poner esa lista en mi objeto de comando

3) crear un formulario basado en ese objeto de comando donde los usuarios pueden modificar los atributos de SomeBeans

4) extraer datos del objeto de comando post-envío y escribir los datos actualizados en mi base de datos

Mi código se ve así:

public class UpdateThingsinListController extends SimpleFormController {

    protected Object formBackingObject(final HttpServletRequest request)
          throws Exception {

    List<SomeBean> beans = database.getBeans();

    Command comamnd = new UpdateThingsCommand()
    command.setList(beans);

    return command;

  }

   protected ModelAndView onSubmit(final HttpServletRequest request,
          final HttpServletResponse response, final Object commandArg,
          final BindException errors) throws Exception {

    database.setBeans(commandArg.getList());        

   }


}

mi jsp se ve algo así como:

<form:form>
    <c:forEach var=bean items=${beans} varStatus=status>
        <form:checkbox path=beans[${status.index}].someBooleanProperty />${bean.name} <br>    
    </c:forEach>
</form:form>

El código funciona bien, pero me acabo de dar cuenta de que mi lista de beans se está creando dos veces (sessionform debe ser falso en mi caso) - una vez cuando se muestra el formulario, una vez cuando se vincula. Si algo cambia en la segunda creación (falta un frijol, los resultados están en un orden diferente), mi encuadernación se arruinará y me despedirán. Estoy empezando a pensar que cualquier esquema de licitación en el que un objeto de comando deba combinarse con un envío de formulario es muy arriesgado.

Entonces, mi pregunta es: ¿cómo aseguran las personas que los envíos de formularios se enlazan correctamente a las listas? ¿Hay alguna otra forma de hacerlo además del índice de lista? ID de objeto tal vez?

Gracias,

-Morgan

Publicado el 12/03/2009 a las 21:51
fuente por usuario morgancodes
En otros idiomas...        العربية       

3 respuestas

votos
2

Si el sessionForm se establece en false, entonces durante el enviar el comando se recrea en el método formBackingObject. Orden de la lista en el método onSubmit será exactamente igual que el orden de los objetos encuadernados en la página.

Respondida el 27/10/2011 a las 08:17
fuente por usuario Kons


Aquí podría ser tu PUBLICIDAD


votos
0

Si no puede confiar en que la Lista siempre será la misma siempre que la recupere, deberá usar una colección diferente: un mapa.

Otro enfoque sería almacenar en caché su lista en alguna parte. Quizás algún AOP en torno a su método database.getBeans.

Respondida el 16/03/2009 a las 07:15
fuente por usuario bpapa

votos
0

La manera más rápida es borrar primero todos los SomeBeans existentes de la base de datos y crear los que están enlazados en submit.

Una forma más elegante podría ser poner el identificador único de SomeBean en un campo de formulario oculto.

Respondida el 12/03/2009 a las 10:16
fuente por usuario Kees de Kooter