SpringMVC--04三个域对象

三个域对象

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";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值