zoukankan      html  css  js  c++  java
  • 第一节:SpringMVC 处理响应数据【1】

    一、SpringMVC 输出模型数据概述

      JavaWEB 中的响应数据常用的操作有:
    (1)在域对象中存取数据 如:request.setAttribute(),request.getAttribute(),request.removeAttribute()
    (2)请求转发:request.getRequestDispatcher("地址").forward(req,resp);
    (3)重定向:response.sendRedirect();
    

      

      SpringMVC 提供了几种途径输出模型数据:

      Map、Model 和 ModelMap入参为 org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。

      ModelAndView:处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据;

      @SessionAttributes:将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性

      @ModelAttribute:方法入参标注该注解后, 入参的对象就会放到数据模型中

    二、处理模型数据之 Map,Model,ModelMap

      1、Spring MVC 在内部使用了一个 org.springframwork.ui.Model 接口存储模型数据;
      2、Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器;
      3、如果方法的形参为 Map、ModelMap 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这个形参
      4、在方法体内,开发者可以通过这个形参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据;

        可以在方法处传入Map、或者 Model 或者 ModelMap,给这些参数里面保存的所有数据都会放在【请求】域中,可以在页面获取;

        示例代码

        @RequestMapping(value = "/handle01")
        public String handle01(Map<String, Object> map) {
            System.out.println("map类型:" + map.getClass());
            map.put("msg", "你好");
            map.put("haha", "haha");
            return "success";
        }
    
        /**
         * Model:一个接口
         * @param model
         * @return
         */
        @RequestMapping(value = "/handle02")
        public String handle02(Model model) {
            System.out.println("model类型:" + model.getClass());
            model.addAttribute("msg", "你好坏!");
            return "success";
        }
    
        @RequestMapping(value = "/handle03")
        public String handle03(ModelMap modelMap) {
            System.out.println("modelMap类型:" + modelMap.getClass());
            modelMap.addAttribute("msg", "你好棒!");
            modelMap.addAttribute("haha", 18);
            return "success";
        }
     
      Map、Model、ModelMap 和 BindingAwareModelMap 之间的关系

        Map、Model、ModelMap 最终都是 BindAwareModelMap 在工作,

        相当于给 BindAwareModelMap 中保存的东西都会被放在请求域中;

        org.springframework.validation.support.BindingAwareModelMap

       

      

      推荐使用Map,便于框架移植

    三、处理模型数据之 ModelAndView

      方法的返回值可以变成 ModelAndView 类型:即包含视图信息(页面地址)也包含模型数据(给页面带的数据),而且数据是放在请求域中;

       添加模型数据

    MoelAndView addObject(String attributeName, Object attributeValue)
    
    ModelAndView addAllObject(Map<String, ?> modelMap)
    

      

      设置视图

    void setView(View view)            设置视图对象
    
    void setViewName(String viewName)  设置视图名字

      获取模型数据:

    protected Map<String, Object> getModelInternal()         获取模型数据
    public ModelMap getModelMap()
    public Map<String, Object> getModel()
    

      

      示例:

        //返回值是ModelAndView,可以为页面携带数据
        @RequestMapping("/handle04")
        public ModelAndView handle04(){
            //之前的返回值我们就叫视图名;视图名视图解析器是会帮我们最终拼串得到页面真实地址
            //ModelAndView mv = new ModelAndView("success0");
            ModelAndView mv = new ModelAndView();
            mv.setViewName("success0");
    
            mv.addObject("msg","嗨起来");
            return mv;
        }
     
      三种方式实现作用域放值
    1. 使用 ModelAndView
    2. 使用 Map
    3. 使用 Model 或 ModelMap
    

      

        不管使用以上哪种方式,最后都会把Model数据和View数据封装成 ModelAndView 对象中。

    四、处理模型数据之 SessionAttributes 注解

      若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes, Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。

      @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中;

      如果满足类型或者value值,给BindingAwareModelMap 中保存的数据或者 ModelAndView中 的数据,则会在session域中也存放一份设置的键值对;

      可以通过 value 指定保存数据时要给 session 中放的数据的 key

      使用

    value = {"msg", "haha"}:只要保存的是这种 key 的数据,给 session 中放一份
    types = {String.class}:只要保存的是这种类型的数据,给 session 中也放一份
    

      示例:

    ① @SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
    
    ② @SessionAttributes(value={“user1”, “user2”})
    
    ③ @SessionAttributes(types={User.class, Dept.class})
    
    ④ @SessionAttributes(value={“user1”, “user2”}, types={Dept.class})
    

      控制器:

    @Controller
    //@SessionAttributes("user")
    @SessionAttributes(value={"user"},types={String.class})
    public class SpringMVCController {
    /**
     * @SessionAttributes
     *  除了可以通过属性名指定需要放到会话中的属性外(实际上是通过value指定key值),
     *  还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上是通过types指定类型)
     * 注意:只能放在类的上面,不能修饰方法
     */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Map<String,Object> map){
        User user = new User("Tom","123","tom@atguigu.com",22);                
        map.put("user", user);
        map.put("school", "atguigu");  
        //默认是被存放到request 域,如果设置了@SessionAttribute注解,就同时存放到session域中
        return "success";
        }
    }

      注意:不推荐使用 @SessionAttributes,可能会引发异常(不可控),如果要给  session 域中存放数据,推荐使用原生 API。

  • 相关阅读:
    C# IP地址与数字之间的互转
    C# 获取本机的所有ip地址,并过滤内网ip
    C# POST数据base64到接口会出错的问题
    C# 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕
    C# 线程池执行操作例子
    输入及词法分析详解
    用java实现编译器-算术表达式及其语法解析器的实现
    用java实现一个简易编译器-语法解析
    用java实现一个简易编译器1-词法解析入门
    模板方法模式
  • 原文地址:https://www.cnblogs.com/niujifei/p/15566726.html
Copyright © 2011-2022 走看看