Soru @SessionAttributes kullanımı hakkında kafam karıştı


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

Aşağıda SampleController'a bakınız, 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ı. 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>

18
2018-02-06 15:05


Menşei




Cevaplar:


İşlerken POST isteği, Bahar aşağıdakileri yapar:

  • olmadan @SessionAttributes: Bahar yeni bir örneğini başlatıyor SuperForm (tür imzasından çıkarılmıştır register()), özelliklerini form alanlarındaki değerlere göre doldurur ve register() yöntem.

  • İle @SessionAttributes: Spring, oturumdan bir model özniteliği örneği alır (işlenirken yerleştirildiği yer) GET varlığı nedeniyle @SessionAttributes), özelliklerini alanlardan gelen değerlere göre günceller ve register() yöntem.

Yani @SessionAttributes , register() Modele yerleştirilen model özellik nesnesinin aynı örneğini alır. getCreateForm().


22
2018-02-06 15:21



Çok teşekkürler! Açıklaman süper! Netleşiyorum. - zono
Açıklama için teşekkürler, "Ben, @SessionAttribute register () ile getCreateForm () tarafından modele yerleştirilen model özniteliği nesnesinin aynı örneğini alması ile biraz kafam karıştı." 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
@SessionAttributes veya @SessionAttribute oldu mu? : p - Tahir Hussain Mir


@Axtavt'ın söylediklerine ek olarak: getCreateForm Bir açılır liste (liste veya harita) için bazı değerler koyuyorsunuz veya kayıt yönteminde istediğiniz formda bazı değerler koyuyorsunuz ancak bunların formda gösterilmesini istemiyorsunuz (gizli alanlarda bile). Şimdi bir hata oluştuğunu varsayalım. register yöntemi ve formu tekrar göstermeniz gerekir. 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.


3
2018-02-06 15:58



@SessionAttribute veya SessionAttributes mi? : p - Tahir Hussain Mir


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

}

0
2017-11-06 13:48