响应数据和结果视图

 

 

返回值分类 

 

字符串 

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

 

运行结果:

 

posted @ 2019-05-02 15:36  萌胖胖  阅读(307)  评论(0编辑  收藏  举报