2011-02-06 39 views
17

Estoy tratando de entender la arquitectura de Spring MVC. Sin embargo, estoy completamente confundido por el comportamiento de @SessionAttributes.Estoy confundido acerca de cómo usar @SessionAttributes

Mire SampleController a continuación, está manejando el método de publicación por la clase SuperForm. De hecho, solo el campo de la clase SuperForm solo es vinculante como esperaba.

Sin embargo, después de poner @SessionAttributes en el controlador, el método de manejo es vinculante como SubAForm. ¿Alguien puede explicarme qué pasó en este enlace?

------------------------------------------------------- 

@Controller 
@SessionAttributes("form") 
@RequestMapping(value = "/sample") 
public class SampleController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String getCreateForm(Model model) { 
     model.addAttribute("form", new SubAForm()); 
     return "sample/input"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String register(@ModelAttribute("form") SuperForm form, Model model) { 
     return "sample/input"; 
    } 
} 

------------------------------------------------------- 

public class SuperForm { 

    private Long superId; 

    public Long getSuperId() { 
     return superId; 
    } 

    public void setSuperId(Long superId) { 
     this.superId = superId; 
    } 

} 

------------------------------------------------------- 

public class SubAForm extends SuperForm { 

    private Long subAId; 

    public Long getSubAId() { 
     return subAId; 
    } 

    public void setSubAId(Long subAId) { 
     this.subAId = subAId; 
    } 

} 

------------------------------------------------------- 

<form:form modelAttribute="form" method="post"> 
    <fieldset> 
     <legend>SUPER FIELD</legend> 
     <p> 
      SUPER ID:<form:input path="superId" /> 
     </p> 
    </fieldset> 
    <fieldset> 
     <legend>SUB A FIELD</legend> 
     <p> 
      SUB A ID:<form:input path="subAId" /> 
     </p> 
    </fieldset> 
    <p> 
     <input type="submit" value="register" /> 
    </p> 
</form:form> 

Respuesta

21

Al procesar POST solicitud, Spring hace lo siguiente:

  • Sin @SessionAttributes: Spring crea la instancia de una nueva instancia de SuperForm (tipo se infiere de la firma de register()), rellena sus propiedades por valores de los campos de formulario y lo pasa al método register().

  • Con @SessionAttributes: Spring obtiene una instancia de atributo modelo de la sesión (donde fue colocada al procesar GET debido a la presencia de @SessionAttributes), actualiza sus propiedades por los valores de la de los campos y la pasa al método register().

es decir, con @SessionAttributes, register() tiene la misma instancia del objeto de atributo modelo que se coloca en el Modelo de getCreateForm().

+0

¡Muchas gracias! Tu explicación es Super! Me estoy poniendo claro. – zono

+0

Gracias por la explicación, estoy un poco confundido con "Es decir, con @SessionAttribute register() obtiene la misma instancia del objeto de atributo del modelo que se colocó en el modelo mediante getCreateForm()". En cualquier caso, está recibiendo un usuario cualquiera ingresado en el formulario, entonces, ¿qué quiere decir con esta frase? Quiero decir, de todos modos, recibes los valores correctos de cada campo, entonces, ¿cuál es el sentido de usar sessionAttribute? ¿Me estoy perdiendo de algo? – Jack

+0

fue @SessionAttributes o @SessionAttribute? : p –

3

Agregando a lo que @axtavt dijo: Supongamos que en getCreateForm está poniendo algunos valores para un menú desplegable (lista o mapa), o está poniendo algunos valores en la forma que desea en el método de registro pero no lo hace Quiero que se muestren en forma (ni siquiera en campos ocultos). Ahora suponga que se produjo un error en el método register y necesita mostrar el formulario nuevamente. Para completar los valores desplegables y otros valores que necesitaría en la próxima publicación, debería volver a llenarlos en la forma. El @SessionAttribute ayuda aquí como @axtavt muy bien descrito anteriormente.

+0

¿es @SessionAttribute o SessionAttributes? :pag –

0
@Controller 
@SessionAttributes("test") 
public class Controller{ 
    Customer customer; 

    public Controller() { 
     super(); 
     customer = new Customer(); 
    } 

    @ModelAttribute("test") 
    public Customer getCustomer() { 
     customer.setName("Savac"); 
     return customer; 
    } 

    @RequestMapping({"/index"}) 
    public ModelAndView showMainPage (@ModelAttribute("test") Customer customer, ModelMap model, method = RequestMethod.GET) { 
     //in the view you set the name 
     return new ModelAndView("index"); 
    } 

    @RequestMapping(value = "customer/{customerID}", method = RequestMethod.GET) 
    public ModelAndView viewAdvice(@PathVariable("customerID") int customerID, @ModelAttribute("test") Customer customer, ModelMap model) { 
     customer.setName("AnotherName"); 
     model.addAttribute("test", customer); 
     return new ModelAndView("customer"); 
    } 

} 
Cuestiones relacionadas