Spring Model Attribute重写具有相同名称的Session Attribute

时间:2015-02-09 11:11:18

标签: spring model-view-controller

我是Spring世界的新手,并尝试了一些与Spring MVC和会话处理相关的事情。

我的问题是,如果我们有同名的模型属性和会话属性,那么模型属性是否会覆盖会话属性的值?

在下面的代码片段中(对于格式不佳道歉,我是新来的)我在属性名称sessionAttribute中添加了一个属性名称和会话。在JSP中访问相同的属性时,我获得了Model Attribute([name]作为Model Attribute)的值。

@RequestMapping(value="/hello", method=RequestMethod.GET)     
public String hello(@RequestParam(value="username", required=false,defaultValue="World") String name, Model model,HttpServletRequest req) {    
model.addAttribute("sessionAttribute", name+" as Model Attribute");   
System.out.println("In controller");    
HttpSession hs=req.getSession();   
hs.setAttribute("sessionAttribute","overridden Session attribute");     //prints"overridden Session attribute"    
System.out.println(hs.getAttribute("sessionAttribute"));
return "someViewName";
}

下面是View(someViewName),它将sessionAttribute的值打印为Model属性

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Spring4 MVC -HelloWorld</title>
 </head>
  <body>

  <% HttpSession hs=request.getSession();
     String sesstionAttr=(String)session.getAttribute("sessionAttribute");
     out.println(sesstionAttr); //printin [name] as Model Attribute 
  %>

  </body>
 </html>

1 个答案:

答案 0 :(得分:0)

  

我的问题是,如果我们有模型属性和会话属性   同名,然后模型属性覆盖的值   会话属性?

通常,模型和会话是不同的东西,因此模型属性和会话属性是不同的。模型属性是指模型属性(在视图中有),会话属性存储在http会话中,因此如果在一个控制器中的会话中添加一个属性然后更改视图,您仍然可以访问添加的属性在另一个。

因此,如果您在控制器方法内部,则将会话属性添加到会话中将不会覆盖模型属性中的值。

但是,在一种情况下可能会发生这种情况 - 如果您正是因为这个原因使用了Spring提供的@SessionAttributes

在方法执行完成后使用@SessionAttributes时,Spring将加载模型中的所有属性,并将它们添加到会话中(这样,如果您使用相同的名称,它将被覆盖)。下次尝试从会话中访问该属性时,您将看到来自模型的重写值。

对我来说,看起来这种情况正在发生在你的情况下。但是,我不知道您是如何配置控制器的,所以请检查您是否已指定 SessionAttributes与否。