Te sugerimos que revises esta solución en un ambiente controlado antes de pasarlo a producción, saludos.
Solución:
Siempre uso el enfoque donde los métodos del controlador regresan ModelAndView
. Simplemente porque tiende a hacer que los métodos del controlador sean un poco más concisos. Los parámetros del método ahora son estrictamente input
parámetros Y todo output
los datos relacionados están contenidos en el objeto devuelto por el método.
los ModelAndView
style parece resonar con las personas a las que no les gusta actualizar los parámetros de entrada a un método. Apegarse a la creencia de que esto constituiría un efecto secundario, un patrón peligroso porque no puede predecir de manera confiable lo que hará el método: podría devolver datos en el objeto devuelto, o podría haber actualizado algo en cualquiera de los argumentos de entrada.
Así que algunas personas seguirán prefiriendo ModelAndView
.
El nuevo estilo con Model
como parámetro de método y devuelto string como nombre de vista. Parece haber venido de un enfoque de diseño ligeramente diferente. Aquí, los objetos del modelo se consideran una especie de eventos o elementos que se pasan a varios controladores antes de devolverlos a la vista en la que se representan. Me recuerda cómo se manejan los eventos en el mundo AWT/Swing. Este modelo es más coherente con el enfoque en el que varios controladores podrían construir sobre el Model
objetos, hasta que alcanza una vista.
Entonces, al final del día, no parece haber una razón definitiva para criticar o promover ninguno de los dos enfoques. Debe usar el estilo que se sienta más consistente con su filosofía de diseño general.
Espero que esto ayude.
Una diferencia que puedo detectar es que con el objeto ModelAndView puede establecer una referencia directa a un objeto de vista:
ModelAndView mav = ...
mav.setView(myView);
Mientras que si usa Modelo y Cadena, necesita una resolución de vista para resolver el nombre de la vista en una vista real
public String myHandler(...)
return "myviewname"; // has to have a resolver from "myviewname" into an actual view
Si estás de acuerdo, eres capaz de dejar un post acerca de qué le añadirías a esta sección.