六.访问作用域
1.访问request
作用域
@ModelAttribute(key)
该注解默认操作request作用域
- 当该注解标注在方法的参数上时
- 表示默认将当前的方法的参数存储到request作用域中
- 可以在request作用域中对该参数的数据进行读写
- 存储到request作用域中数据的key即为注解的参数
- 存储到request作用域中数据的value即为参数的值
- 当方法的参数是一个对象,且该对象没有被任何注解所标注的时候
- 默认自动增加
@ModelAttribute(key)
注解
- 默认自动增加
- 该注解的参数也可以省略,默认使用当前方法参数的变量名
- 当注解的key与参数的变量名不一致时,注解属性不能省略
- 当该注解标注在方法上时
- 此时该方法不需要添加
@RequestMapping(url)
注解 - 表示当前方法并不是用于直接访问的,而是与其他方法共同被访问
- 而是此时不管运行当前Controller中的哪一个方法
- 都会先执行当前方法
- 表示方法会在当前Controller中任意一个方法被调用时优先执行
- 即:不管运行哪一个方法,都会先执行被
@ModelAttribute(key)
所标注的方法
- 即:不管运行哪一个方法,都会先执行被
- 应用场景
- 当一个Contoller中多个方法需要处理同一个业务的时候
- 可以将这个业务封装到一个方法中,使用该注解进行标注
- 此时数据在request中存储方式如下
- 存储数据的key即为当前注解的参数
- 存储数据的value即为当前方法的返回值
- 此时该方法不需要添加
@Controller
@RequestMapping("/req")
public class HttpServletRequestController {
@RequestMapping("/f1")
public String f1(HttpServletRequest request){
User user = new User();
user.setUsername("admin");
request.setAttribute("user",user);
return "scope";
}
@RequestMapping("/f2")
public String f2(User user){
user.setUsername("f2");
return "scope";
}
@RequestMapping("/f3")
public String f3(@ModelAttribute User user){
user.setUsername("f3");
return "scope";
}
@RequestMapping("/f4")
public String f4(@ModelAttribute("u") User user){
user.setUsername("f4");
return "scope";
}
@ModelAttribute("users")
public List<User> f5(){
List<User> users = new ArrayList<>();
User user = new User();
user.setId(1);
user.setUsername("admin");
User user2 = new User();
user2.setId(2);
user2.setUsername("alice");
User user3 = new User();
user3.setId(3);
user3.setUsername("jack");
users.add(user);
users.add(user2);
users.add(user3);
return users;
}
}
2.访问session
作用域
@SessionAttributes(key)
- 当类被
@SessionAttribute(key)
进行标注的时候- 表示当操作作用域的数据的时候,如果遇到key为注解的参数的时候
- 将会在session中进行操作,此时request作用域中仍然存在数据
- 当方法的参数没有添加注解
@ModelAttribute
的时候- 此时作用域中如果没有数据
- 则不会自动添加@ModelAttribute注解,返回null
- 当方法的参数添加注解
@ModelAttribute
的时候- 表示一定会从session作用域中取数据
- 如果session作用域中没有数据,则报错
- 当执行清除session的操作的时候
- 如果当前类使用
@SessionAttributes
进行标注之后- 则无法使用原有的方式进行清除
- 需要使用Spring提供的对象SessionStatus进行清除操作
- 该方法只会单独清理session中的数据
- 不会影响到原有的request中的数据
- 当类没有使用
@SessionAttribute
进行标注的时候- 仍然可以使用HttpSession提供的方法进行清除
- 如果当前类使用
@Controller
@SessionAttributes("user")
@RequestMapping("/session")
public class SessionController {
@RequestMapping("/f1")
public String f1(HttpSession session){
User user = new User();
user.setId(1);
user.setUsername("admin");
session.setAttribute("user",user);
return "scope";
}
@RequestMapping("/f2")
public void f2(HttpSession session){
User user = (User) session.getAttribute("user");
System.out.println(user);
}
@RequestMapping("/f3")
public String f3(User user){
user.setUsername("admin");
return "scope";
// 此时的数据是存放在request作用域中的
// 因为当参数是一个对象的时候,默认添加@ModelAttribute注解
// 此时可以在类上加一个@SessionAttributes(key)注解
// 表示当操作作用域的数据的时候,如果遇到key为注解的参数的时候
// 将会在session中进行操作,此时request作用域中仍然存在数据
}
@RequestMapping("/f4")
public void f4(User user){
System.out.println(user.getUsername());
// 当参数没有添加注解的时候,此时作用域中如果没有数据
// 则不会自动添加@ModelAttribute注解
// 则返回null
}
@RequestMapping("/f5")
public void f5(@ModelAttribute User user){
System.out.println(user.getUsername());
// 当参数添加了注解之后,表示一定会从session作用域中取数据
// 如果session作用域中没有数据,则报错
}
@RequestMapping("/f6")
public String f6(HttpSession session){
session.invalidate();
return "scope";
// 在做清除session数据的操作的时候
// 如果当前类使用@SessionAttributes进行标注之后
// 则无法使用原有的方式进行清除
// 当类没有使用@SessionAttribute进行标注的时候
// 仍然可以使用HttpSession提供的方法进行清除
}
@RequestMapping("/f7")
public String f7(SessionStatus status){
// 当类被@SessionAttributes标注的时候
// 需要使用Spring提供的对象SessionStatus进行清除操作
// 该方法只会单独清理session中的数据
// 不会影响到原有的request中的数据
status.setComplete();
return "scope";
}
}