2015-02-09 134 views
2

我对Spring世界很陌生,尝试了一些与Spring MVC和会话处理相关的内容。春季模型属性覆盖与同名的会话属性

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

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

@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"; 
} 

下面是视图(someViewName),它是印刷sessionAttribute的值作为模型属性

<%@ 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> 
+0

您正在将'''ssionAttribute''添加到HttpSession中,然后从中读取。为什么必须打印其他内容('''hs.getAttribute(“sessionAttribute”)'''正在从session中获取:))?在这里看到一个主题btw,http://stackoverflow.com/questions/3423262/what-is-modelattribute-in-spring-mvc – vtor 2015-02-09 11:24:36

+0

用更多的细节更新了这个问题。 在控制器中,我获得了预期的价值,但在访问会话属性的JSP中,我获得了模型属性的价值。 – 2015-02-09 11:41:28

+1

我想你需要检查这个:http://stackoverflow.com/questions/16383439/spring-mvc-difference-between-httpsession-setattribute-and-model-addobject – 2015-02-09 13:40:10

回答

0

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

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

所以,如果你在你的控制器方法中,将会话属性添加到会话中将不会覆盖模型属性中的值。

但是,这可能发生在一种情况 - 如果您正在使用由Spring提供的@SessionAttributes正是出于这个原因。

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

对我来说,它看起来像是在你的情况发生。但是,我不知道如何配置控制器,因此请检查是否指定了 SessionAttributes。

+0

非常感谢vtorosyan :) – 2015-02-11 06:42:03