在显示JSP之前执行@ModelAttribute

时间:2013-08-20 21:10:57

标签: java spring jsp annotations modelattribute

我在我的控制器中定义了@ModelAttribute,需要根据请求的方法输出来执行。所以当我尝试从JSP访问我的ModelAttribute时,却产生了之前的结果。例如下面:

class MyController{

 @modelAttribute("Address")
 protected getAddress(HttpRequest req){
  HttpSession sess = req.getSession();
  return sess.getAttribute("Address");// For example now Address is "Test Address"
 }

 @RequestMapping("sample.do", method=RequestMethod.GET)
 public Model requestMethod(......)
 {
  // after execution of this method
  sess.setAttribute("Address","Changed Address");
  return model;// request directed to my JSP.
 }

}

当我在JSP中使用$ {Address}时,它显示“Test Address”,我在JSP中需要“Changed Address”。但我的ModelAttribute是在加载jsp后执行的。是否有可能使用@ModelAttribute使这成为可能,如果是这样,那么如何。 。除了@ModelAttribute之外还有其他方法可以实现这个目的吗?

2 个答案:

答案 0 :(得分:0)

您的流量和使用ModelAttribute可能不正确/多余。

来自官方Spring documentation

  

@ModelAttribute也用于方法级别以提供参考   模型的数据(参见下面的populatePetTypes()方法)。 ..

     

注意:@ModelAttribute注释方法将在执行之前执行   选择了@RequestMapping带注释的处理程序方法。 ...

getAddress被调用两次:

  • 执行requestMethod之前一次(因为它使用RequestMapping进行注释)
  • 再次出现在你的jsp中。

每次调用它时,都会返回一个带有“测试地址”的地址。您应该删除JSP中的调用(通过删除表单上的modelAttribute)。在您的情况下,它是多余的,因为您已经在requestMethod中添加了更新版本的地址。

答案 1 :(得分:0)

对于方法,

@ModelAttribute用于在调用请求mappingmethod之前填充模型。因此,如果多个视图需要显示地址,您可以在其所有控制器中添加相同的@ ModelAttribute-annotated方法,因此视图将在模型中找到地址,从而能够显示它。

这里的问题是,在@ ModelAttribute-annotated方法之后调用的请求映射方法会更改地址的valud,但不会在模型中设置地址的新值。因此视图仍然显示旧地址,由@ ModelAttribute-annotated添加到模型中。您不应该有很多方法更改地址,因此应该在那里重置模型中的地址,但不能在其他地方重置。

也就是说,地址来自会话,因此它已经可用于所有视图,而不需要任何@ ModelAttribute-annotated方法(它只在请求中存储相同的地址)。只需删除@ ModelAttribute-annotated方法,您仍然可以访问视图中的正确地址,因为视图可以访问会话中存储的所有内容。当模型必须包含来自(通常是)数据库的数据时,@ ModelAttribute非常有用:方法从数据库获取数据,并且此数据由Spring存储在模型(请求)中。