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

时间:2023-11-27 17:17:26

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:

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

Account.java

 package com.dx.springlearn.entities;

 public class Account {
private String username;
private String password;
private String registerDate;
private String registerIP; public Account() {
} public Account(String username, String password, String registerDate, String registerIP) {
super();
this.username = username;
this.password = password;
this.registerDate = registerDate;
this.registerIP = registerIP;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getRegisterDate() {
return registerDate;
} public void setRegisterDate(String registerDate) {
this.registerDate = registerDate;
} public String getRegisterIP() {
return registerIP;
} public void setRegisterIP(String registerIP) {
this.registerIP = registerIP;
} @Override
public String toString() {
return "Account [username=" + username + ", password=" + password + ", registerDate=" + registerDate
+ ", registerIP=" + registerIP + "]";
} }

修改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

测试2:

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

 @SessionAttributes(value = { "account" })
@Controller
public class TestModelData {
private final String SUCCESS = "success"; @RequestMapping("/testSessionAttribute")
public String testSessionAttribute(Map<String, Object> map) {
Account account = new Account("user1", "pwd123", "2018-01-07", "127.0.0.1");
map.put("account", account); System.out.println("testSessionAttribute:" + map); return SUCCESS;
}
}

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

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

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

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

测试3:

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

修改TestModelData.java

 @SessionAttributes(value = { "my_value_key" }, types = { Account.class, Integer.class })
@Controller
public class TestModelData {
private final String SUCCESS = "success"; @RequestMapping("/testSessionAttribute")
public String testSessionAttribute(Map<String, Object> map) {
Account account = new Account("user1", "pwd123", "2018-01-07", "127.0.0.1");
map.put("account", account);
map.put("my_value_key", "my_value");
Integer age = 30;
map.put("age", age);
Float onlineHours = 129.88f;
map.put("onlineHours", onlineHours); System.out.println("testSessionAttribute:" + map); return SUCCESS;
}
}

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

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

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

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