三个域对象
request域对象
- 接口名:HttpServletRequest
- request对象代表了一次请求,
- 使用请求域的业务场景:
- 在A资源中通过转发的方式跳转到资源B,因此从A到B是一次请求,如果想让A资源和B资源共享一个数据,可以将数据存储到request域中
原生Servlet API实现request域共享
// 使用request.setAttribute添加键值对到request域对象
@RequestMapping("/login")
public String login(HttpServletRequest request){
String uid = request.getParameter("uid");
if(uid.equals("123")){
request.setAttribute("codeInfo", "success");
}else{
request.setAttribute("codeInfo", "fail");
}
return "codeInfo";
}
<!-- 通过thymeleaf模板引擎语法获取request域值 -->
<div th:text="${codeInfo}"></div>
使用Model接口完成request域共享
使用方法同原生Servlet API,由于没使用Servlet API更有利于进行单元测试
@RequestMapping("/login")
public String login(Model model){
// 注意区分,原生是set,model是add
model.addAttribute("codeInfo", "fail");
return "codeInfo";
}
使用Map接口完成request域数据共享
@RequestMapping("/login")
public String login(Map<String,Object> map){
map.put("codeInfo", "fail");
return "codeInfo";
}
使用ModelMap类完成request域数据共享
@RequestMapping("/login")
public String login(ModelMap modelMap){
modelMap.addAttribute("codeInfo", "fail");
return "codeInfo";
}
Model,Map,ModelMap三者关系
这三个不同的类和接口底层都使用了同一个对象:org.springframework.validation.support.support.BindingAwareModelMap
BindingAwareModelMap继承了ExtendModelMap类
ExtendedModelMap继承了ModelMap类
ExtendedModelMap实现了Model接口
使用ModelAndView类实现request域数据共享
该类封装了Model和View能更好的体现MVC架构模式
@RequestMapping("/login")
// 返回类型为ModelAndView对象
public ModelAndView login(){
// 创建模型视图对象
ModelAndView mv = new ModelAndView();
// 绑定返回视图
mv.setViewName("codeInfo");
// 绑定request域数据
mv.addObject("codeInfo","success");
// 返回模型视图对象
return mv;
}
无论使用了那种方法设置request域数据,其底层都是创建了一个ModelAndView对象,之后将这个对象返回给DispatcherServlet
session域对象
- 接口名:HttpSession
- session对象代表了一次会话。从打开浏览器开始访问,到最终浏览器关闭,这是一次完整的会话。每个会话session对象都对应一个JSESSIONID,而JSESSIONID生成后以cookie的方式存储在浏览器客户端。浏览器关闭JSESSIONID失效,会话结束
- 会话域业务场景:
- 在A资源中通过重定向的方式跳转到资源B,因为是重定向,因此从A到B是两次请求,如果想让A资源和B资源共享同一个数据,可以将数据存储在session域中
- 登录成功后保存用户的登录状态
使用原生Servlet API
@RequestMapping("/login")
public String login(HttpSession session){
// 向会话域存储数据
session.setAttribute("sessionid", "123");
return "codeInfo";
}
使用SessionAttributes注解
// 使用同设置request域的ModelMap方法
// 需要在控制器类加上@SessionAttributes注解来指定需要加入session域中数据的key
@Controller
@RequestMapping("/user")
@SessionAttributes(value={"x","y"})
public class UserController {
@RequestMapping("/login")
public String login(ModelMap modelMap){
modelMap.addAttribute("x", "this is session x");
modelMap.addAttribute("y", "this is session y");
return "codeInfo";
}
}
application域对象
- 接口名:ServletContext
- application对象代表了整个web应用,服务器启动时创建,服务器关闭时销毁,对于一个web应用来说,application对象只有一个
- 应用域业务场景:记录网站的在线人数
使用原生Servlet API实现
@RequestMapping("/login")
public String login(HttpServletRequest request){
// 获取application对象,实际上就是获取ServletContext对象
ServletContext application = request.getServletContext();
application.setAttribute("testApplicationScope","this is ApplicationScope info")
return "codeInfo";
}