我在我的控制器中定义了@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之外还有其他方法可以实现这个目的吗?
答案 0 :(得分:0)
您的流量和使用ModelAttribute可能不正确/多余。
@ModelAttribute也用于方法级别以提供参考 模型的数据(参见下面的populatePetTypes()方法)。 ..
注意:@ModelAttribute注释方法将在执行之前执行 选择了@RequestMapping带注释的处理程序方法。 ...
getAddress
被调用两次:
requestMethod
之前一次(因为它使用RequestMapping进行注释)每次调用它时,都会返回一个带有“测试地址”的地址。您应该删除JSP中的调用(通过删除表单上的modelAttribute)。在您的情况下,它是多余的,因为您已经在requestMethod
中添加了更新版本的地址。
答案 1 :(得分:0)
@ModelAttribute
用于在调用请求mappingmethod之前填充模型。因此,如果多个视图需要显示地址,您可以在其所有控制器中添加相同的@ ModelAttribute-annotated方法,因此视图将在模型中找到地址,从而能够显示它。
这里的问题是,在@ ModelAttribute-annotated方法之后调用的请求映射方法会更改地址的valud,但不会在模型中设置地址的新值。因此视图仍然显示旧地址,由@ ModelAttribute-annotated添加到模型中。您不应该有很多方法更改地址,因此应该在那里重置模型中的地址,但不能在其他地方重置。
也就是说,地址来自会话,因此它已经可用于所有视图,而不需要任何@ ModelAttribute-annotated方法(它只在请求中存储相同的地址)。只需删除@ ModelAttribute-annotated方法,您仍然可以访问视图中的正确地址,因为视图可以访问会话中存储的所有内容。当模型必须包含来自(通常是)数据库的数据时,@ ModelAttribute非常有用:方法从数据库获取数据,并且此数据由Spring存储在模型(请求)中。