我有一个包含40列的表和一个与该表对应的bean。但在页面上我只显示10个字段。通过调试呈现页面时,我可以看到bean正在填充表中的所有字段,我将使用model.addAttribute("emp", emp)
在模型中添加它。但是在更改了页面上的某些字段后,当我再次提交页面时,我看到只有正在填充的字段出现在页面上。尽管bean处于“会话”范围内,但不是休息。
我有一个控制器在我提交页面时被调用。这就像下面的
@RequestMapping({"/update.html"})
public String updateData(@ModelAttribute("emp") Employee emp){
// All fields of Employee bean are not getting populated
}
我在JSP中写了类似下面的东西。
<jsp:useBean class="com.Employee" id="emp"
scope="request" />
注意: - 我也测试了scope =“session”。
所以我的问题是,即使把bean放在SESSION范围内,为什么我没有把它放在我的控制器中。那么@ModelAttribute是如何更改我的bean范围的?
答案 0 :(得分:2)
@ModelAttribute
实际上将模型(通过字段提交的内容)与类型(在本例中为Employee
)绑定,并将此绑定类型公开为可以使用的模型在你的jsp中。此时它根本不是一个Spring bean,只是一个作用于请求的对象。
现在,关于如何预填充bean,更简洁的方法可能是在控制器中定义另一个用@ModelAttribute
注释的方法,该方法负责以这种方式从数据库加载模型:
@ModelAttribute("emp")
public Employee loadModelAttributes(@RequestParam("empid") int empid){
// return employee fully populated..
}
这将确保在您的控制器方法中,只有您从UI提交的字段现在已更新到您从DB填充的基础Employee
,这样您就不必保存在隐藏的变量中。
@RequestMapping({"/update.html"})
public String updateData(@ModelAttribute("emp") Employee emp){
// All fields of Employee bean are not getting populated
}
答案 1 :(得分:0)
正如@Biju所述,模型属性参数是一个新对象,与模型中的对象分开。该模型属性参数填充了页面中的数据,但未使用模型对象中的数据进行初始化。
必须将来自model属性参数的新数据复制到放置在会话中的Bean中。