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
@SessionAttributes("user") public class SessionAttributesController {
@RequestMapping(value = "/login") public String login(@RequestParam("loginname") String loginname, @RequestParam("password") String password, Model model) { User user = new User(); user.setLoginname(loginname); user.setPassword(password); user.setUsername("admin"); model.addAttribute("user", 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
当中的属性名称