好的!本节我们介绍SpringMVC使用@SessionAttributes和@ModelAttribute 注解
SpringMVC使用@SessionAttributes注解
若希望在多个请求之间共用某个模型属性数据,则可以在控制器上标注@SessionAtrributes,SpringMVC将在模型中对映属性暂存在HttpSession中。
在前面的user类中创建user的构造器:
public User(String username, String password, String email, int age) {
this.username = username;
this.password = password;
this.email = email;
this.age = age;
}
controller:
@RequestMapping("/testSessionAttributes")
public String testSessionAtrributes(Map<String,Object> map){
User user = new User("tom","1222","chuanlei@qq.com",15);
map.put("user",user);
map.put("school","yizhong");
return "success";
}
在controller类的头部加入@SessionAttributes注解,value = “user”,对应map中的key,也可以使用type对应,如此例中的type = String.class,可对应school这个String类型数据。
html:
<a href="/springmvc/testSessionAttributes">test SessionAttributes</a>
success.html:
<html>
<body>
success
<br><br>
time:${requestScope.time}
<br><br>
names:${requestScope.names}
<br><br>
School:${sessionScope.school}
<br><br>
user:${requestScope.user}
<br><br>
user:${sessionScope.user}
</body>
</html>
结果:
SpringMVC使用@ModelAttribute注解
被@ModelAttribute注释的方法会在此controller每个方法执行前被执行
为User对象添加id
package com.xcl.entities;
/**
* @author chuanlei.xu
* @version 1.0
* @date 2019/2/27 15:06
*/
public class User {
private Integer id;
private String username;
private String password;
private String email;
private int age;
private Address address;
public User(String username, String password, String email, int age) {
this.username = username;
this.password = password;
this.email = email;
this.age = age;
}
public User(){
}
public User(Integer id, String username, String password, String email, int age) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.age = age;
}
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
controller:
//被@ModelAttribute注释的方法会在此controller每个方法执行前被执行
@ModelAttribute
public void getUser(@RequestParam(value = "id",required = false) Integer id,Map<String,Object> map){
if(id != null){
User user = new User(1,"Tom","123456","Tom@qq.com",12);
//System.out.println("模拟从数据库中取一个对象"+user);
map.put("user",user);
}
}
/**
*运行流程:
* 1.执行@ModelAttribute 注解修饰的方法:从数据库中取出对象,把对象放入到map中,键为user
* 2.SpringMVC从map中取出User对象,并把表单中的请求参数赋给该User对象 的对应属性
* 3.SpringMVC 把上述对象传入目标方法的参数
*
* 注意:在@ModelAttribute 修饰的方法中放入到map 时的键需要和目标方法入参类型的第一个字母小写的字符串一致!
*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("change:"+user);
return "success";
}
index.html:
<!--
模拟修改操作:
1.原始数据为:1,Tom,123456,tom@qq.com,12
2.原始密码不能被修改
3.表单回显,模拟操作直接在表单填写对应的属性值
-->
<form action="/springmvc/testModelAttribute" method="post">
id:<input type="hidden" name="id" value="1">
username:<input type="text" name="username" value="Tom">
<br>
email:<input type="text" name="email" value="tom@qq.com">
<br>
age:<input type="text" name="age" value="12">
<br>
<input type="submit" value="Submit">
</form>
结果:
- github 地址
https://github.com/chuanleixu/SpringMVC_Tutorials