在@ModelAttribute注释中声明的Bean的范围是什么

时间:2014-01-28 07:05:48

标签: java spring-mvc modelattribute

我有一个包含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范围的?

2 个答案:

答案 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中。