Spring 模型属性覆盖同名的会话属性
Spring Model Attribute overriding the Session Attribute with same name
我是 Spring 世界的新手,正在尝试一些与 Spring MVC 和会话处理相关的事情。
我的问题是,如果我们有同名的模型属性和会话属性,那么模型属性是否会覆盖会话属性的值?
在下面的代码片段中(抱歉格式不佳,我是新来的)我将属性名称 sessionAttribute 添加到模型和会话中。在 JSP 中访问相同的属性时,我得到了 Model Attribute 的值([name] as 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";
}
下面是视图 (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>
my question is that if we have Model Attribute and session attribute
of same name then does the Model Attribute overrides the value of
session attribute ?
一般来说,模型和会话是不同的东西,因此模型属性和会话属性是不同的。模型属性是指模型属性(您在视图中拥有),会话属性存储在 http 会话中,因此如果您在一个控制器的会话中添加一个属性然后更改视图,您仍然可以访问添加的属性在另一个。
因此,如果您在控制器方法中,将会话属性添加到会话中将不会覆盖模型属性中的值。
但是,在一种情况下可能会发生这种情况 - 如果您正是出于这个原因使用 Spring 提供的 @SessionAttributes。
在方法执行完成后使用 @SessionAttributes 时,Spring 将从您的模型加载所有属性,并将它们添加到会话中(这样,如果您有相同的名称,它将被覆盖)。下次您尝试从会话访问属性时 - 您将看到模型中的覆盖值。
对我来说,您的情况似乎正在发生这种情况。但是我不知道你是如何配置你的控制器的,所以检查你是否指定了
是否有SessionAttributes。
我是 Spring 世界的新手,正在尝试一些与 Spring MVC 和会话处理相关的事情。
我的问题是,如果我们有同名的模型属性和会话属性,那么模型属性是否会覆盖会话属性的值?
在下面的代码片段中(抱歉格式不佳,我是新来的)我将属性名称 sessionAttribute 添加到模型和会话中。在 JSP 中访问相同的属性时,我得到了 Model Attribute 的值([name] as 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";
}
下面是视图 (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>
my question is that if we have Model Attribute and session attribute of same name then does the Model Attribute overrides the value of session attribute ?
一般来说,模型和会话是不同的东西,因此模型属性和会话属性是不同的。模型属性是指模型属性(您在视图中拥有),会话属性存储在 http 会话中,因此如果您在一个控制器的会话中添加一个属性然后更改视图,您仍然可以访问添加的属性在另一个。
因此,如果您在控制器方法中,将会话属性添加到会话中将不会覆盖模型属性中的值。
但是,在一种情况下可能会发生这种情况 - 如果您正是出于这个原因使用 Spring 提供的 @SessionAttributes。
在方法执行完成后使用 @SessionAttributes 时,Spring 将从您的模型加载所有属性,并将它们添加到会话中(这样,如果您有相同的名称,它将被覆盖)。下次您尝试从会话访问属性时 - 您将看到模型中的覆盖值。
对我来说,您的情况似乎正在发生这种情况。但是我不知道你是如何配置你的控制器的,所以检查你是否指定了 是否有SessionAttributes。