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>
  • 相关阅读:
    Atitit.ati orm的设计and架构总结 适用于java c# php版
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.js 与c# java交互html5化的原理与总结.doc
  • 原文地址:https://www.cnblogs.com/roadlandscape/p/12311431.html
Copyright © 2011-2022 走看看