【问题标题】:@ModelAttribute execution before displaying the JSP@ModelAttribute 在显示 JSP 之前执行
【发布时间】:2013-08-23 02:14:21
【问题描述】:

我在我的控制器中定义了@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,还有其他方法可以实现吗?

【问题讨论】:

  • 能否提供实际代码。您上面的代码无法编译。
  • 如果要将新地址存储在模型中,那么...存储在模型中:model.addAttribute("Address", "Changed Address");
  • model.addAttribute() 正在工作,但是这个 ModelAttribute 方法被许多控制器在更大的应用程序中使用。我需要它在一个地方并且必须在所有 JSP 中使用。除了 ModelAttribute 有没有其他方法

标签: java spring jsp annotations modelattribute


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    来自官方Spring documentation

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

    注意:@ModelAttribute 注解的方法会在 选择 @RequestMapping 带注释的处理程序方法。 ...

    getAddress 被调用了两次:

    • requestMethod 执行前一次(因为它被RequestMapping注解)
    • 并再次在您的 jsp 中。

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

    【讨论】:

    • model.addAttribute() 正在工作,但是这个 ModelAttribute 方法被许多控制器在更大的应用程序中使用。我需要它在一个地方,并且必须在所有 JSP 中使用。除了ModelAttribute还有其他方法吗
    猜你喜欢
    • 2013-05-03
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多