• 响应数据和结果视图


    返回值分类 

    字符串 

     controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。 

    //指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp 

    void 

    Servlet 原始 API 可以作为控制器中方法的参数: 

    @RequestMapping("/testReturnVoid")

    public void testReturnVoid(HttpServletRequest request,HttpServletResponse response) throws Exception { } 

    在controller 方法形参上可以定义 request和 response,使用 request 或 response 指定响应结果:

      1、使用 request 转向页面,如下: 

        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);

      2、也可以通过 response 页面重定向: 

        response.sendRedirect("testRetrunString") 

      3、也可以通过 response 指定响应结果,例如响应 json 数据: 

        response.setCharacterEncoding("utf-8");

        response.setContentType("application/json;charset=utf-8");

        response.getWriter().write("------json 串------"); 

    ModelAndView 

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

    /** 
    * 返回 ModeAndView  
    * @return  
    */ 
    @RequestMapping("/testReturnModelAndView") 
    public ModelAndView testReturnModelAndView() {  
      ModelAndView mv = new ModelAndView();  
      mv.addObject("username", "张三");  //添加到ModelMap中  this.getModelMap().addAllAttributes(model);

     mv.setViewName("success");   //用于设置逻辑视图名称, 视图解析器会根据名称前往指定的视图
      return mv; 
    }

    响应的 jsp代码: 

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
    <html> 
      <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
        <title>执行成功</title> 
      </head> 
      <body> 
        执行成功! 
        ${requestScope.username} 
      </body> 
    </html> 

    注意: 

      我们在页面上获取使用的是 requestScope.username 取的,所以返回 ModelAndView 类型时,浏览器跳转只能是请求转发。 

    转发和重定向 

     

    forward 转发 

     controller方法在提供了String类型的返回值之后,默认就是请求转发。我们也可以写成:

    /** 
    * 转发 
    * @return 
    */ 
    @RequestMapping("/testForward") 
    public String testForward() { 
      System.out.println("AccountController的testForward 方法执行了。。。。");
      return "forward:/WEB-INF/pages/success.jsp";
    }

    如果用了forward则路径必须写成实际视图url,不能写逻辑视图。

    Redirect重定向

    在返回值里使用:redirect:

    /** 
    * 重定向 
    * @return 
    */ 
    @RequestMapping("/testRedirect") 
    public String testRedirect() { 
      System.out.println("AccountController的testRedirect 方法执行了。。。。"); 
      eturn "redirect:testReturnModelAndView"; 
    }

    它相当于“response.sendRedirect(url)”。

    需要注意的是,如果是重定向到jsp页面,则jsp页面不能写在WEB-INF目录中,否则无法找到。

    ResponseBody响应json数据

    作用:

      该注解用于将控制器的方法返回的对象, 通过HttpMessageConverter接口转换为指定格式的数据:

      如 json, xml 通过Response响应给客户端

    示例:

      需求: 使用@ResponseBody注解实现将controller方法返回对象转换为json响应给客户端。

      Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包

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

    Jsp中代码:

    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
    <script>
            // 页面加载,绑定单击事件
            $(function(){
                $("#testJson").click(function(){
                    // alert("hello btn");
                    // 发送ajax请求
                    $.ajax({
                        // 编写json格式,设置属性和值
                        url:"user/testAjax",
                        contentType:"application/json;charset=UTF-8",
                        data:'{"username":"hehe","password":"123","age":30}',
                        dataType:"json",
                        type:"post",
                        success:function(data){
                            // data服务器端响应的json的数据,进行解析
                             console.log(data);
                             console.log(data.username);
                             console.log(data.password);
                             console.log(data.age);
                        }
                    });
    
                });
            });
    </script>
    <!-- 测试异步请求 -->
    <input type="button" value="测试ajax请求json和响应json" id="testJson"/>

    控制器中的代码

      /**
         * 模拟异步请求响应
         */
        @RequestMapping("/testAjax")
        public @ResponseBody User testAjax(@RequestBody User user){
            System.out.println("testAjax方法执行了...");
            // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
            System.out.println(user);
            // 做响应,模拟查询数据库
            // 修改一下数据
            user.setUsername("XiaoLi's Wife");
            user.setAge(31);
            // 做响应
            return user;
        }

    运行结果:

  • 相关阅读:
    PHP开发中bcscale timezone charset的设定
    [转]git图解(3):分支操作
    [转]Docker(三):Dockerfile 命令详解
    [转]php中 curl模拟post发送json并接收json
    [转]【docker】CMD ENTRYPOINT 区别
    [转]php模拟post提交请求,调用接口
    [转]【比特币钱包开发 五】新建钱包:生成子账号地址与路径
    [转]bitcoin API reference (JSON-RPC)
    flume原理
    Hive格式各种格式下不同压缩算法的比较
  • 原文地址:https://www.cnblogs.com/mkl7/p/10801880.html
Copyright © 2020-2023  润新知