gpt4 book ai didi

spring - 我对如何使用 @SessionAttributes 感到困惑

转载 作者:IT老高 更新时间:2023-10-28 13:50:54 28 4
gpt4 key购买 nike

我正在尝试了解 Spring MVC 的架构。但是,我完全被 @SessionAttributes 的行为弄糊涂了。

请看下面的 SampleController,它是通过 SuperForm 类处理 post 方法。事实上,只是 SuperForm 类的字段只是像我预期的那样绑定(bind)。

但是,在我将@SessionAttributes 放入Controller 后,处理方法绑定(bind)为SubAForm。谁能解释一下这个绑定(bind)发生了什么。

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

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

最佳答案

在处理 POST 请求时,Spring 会执行以下操作:

  • Without @SessionAttributes:Spring 实例化一个新的 SuperForm 实例(类型从 register() 的签名中推断) , 通过表单字段中的值填充其属性并将其传递给 register() 方法。

  • With @SessionAttributes:Spring 从 session 中获取模型属性的实例(在处理 GET 时,由于存在 @ SessionAttributes),通过 from 字段中的值更新其属性并将其传递给 register() 方法。

也就是说,使用 @SessionAttributesregister() 获取到由 getCreateForm()< 放入 Model 的模型属性对象的相同实例

关于spring - 我对如何使用 @SessionAttributes 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914071/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com