zoukankan      html  css  js  c++  java
  • springMVC响应数据和结果视图

    返回值分类

      1. 返回字符串

        Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

    //指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
    @RequestMapping("/testReturnString")
    public String testReturnString() {
      System.out.println("AccountController 的 testReturnString 方法执行了。。。。");
      return "success";
    }

        具体的应用场景

    @Controller
    @RequestMapping("/user")
    public class UserController {
      /**
      * 请求参数的绑定
      */
      @RequestMapping(value="/initUpdate")
      public String initUpdate(Model model) {
        // 模拟从数据库中查询的数据
        User user = new User();
        user.setUsername("张三");
        user.setPassword("123");
        user.setMoney(100d);
        user.setBirthday(new Date());
        // 如果在类上添加 @SessionAttributes(value= {"xxx"},types={xxx.class}) 注解,
        // 表示把数据也存一份到session域中
        model.addAttribute("user", user); // 把数据保存到request域中
        return "update";
      }
    }
    <h3>修改用户</h3>
    ${ requestScope }
    <form action="user/update" method="post">
      姓名:<input type="text" name="username" value="${ user.username }"><br>
      密码:<input type="text" name="password" value="${ user.password }"><br>
      金额:<input type="text" name="money" value="${ user.money }"><br>
      <input type="submit" value="提交">
    </form>

      2. 返回值是void

        1. 如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。
          默认会跳转到@RequestMapping(value="/initAdd") initAdd的页面。
        2. 可以使用请求转发或者重定向跳转到指定的页面

    @RequestMapping(value="/initAdd")
    public void initAdd(HttpServletRequest request,HttpServletResponse response) throws Exception {
      System.out.println("请求转发或者重定向");
      // 请求转发
      // request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request, response);
      // 重定向
      // response.sendRedirect(request.getContextPath()+"/add2.jsp");
      // 直接响应数据
      response.setCharacterEncoding("utf-8");
      response.setContentType("application/json;charset=utf-8");
      response.getWriter().write("{"name": "lily"}");
    }

      3. 返回值是ModelAndView对象

        ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

    /**
    * 返回ModelAndView对象
    * 可以传入视图的名称(即跳转的页面),还可以传入对象。
    * @return
    * @throws Exception
    */
    @RequestMapping(value="/findAll")
    public ModelAndView findAll() throws Exception {
      ModelAndView mv = new ModelAndView();
      // 跳转到list.jsp的页面
      mv.setViewName("list");
      // 模拟从数据库中查询所有的用户信息
      List<User> users = new ArrayList<>();
      User user1 = new User();
      user1.setUsername("张三");
      user1.setPassword("123");
      User user2 = new User();
      user2.setUsername("赵四");
      user2.setPassword("456");
      users.add(user1);
      users.add(user2);
      // 添加对象,把数据存入request域中
      mv.addObject("users", users);
      return mv;
    }

    转发和重定向

      1.forward请求转发

        controller方法返回String类型,默认就是请求转发。请求转发也可以编写成

    /**
    * 使用forward关键字进行请求转发
    * "forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径
    * @return
    * @throws Exception
    */
    @RequestMapping("/delete")
    public String delete() throws Exception {
      System.out.println("delete方法执行了...");
      // return "forward:/WEB-INF/pages/success.jsp"; // 转发到jsp页面
      return "forward:/user/findAll"; // 转发到控制器
    }
    @RequestMapping("/forward")
        public ModelAndView forward() {
            ModelAndView mv = new ModelAndView();
            // mv.setViewName("forward:/WEB-INF/pages/success.jsp"); // 转发到jsp页面
            mv.setViewName("forward:/hello"); // 转发到控制器
            return mv;
        }

        重定向:

    /**
    * 重定向
    * @return
    * @throws Exception
    */
    @RequestMapping("/count")
    public String count() throws Exception {
      System.out.println("count方法执行了...");
      // springMVC会自动补充完整 http://localhost:8080/项目名
      return "redirect:/add.jsp";
      // return "redirect:/user/findAll";
    }
    /*public ModelAndView redirect() { ...... }*/

          注意:如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到
        RedirectAttributes参数:

          1. 使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如http://localhost:8080/test.jsp?a=a
          2. 使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,
            这里的redirect必须是方法映射路径,jsp无效。

    @RequestMapping("/redirectAttributes")
    public String redirectAttributes(RedirectAttributes attr) {
      // attr.addAttribute("a", "a");
      // return "redirect:/test.jsp";
    
      attr.addFlashAttribute("b", "b");
      return "redirect:/redirect";
    }

     ResponseBody响应json数据

      作用:
        该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据
        如:json,xml 等,通过 Response 响应给客户端

      注意:如果把@ResponseBody配置到方法中,则表示直接把返回值打印在浏览器页面上

      使用@RequestBody获取请求体数据:

    /**
    * 获取请求体的数据
    * @param body
    */
    @RequestMapping("/testJson")
    public void testJson(@RequestBody String body) {
    System.out.println(body);
    }

      使用@RequestBody注解把json的字符串转换成JavaBean的对象:

    /**
    * 获取请求体的数据
    * @param address
    */
    @RequestMapping("/testJson")
    public void testJson(@RequestBody Address address) {
      System.out.println(address);
    }

      使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应:

    @RequestMapping("/testJson")
    public @ResponseBody Address testJson(@RequestBody Address address) {
      System.out.println(address);
      address.setAddressName("上海");
      return address;
    }

        json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>
  • 相关阅读:
    《Effective Java》 读书笔记(三) 使用私有构造方法或枚举实现单例类
    《Effective Java》 读书笔记(二) 在构造参数过多的时候优先考虑使用构造器
    读书笔记-《Maven实战》-2018/5/3
    读书笔记-《Maven实战》-关于Maven依赖传递的思考 2018/4/26
    MySQL基础篇(07):用户和权限管理,日志体系简介
    SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
    MySQL基础篇(06):事务管理,锁机制案例详解
    Java并发编程(02):线程核心机制,基础概念扩展
    SpringBoot2 整合ElasticJob框架,定制化管理流程
    Java基础篇(02):特殊的String类,和相关扩展API
  • 原文地址:https://www.cnblogs.com/roadlandscape/p/12311431.html
Copyright © 2011-2022 走看看