第五章 响应数据传出

springmvc前端控制器是一个servlet 不是一个filter
request 用完就销毁了 效率高

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

可以在方法处传入Map 或者Model或者ModelMap 给这些参数里面保存的所有数据都会放在域中,可以在页面获取
研究为什么会放在request中
Map、Model、ModelMap 最终都是BindingAwareModelMap在工作 相当于给BindingAwareModelMap中保存的东西保存放在请求域中
图片说明
Map(interface(jdk))
Model 独立spring接口
图片说明
ModelMap(class) <----是Map下面的class
图片说明

BindingAwareModelMap
图片说明
ExtendedModelMap
图片说明

  • Map 及 Model: 入参为 org.springframework.ui.Model、
    org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
    request:${requestScope.msg}《br>
    session:${sessionScope.msg}《br>
    Application:${ApplicationScope.msg}《br>
    pageContext:${pageScope.msg}《br>
    Map的数据放在request中
    @RequestMapping("requ")
      public String getBook(Map<String,String> map) {
          map.put("msg","你好");
          return "hello";
      }
    图片说明
    @RequestMapping("requ")
      public String getBook(Model model) {
          model.addAttribute("msg","你好");
          return "hello";
      }
    效果同上
      @RequestMapping("requ")
      public String getBook(ModelMap modelmap) {
          modelmap.addAttribute("msg","你好");
          return "hello";
      }

ModelAndView : View就是我们要访问的页面 放在请求域中 request

  • ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
  • 方法的返回值可以变为ModelAndView类型 既包含视图信息(页面地址)也包含模型数据(给页面带的数据)而且数据是放在请求域中
    @RequestMapping("requ")
      public ModelAndView getBook() {
          ModelAndView modelview = new ModelAndView();
          modelview.addObject("msg", "aha");
          modelview.setViewName("hello");
          return modelview;
      }
    ModelAndView modelview = new ModelAndView("hello");
    之前的返回值 我们叫做视图名 视图名解析器是会帮我们最终拼串得到真实的真实地址
  • @SessionAttributes: 将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性 由springmvc提供 只能标志在类上
    @SessionAttributes(只能标在类上),@SessionAttributes(value-"msg") 给BindingAwareModelMap中保存的数据,同时给session中放一份,value指定保存数据是要给session中放的数据的key
    后来推荐@SessionAttributes就别用了 ,可能引发异常:给session中放数据使用原生API

    @SessionAttributes(value= {"msg","hah"},types = {String.class}) //types只要是String类型 通通都放倒里面去
    @Controller
    public class MyController {
      @RequestMapping("requ")
      public ModelAndView getBook() {
          ModelAndView modelview = new ModelAndView();
          modelview.addObject("msg", "aha");
          modelview.setViewName("hello");
          return modelview;
      }
    }
    ${sessionScope.hah} 都是String 通过Types来设置String类型
  • @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中 Mybatis后被低落
    业务场景 代码:对象的变量存在null 会导致修改到数据库 改值为null mybatis会更新动态sql语句

    @RequestMapping("requ")
      /*
       * 实际上书名是不允许改的 所以前端传过来的书名为null 不存在的字段不要在sql语句中 (但会出现多余的",")
       * 考虑不是mybatis的动态sql
       * springMVC 会直接在参数位置来写Book对象 自动粉装 没有带的值为null
       * 
       * 解决sql都是全字段 但又是对象可能会缺乏某些值
       * 先从数据库提取出来数据 ,然后将前端发送过来的数据覆盖到数据库读取的数值上  避免某些字段存在null值 
       *   这种效果也就是@ModelAttribute
       */
      public String getBook(Book book) {
          System.out.println(book);
          String sql = "update bs_book set bookName = ? ,bookValue = ? Where personName = ? ";
          return "hello";
      }

    图片说明
    注解的位置:参数、【方法位置:这个方法就会提前于目标方法先运行】 可以提前查出从数据库获取信息

    《form action="requ">
      《p>西游记《/p>
      《input type="text" name="bookValue" value="98.9">
      《input type="text" name="personName" value="陈志男">
      《input type="submit" name="提交">
    《/form>
    @Controller
    public class MyController {
      /*
       * 实际上书名是不允许改的 所以前端传过来的书名为null 不存在的字段不要在sql语句中 (但会出现多余的",")
       * 考虑不是mybatis的动态sql
       * springMVC 会直接在参数位置来写Book对象 自动粉装 没有带的值为null
       * 
       * 解决sql都是全字段 但又是对象可能会缺乏某些值
       * 先从数据库提取出来数据 ,然后将前端发送过来的数据覆盖到数据库读取的数值上
       */
      @RequestMapping("requ")
      public String getBook(@ModelAttribute("book") Book book) {
          // 可以告诉springmvc 不要new 这个 book 我刚才保存了一个book 用我这个book
          System.out.println(book);
          String sql = "update bs_book set bookName = ? ,bookValue = ? Where personName = ? ";
          return "hello";
      }
      @ModelAttribute
      public void prePro(Map map) {
          Book book = new Book();
          book.setBookName("西游记");
          map.put("book", book);
          System.out.println("ModelAttribute.....");
      }
    }

    图片说明
    原理

    @Controller
    public class MyController {
      Object a1 ;
      Object a2 ;
      @RequestMapping("requ")
      public String getBook(@ModelAttribute("book") Book book,Model model) {
          a1 = model;
          System.out.println("model==map?"+(a1==a2));
          return "hello";
      }
      @ModelAttribute
      public void prePro(Map map) {
          a2 = map;
          Book book = new Book();
          book.setBookName("西游记");
          map.put("book", book);
          System.out.println("ModelAttribute.....");
      }
    }

    图片说明
    图片说明
    获取
    图片说明

处理模型数据之 ModelAndView

  • 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
  • 添加模型数据:
    MoelAndView addObject(String attributeName, Object attributeValue)
    ModelAndView addAllObject(Map<String, ?> modelMap)
  • 设置视图:
    void setView(View view)
    void setViewName(String viewName)

处理模型数据之 Map

Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据
具体使用步骤

  • Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
  • 如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。
  • 在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据
    图片说明
    图片说明
全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务