2011-02-06 7 views
17

'u kullanma konusunda kafam karıştı. Spring MVC mimarisini anlamaya çalışıyorum. Ancak, @SessionAttributes davranışı tamamen kafam karıştı.@SessionAttributes

Lütfen aşağıda SampleController kısmına bakın, SuperForm sınıfının post yöntemini ele alıyor. Aslında, sadece SuperForm sınıfı alanı beklediğim gibi bağlayıcıdır. Ancak, Denetleyicide @SessionAttributes koyduktan sonra, işleme yöntemi SubAForm olarak bağlayıcıdır. Bu bağda ne olduğunu bana açıklayan var mı?

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

@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> 

cevap

21

POST isteği işleme, yay yapar:

  • @SessionAttributes olmadan: Yay SuperForm yeni bir örneğini (tip register() imza anlaşılmaktadır), değerleri özelliklerini doldurur başlatır form alanlarından ve register() yöntemine iletir. @SessionAttributes ile

  • : Spring (GET işlerken nedeniyle @SessionAttributes varlığına yerleştirilmiştir) oturumundan modeli nitelik örneği elde eder alanlardan gelen değerlerle özelliklerini günceller ve register() yönteme geçirir. @SessionAttributes ile

, register()getCreateForm() tarafından Model yerleştirilmiştir modeli özelliği, objenin aynı örneğini alır.

+0

Çok teşekkürler! Açıklaman süper! Netleşiyorum. – zono

+0

Açıklama için teşekkürler, "Bu, @SessionAttribute register() ile getCreateForm() tarafından modele yerleştirilen model özniteliği nesnesinin aynı örneğini alır." Her iki şekilde de formda girilen whaterver kullanıcısı alıyorsunuz, bu cümlede ne demek istiyorsunuz? Demek istediğim, her alanın doğru değerlerini aldığınıza göre, sessionAttribute özelliğini kullanmanın anlamı nedir? Bir şey mi eksik? – Jack

+0

, @SessionAttributes veya @SessionAttribute? : p –

3

@axtavt'un ne dediğine eklendiğini varsayalım: getCreateForm'da bir açılır aşağı (liste veya harita) için bazı değerler ekliyorsunuz veya kayıt yönteminde istediğiniz bazı değerleri yazıyorsunuz ama Formda göstermelerini istemek (gizli alanlarda bile değil). Şimdi, register yönteminde bir hata oluştuğunu ve formu tekrar göstermeniz gerektiğini varsayalım. Bir sonraki gönderide ihtiyaç duyacağınız açılır değerleri ve diğer değerleri doldurmak için bunları formda yeniden doldurmanız gerekir. @SessionAttribute, yukarıda çok iyi tanımlandığı gibi @axtavt olarak yardımcı olur.

+0

, @SessionAttribute veya SessionAttributes mı? : p –

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"); 
    } 

}