• 【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

    获取成功。


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

    --不要用肉体的勤奋,去掩盖思考的懒惰--
  • 相关阅读:
    CREATE AGGREGATE
    技术文档列表
    jQuery 判断表单中多个 input text 中至少有一个不为空
    Java实现 蓝桥杯 算法提高 奥运会开幕式
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
  • 原文地址:https://www.cnblogs.com/pingguo-softwaretesting/p/15142719.html
Copyright © 2020-2023  润新知