2015-02-09 110 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