3.11 @SessionAttributes注解

3.11 @SessionAttributes注解

用途:将Model中的指定属性 转存到 HttpSession对象中

org.springframework.web.bind.annotation.SessionAttributes注解允许我们有选择地指定Model中的哪些属性转存到HttpSession对象当中

属性

使用@Sessionattributes注解可指定如下表所示的属性。

属性 类型 是否必要 说明
names String数组 Model中要存储到HttpSession当中的属性名称
value String数组 names属性的别名
types Class<?>数组 指示参数是否必须绑定

使用范围:类

@SessionAttributes注释只能声明在类上,而不能声明在方法上。

示例 @SessionAttributes注解的使用

项目结构

展开/折叠
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
G:\Desktop\随书源码\Spring+Mybatis企业应用实战(第2版)\codes\03\SessionAttributesTest
├─src\
│ └─org\
│ └─fkit\
│ ├─controller\
│ │ └─SessionAttributesController.java
│ └─domain\
│ └─User.java
└─WebContent\
├─index.jsp
├─META-INF\
│ └─MANIFEST.MF
└─WEB-INF\
├─content\
│ └─welcome.jsp
├─lib\
│ ├─commons-logging-1.2.jar
│ ├─spring-aop-5.0.1.RELEASE.jar
│ ├─spring-aspects-5.0.1.RELEASE.jar
│ ├─spring-beans-5.0.1.RELEASE.jar
│ ├─spring-context-5.0.1.RELEASE.jar
│ ├─spring-context-indexer-5.0.1.RELEASE.jar
│ ├─spring-context-support-5.0.1.RELEASE.jar
│ ├─spring-core-5.0.1.RELEASE.jar
│ ├─spring-expression-5.0.1.RELEASE.jar
│ ├─spring-instrument-5.0.1.RELEASE.jar
│ ├─spring-jcl-5.0.1.RELEASE.jar
│ ├─spring-jdbc-5.0.1.RELEASE.jar
│ ├─spring-jms-5.0.1.RELEASE.jar
│ ├─spring-messaging-5.0.1.RELEASE.jar
│ ├─spring-orm-5.0.1.RELEASE.jar
│ ├─spring-oxm-5.0.1.RELEASE.jar
│ ├─spring-test-5.0.1.RELEASE.jar
│ ├─spring-tx-5.0.1.RELEASE.jar
│ ├─spring-web-5.0.1.RELEASE.jar
│ ├─spring-webflux-5.0.1.RELEASE.jar
│ ├─spring-webmvc-5.0.1.RELEASE.jar
│ └─spring-websocket-5.0.1.RELEASE.jar
├─springmvc-config.xml
└─web.xml

SessionAttributesController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package org.fkit.controller;

import org.fkit.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
// 将Model中名为user的的属性转存HttpSession对象当中
@SessionAttributes("user")
public class SessionAttributesController
{

// 该方法映射的请求为http://localhost:8080/SessionAttributesTest/login
// 把表单提交的请求参数loginname赋值给方法的loginname参数
@RequestMapping(value = "/login")
public String login(@RequestParam("loginname") String loginname,
@RequestParam("password") String password, Model model)
{
// 创建User对象,装载用户信息
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
user.setUsername("admin");
// 将user对象添加到Model当中
model.addAttribute("user", user);
// 浏览器端重定向到其他请求处理方法,这样会重新生成一个请求对象
// 因为是新的对象,所以request作用域内将不再存在user属性
return "redirect:/sessionScope";
}
@RequestMapping(value = "/sessionScope")
public String sessionScope()
{
return "welcome";
}
}

index.jsp

接下来创建一个登录页面index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试@SessionAttributes注解</title>
</head>
<body>
<h3>测试@SessionAttributes注解</h3>
<form action="login" method="post">
<table>
<tr>
<td><label>登录名: </label></td>
<td><input type="text" id="loginname"
name="loginname"></td>
</tr>
<tr>
<td><label>密码: </label></td>
<td><input type="password" id="password"
name="password"></td>
</tr>
<tr>
<td><input id="submit" type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>

welcome.jsp

最后创建一个查看作用域中属性数据的页面welcome.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试@SessionAttributes注解</title>
</head>
<body>
<table border="1px">
<tr>
<th>作用域</th>
<th>登陆名</th>
<th>用户名</th>
<th>密码</th>
</tr>
<tr>
<td>访问request作用范围域中的user对象:</td>
<!-- 不存在,将什么也不显示 -->
<td>${requestScope.user.loginname }</td>
<td>${requestScope.user.username }</td>
<td>${requestScope.user.password }</td>
</tr>
<tr>
<td>访问session作用范围域中的user对象:</td>
<td>${sessionScope.user.loginname }</td>
<td>${sessionScope.user.username }</td>
<td>${sessionScope.user.password }</td>
</tr>
</table>
</body>
</html>

测试

在浏览器中输入如下URL来测试应用:

1
http://localhost:8080/SessionAttributesTest/

输入登录名"小明",密码"XiaoMing",单击”登录”按钮。请求将会被提交到SessionAttributesController类的login方法,该方法将会创建User对象来保存数据并将其设置到Model当中。
因为类上面使用了@SessionAttributes注解,所以**User同时也会被设置到HttpSession作用域当中**。方法执行完后会跳转到欢迎界面,欢迎页面内容如下:

1
2
3
作用域     登陆名     用户名     密码
访问request作用范围域中的user对象: 小明 admin XiaoMing
访问session作用范围域中的user对象: 小明 admin XiaoMing

可以看到,User对象被成功设置到HttpSession作用域当中。

@SessionAttributes其他写法

@SessionAttributes还有如下写法:

1
@SessionAttributes(types={User.class}, value="user")

还可以设置多个对象到HttpSession当中:

1
@SessionAttributes(types={User.class, Dept.class}, value=("user","dept"))

其中

  • types属性用来指定放入HttpSession当中的对象类型
  • value属性或者name属性用来指定Model中要存储到HttpSession当中的属性名称