0

我在我的控制器中定义了@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} 时,它显示“测试地址”,我需要在我的 JSP 中“更改地址”。但是我的 ModelAttribute 是在加载 jsp 之后执行的。是否有可能使用@ModelAttribute 使这成为可能,如果可以,那么如何。?. 除了@ModelAttribute.,还有其他方法可以实现这一点吗?

4

2 回答 2

1

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

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

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

于 2013-08-21T06:25:03.277 回答
0

您对 ModelAttribute 的流程和使用可能不正确/冗余。

来自Spring官方文档

@ModelAttribute 还用于方法级别,为模型提供参考数据(请参阅下面的 populatePetTypes() 方法)。..

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

getAddress被调用两次:

  • 执行一次之前requestMethod(因为它是用 RequestMapping 注释的)
  • 并再次在您的 jsp 中。

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

于 2013-08-20T21:35:19.037 回答