Spring MVC提供了以下几种途径输出模型数据:
1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据;
2)Map及Model:处理方法入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.util.Map时,处理方法返回时,Map中的数据会自动被添加到模型中;
3)@SessionAttributes:将模型中的某个属性暂存到HttpSeession中,以便多个请求之间可以共享这个属性;
4)@ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。

@SessionAttributes

1)若希望在多个请求之间共享某个模型属性数据,则可以在控制器类上标注@SessionAttributes,Spring MVC将在模型中对应的属性暂存到HttpSession中。

测试1:

在TestModelData.java中添加方法testSessionAttribute:

1     @RequestMapping("/testSessionAttribute")
2     public String testSessionAttribute(Map<String, Object> map) {
3         Account account = new Account("user1", "pwd123", "2018-01-07", "127.0.0.1");
4         map.put("account", account);
5 
6         System.out.println("testSessionAttribute:"+map);
7         
8         return SUCCESS;
9     }

Account.java

SpringMVC(十一):SpringMVC 处理输出模型数据之SessionAttributes_数据SpringMVC(十一):SpringMVC 处理输出模型数据之SessionAttributes_SpringMVC_02
 1 package com.dx.springlearn.entities;
 2 
 3 public class Account {
 4     private String username;
 5     private String password;
 6     private String registerDate;
 7     private String registerIP;
 8 
 9     public Account() {
10     }
11 
12     public Account(String username, String password, String registerDate, String registerIP) {
13         super();
14         this.username = username;
15         this.password = password;
16         this.registerDate = registerDate;
17         this.registerIP = registerIP;
18     }
19 
20     public String getUsername() {
21         return username;
22     }
23 
24     public void setUsername(String username) {
25         this.username = username;
26     }
27 
28     public String getPassword() {
29         return password;
30     }
31 
32     public void setPassword(String password) {
33         this.password = password;
34     }
35 
36     public String getRegisterDate() {
37         return registerDate;
38     }
39 
40     public void setRegisterDate(String registerDate) {
41         this.registerDate = registerDate;
42     }
43 
44     public String getRegisterIP() {
45         return registerIP;
46     }
47 
48     public void setRegisterIP(String registerIP) {
49         this.registerIP = registerIP;
50     }
51 
52     @Override
53     public String toString() {
54         return "Account [username=" + username + ", password=" + password + ", registerDate=" + registerDate
55                 + ", registerIP=" + registerIP + "]";
56     }
57 
58 }
View Code

修改index.jsp,添加链接HTML:

<a href="testSessionAttribute">test SessionAttribute</a>

修改/WEB-INF/views/success.jsp,添加HTML脚本:

    SUCCESS PAGE<br>
    testSessionAttribute request:${requestScope.account.username }<br>
    testSessionAttribute session:${sessionScope.account.username }<br>

此时访问index.jsp,并点击链接后条状到success.jsp也页面显示信息如下:

SpringMVC(十一):SpringMVC 处理输出模型数据之SessionAttributes_jsp页面_03

测试2:

此时默认情况下,并没有把account实体存放到HttpSession中,如何才能实现呢?-------修改TestModelData.java,在TestModelData类上添加注解@SessionAttributes:

 1 @SessionAttributes(value = { "account" })
 2 @Controller
 3 public class TestModelData {
 4     private final String SUCCESS = "success";
 5 
 6     @RequestMapping("/testSessionAttribute")
 7     public String testSessionAttribute(Map<String, Object> map) {
 8         Account account = new Account("user1", "pwd123", "2018-01-07", "127.0.0.1");
 9         map.put("account", account);
10 
11         System.out.println("testSessionAttribute:" + map);
12 
13         return SUCCESS;
14     }
15 }

此时重新测试,跳转到success.jsp页面时,显示结果如下:

SpringMVC(十一):SpringMVC 处理输出模型数据之SessionAttributes_数据_04

说明已经把account实体对象存放到map的同时,也存放到了HttpSession中。

2)@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中。

测试3:

上边是通过指定属性名称的方式将account对象存放到HttpSession中的,实际上我们也可以通过指定对象类型实现把某一类对象存放到HttpSession。

修改TestModelData.java

 1 @SessionAttributes(value = { "my_value_key" }, types = { Account.class, Integer.class })
 2 @Controller
 3 public class TestModelData {
 4     private final String SUCCESS = "success";
 5 
 6     @RequestMapping("/testSessionAttribute")
 7     public String testSessionAttribute(Map<String, Object> map) {
 8         Account account = new Account("user1", "pwd123", "2018-01-07", "127.0.0.1");
 9         map.put("account", account);
10         map.put("my_value_key", "my_value");
11         Integer age = 30;
12         map.put("age", age);
13         Float onlineHours = 129.88f;
14         map.put("onlineHours", onlineHours);
15 
16         System.out.println("testSessionAttribute:" + map);
17 
18         return SUCCESS;
19     }
20 }

修改/WEB-INF/views/success.jsp页面:

 1     SUCCESS PAGE<br>
 2     testSessionAttribute request account.username:${requestScope.account.username }<br>
 3     testSessionAttribute session account.username:${sessionScope.account.username }<br>
 4     <br>
 5     testSessionAttribute request my_value_key:${requestScope.my_value_key }<br>
 6     testSessionAttribute session my_value_key:${sessionScope.my_value_key }<br>
 7     <br>
 8     testSessionAttribute request age:${requestScope.age }<br>
 9     testSessionAttribute session age:${sessionScope.age }<br>
10     <br>
11     testSessionAttribute request age:${requestScope.onlineHours }<br>
12     testSessionAttribute session age:${sessionScope.onlineHours }<br>

此时访问链接地址,跳转到success.jsp页面后,显示结果:

SpringMVC(十一):SpringMVC 处理输出模型数据之SessionAttributes_java_05

 

基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
+加关注】。