zoukankan      html  css  js  c++  java
  • 【SpringMVC 从 0 开始】域对象共享数据

    一、域对象

    1. 域对象的作用

    就是在一定范围内可以共享数据,通常有 3 种:

    • request: 一次请求,多个资源共享数据
    • session: 默认一次会话,多个请求,多个资源共享数据
    • servletContext: 一个应用,多个会话,多个请求,多个资源共享同一份数据

    2. 域对象生命周期

    • request: 创建-请求开始,销毁-响应结束
    • session: 创建-第一次调用,销毁- tomcat超时三十分钟(默认)、或者手动调用invalidate()、或者服务器非正常关闭
    • servletContext: 创建-启动时,销毁-关闭时

    3. 使用原则

    在满足需求的前提下,能选择小范围的就不选择大范围的。

    举例,一个查询列表场景,这种一般放在 request 域中,当然了放在更大的2个里面也可以,但是没必要。

    因为除了查询还同时会存在增删改的功能,所以我们要每次去查询一次才可以保证数据是最新的,这时候如果放在更大的域比如 session 中,那么在一次请求中只会用到一次,其他时候这个空间就浪费掉了。

    二、向域对象共享数据

    1. 向 request 域对象共享数据

    (1)使用 servletAPI 向 request 域对象共享数据

    @Controller
    public class ScopeController {
        @RequestMapping("/testServletAPI")
        public String testServletAPI(HttpServletRequest request){
            request.setAttribute("testScope", "hello,servletAPI");
            return "success";
        }
    }
    

    在控制器方法里,设置 request 域对象中的数据,key 是testScope,value是"hello,servletAPI",最后这个请求转发到了 success.html 上。

    那么在 success.html 中就可以获得域对象中的数据了,直接使用 key:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p>success</p>
    <p th:text="${testScope}"></p>
    </body>
    </html>
    

    现在访问http://localhost:8080/springmvc/testServletAPI

    可以看到展示出了获取到的 request 域中共享的数据。

    (2)使用 ModelAndView 向 request 域对象共享数据

    ModelAndView 有 Model和 View的功能,Model主要用于向请求域共享数据,View主要用于设置视图,实现页面跳转。这种也是 springMVC 建议使用的方式。

    注意控制器方法必须要返回 ModelAndView 类型的对象。

    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        /**
         * ModelAndView有Model和View的功能
         * Model主要用于向请求域共享数据
         * View主要用于设置视图,实现页面跳转
         */
        ModelAndView mav = new ModelAndView();
        //向请求域共享数据
        mav.addObject("testScope", "hello,ModelAndView");
        //设置视图,实现页面跳转
        mav.setViewName("success");
        return mav;
    }
    

    访问一下http://localhost:8080/springmvc/testModelAndView

    获取成功。

    (3)使用 Model 向 request 域对象共享数据

    这里的 Model 其实就是上面 ModelAndView 中的 Model 。

    @RequestMapping("/testModel")
    public String testModel(Model model){
        model.addAttribute("testScope", "hello,Model");
        return "success";
    }
    

    测试一下:

    获取成功。

    (4)使用 map 向 request 域对象共享数据

    还可以使用 map 集合来实现,这时候向 map 集合中存放的数据,就是要共享的数据:

    @RequestMapping("/testMap")
    public String testMap(Map<String, Object> map){
        map.put("testScope", "hello,Map");
        return "success";
    }
    

    测试一下:

    获取成功。

    (5)使用 ModelMap 向 request 域对象共享数据

    @RequestMapping("/testModelMap")
    public String testModelMap(ModelMap modelMap){
        modelMap.addAttribute("testScope", "hello,ModelMap");
        return "success";
    }
    

    测试一下:

    获取成功。

    Model、ModelMap、Map的关系

    Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的。

    分别查看源码可知如下关系:

    public interface Model{}
    
    public class ModelMap extends LinkedHashMap<String, Object> {}
    
    public class ExtendedModelMap extends ModelMap implements Model {}
    
    public class BindingAwareModelMap extends ExtendedModelMap {}
    

    2. 向 session 域共享数据

    直接使用 servlet 原生的 HttpSession 即可:

    @RequestMapping("/testSession")
    public String testSession(HttpSession session){
        session.setAttribute("testSessionScope", "hello,session");
        return "success";
    }
    

    success 页面也需要修改了,通过 session.testSessionScope获取数据展示:

    ... ...
    <p th:text="${session.testSessionScope}"></p>
    ... ...
    

    重新部署访问http://localhost:8080/springmvc/testSession

    3. 向 application 域共享数据

    其实这里的 application 指的就是 ServletContext 对象,用 session.getServletContext() 来获取即可:

    @RequestMapping("/testApplication")
    public String testApplication(HttpSession session){
    	ServletContext application = session.getServletContext();
        application.setAttribute("testApplicationScope", "hello,application");
        return "success";
    }
    

    success.html 修改:

    ... ...
    <p th:text="${application.testApplicationScope}"></p>
    ... ...
    

    重新部署访问http://localhost:8080/springmvc/testApplication

    获取成功。


    感谢《尚硅谷》的学习资源。

    --不要用肉体的勤奋,去掩盖思考的懒惰--
  • 相关阅读:
    mfc判断当前程序是否正在运行
    mfc通过信号量保证线程同步
    delete和析构函数
    获取当前运行的exe路径
    mfc移动文件夹
    Cmake实现样例
    安装Node.js以及Hexo
    分类与回归的关系和区别
    從文本到視覺:各領域最前沿的論文集合
    ubuntu 终端$换行
  • 原文地址:https://www.cnblogs.com/pingguo-softwaretesting/p/15142719.html
Copyright © 2011-2022 走看看