struts2 - La secuencia de ModelDriven and Prepare?
model-driven (2)
Encontré mi propia solución ... pero no una buena ...
Cuando establezco un objeto de dominio por setter, lo presiono manualmente a valuestack ..
Funciona bien y solo se agregaron 2 líneas a mi clase.
Pero no me siento tan bien.
Puse println()
en cada método de clase de acción.
public String execute() throws Exception {
System.out.println("execute");
//...
}
public void prepare() throws Exception {
System.out.println("prepare");
//...
}
public Object getModel() {
System.out.print("getModel");
//...
}
Pensé que el orden sería; prepare → ejecutar → getModel.
Porque recuerdo que lo leí en el libro, así que solía construir clases de beans y hacer algunas lógicas en prepare()
, y simplemente devolvió SUCCESS en execute()
. Y creo que getModel es para empujar el bean al ValueStack, ¿verdad?
... de todos modos la consola me mostró esto. Es muy raro; prepare → getModel → ejecutar.
Y esto se está convirtiendo en un gran problema para mí. Es muy difícil explicar el motivo en inglés ... ¡pero lo intentaré!
Solía crear cada clase de acción que trata con los mismos beans, y por supuesto hay los mismos códigos (variables, y sus getters y setters) duplicados en cada clase de acción.
Ahora intento crear una acción para evitar esa duplicación. Esta clase de acción tiene varios métodos (mapeados en struts.xml como este; <action name="View_board" method="view">
).
Y como vimos en la consola, esta view()
se llama por último en la clase de acción como execute()
. El prepare()
solo construye beans, y view()
hace trabajos reales. Pero se llama a getModel()
antes de llamar a view()
, por lo que no hay posibilidad de poner beans en ValueStack.
Espero que entiendan lo que intento explicar.
Para resumir, hay clases de acción como BoardView, BoardDelete, BoardWrite ... ¡y funcionó bien! Pero odio las cosas duplicadas, así que creé la clase BoardManager. Esta clase tiene cada método (como view()
) que fue manejado por clase (como BoardView). Pero esta vista () se getModel()
después de la llamada a getModel()
, por lo que el bean (return of getModel()
) no tiene posibilidad de ser enviado a ValueStack.
Por favor, ayúdame. Enséñame tus conocimientos en el campo. Lo estoy desarrollando todo por mi cuenta y esto me está haciendo sentir tan duro.
¡¡Gracias!!
Debe establecer el objeto Model usted mismo ya que el interceptor modeldriven solo puede empujarlo a la pila si no es nulo. Si su getModel () se ve así:
SomeModelClass myModelObject = null;
public Object getModel()
{
return myModelObject;
}
... tendrás que configurar el modelObject para que pueda ser empujado al ValueStack. Podrías hacerlo de esta manera, supongo:
public void prepare(){
myModelObject = new myModelObject("I''m so new");
}
... o simplemente inicializarlo en el campo:
SomeModelClass myModelObject = new myModelObject("I''m so new");
No olvide implementar las interfaces apropiadas (ModelDriven y Preparable). Espero que esto ayude un poco.