Spring 模型属性覆盖具有相同名称的会话属性

Posted

技术标签:

【中文标题】Spring 模型属性覆盖具有相同名称的会话属性【英文标题】:Spring Model Attribute overriding the Session Attribute with same name 【发布时间】:2015-04-09 02:38:10 【问题描述】:

我对 Spring 世界很陌生,正在尝试一些与 Spring MVC 和会话处理相关的事情。

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

在下面的代码 sn-p 中(对于格式不好的问题,我是新来的)我正在将属性名称 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>

【问题讨论】:

您正在将sessionAttribute 添加到 HttpSession 中,然后从中读取。为什么它必须打印其他内容(hs.getAttribute("sessionAttribute") 正在从会话中获取 :))?顺便说一句,在这里查看一个主题,***.com/questions/3423262/… 用更多细节更新了问题。在控制器中,我得到了预期的值,但在 JSP 中,访问会话属性时,我得到了模型属性的值。 我认为你需要检查这个:***.com/questions/16383439/… 感谢 Patrick LC 和 vtorosyan,我阅读了这两篇文章,但我仍然感到困惑。请在这里帮助我:) 【参考方案1】:

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

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

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

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

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

对我来说,您的情况似乎正在发生这种情况。但是我不知道您是如何配置控制器的,因此请检查您是否指定了 SessionAttributes 与否。

【讨论】:

非常感谢 vtorosyan :)

以上是关于Spring 模型属性覆盖具有相同名称的会话属性的主要内容,如果未能解决你的问题,请参考以下文章

获取常量文件中具有属性名称的会话属性

如何设置 Spring 会话范围 bean 的属性名称?

是否有理由不在 Core Data 实体中使用相同的属性名称?

我可以有两个具有相同属性名称的对象吗? [复制]

发布具有相同名称属性的表单字段

在 Spring 中读取 2 个具有相同变量名的属性文件