SpringMVC的数据响应

本文最后更新于:1 年前

处理同步请求(form、超链接)的方法的返回类型定义为String或者ModelAndView,以实现页面的跳转。

处理异步请求(ajax请求),在控制器方法上使用@ResponseBody 注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回。

控制器响应同步请求

处理同步请求(form、超链接)的方法的返回类型定义为String或者ModelAndView,以实现页面的跳转。

返回String类型进行页面跳转

  1. 将返回的字符串与视图解析器的前后缀拼接后跳转:

    详细使用说明见传送门

  2. 返回带有前缀的字符串:

    • 转发forward:/WEB-INF/views/index.jsp
    • 重定向redirect:/index.jsp

    详细使用说明见传送门

通过ModelAndView对象返回

返回类型为 ModelAndView

  1. 使用 ModelAndView 对象封装数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @RequestMapping(value = "/quick2")
    public ModelAndView save2 () {
    /*
    model:模型,用于封装数据
    view:视图,用于展示数据
    */
    ModelAndView modelAndView = new ModelAndView();
    //设置模型数据(相当于放入请求作用域中)
    modelAndView.addObject("username","gaojie.cc");
    //设置视图名称
    //如果需要重定向只需要加redirect前缀:modelAndView.setViewName("redirect:success");
    modelAndView.setViewName("success");
    return modelAndView;
    }
  2. 在视图文件 success.jsp 中获取数据并展示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    %@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>Title</title>
    </head>
    <body>
    <h1>Hello SpringMVC! ${username}</h1>
    </body>
    </html>

  3. 也可以采用注入的方式获得 ModelAndView 对象

    1
    2
    3
    4
    5
    6
    7
    8
    //modelAndView对象也可以不手动创建,而是采用使用注入的方式作为方法的参数
    @RequestMapping(value = "/quick3")
    public ModelAndView save3 (ModelAndView modelAndView) {
    modelAndView.addObject("username","Nice!");
    modelAndView.setViewName("success");
    //modelAndView.setViewName("success",new User(1,"张珊"));
    return modelAndView;
    }

以字符串形式做视图进行数据的返回

1
2
3
4
5
@RequestMapping(value = "/quick4")
public String save4 (Model model) {
model.addAttribute("username","gaojie.cc");
return "success";
}

通过注入请求对象进行视图和数据的返回(不推荐)

1
2
3
4
5
@RequestMapping(value = "/quick5")
public String save5 (HttpServletRequest request) {
request.setAttribute("username","Beautiful!");
return "success";
}

控制器响应异步请求

处理异步请求(ajax请求),在控制器方法上使用@ResponseBody 注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回。

  • 控制器方法的返回类型设置为响应给ajax请求的对象类型
  • 在控制器方法前添加@ResponseBody注解,将返回的对象转换成JSON响应给ajax请求
  • 如果一个控制器类中的所有方法都是响应ajax请求,则可以直接在控制器类前添加@ResponseBody注解

直接返回字符串

Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用 response.getWriter().print(“hello world”) 即可,那么在 Controller 中想直接回写字符串该怎样呢?

使用response中的输出流进行响应

通过 SpringMVC 框架注入的response对象,使用 response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为 void。

1
2
3
4
@RequestMapping(value = "/quick6")
public void save6 (HttpServletResponse response) throws IOException {
response.getWriter().print("Hello World!");
}

在控制器方法上使用@ResponseBody 注解

将需要回写的字符串直接返回,但此时需要通过 @ResponseBody 注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回。

1
2
3
4
@RequestMapping(value = "/quick7")
public String save7 () {
return "Hello gaojie.cc";
}


1
2
3
4
5
@RequestMapping(value = "/quick7")
@ResponseBody //告诉SpringMVC框架不要进行视图跳转,直接数据回写响应
public String save7 () {
return "Hello gaojie.cc";
}

返回对象或集合

使用response中的输出流进行响应

  • 控制器方法的返回类型为 void
  • 控制器方法添加 HttpServletResponse response 参数;
  • 在方法中通过 response 获取输出流,使用流响应ajax请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RequestMapping("/update")
public void update(@RequestBody Book book, HttpServletResponse response) throws IOException {
System.out.println("---book update");
System.out.println(book);

//使用ObjectMapper将对象转换成JSON格式字符串
String s = new ObjectMapper().writeValueAsString(book);
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.println(s);
out.flush();
out.close();
}

直接在控制器方法返回响应的对象

使用jackson进行转换

在异步项目中,客户端与服务器端往往要进行json格式字符串交互,此时我们可以手动拼接json字符串返回。手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换成json格式的字符串,我们可以使用 web 阶段学习过的 json 转换工具 jackson 进行转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.10</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
@RequestMapping(value = "/quick8")
@ResponseBody
public String save8 () throws JsonProcessingException {
King king =new King();
king.setName("gaojie");
king.setAge(22);
//使用json转换工具将对象转换为json格式字符串返回
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(king);
return json;
//return "{\"username\":\"gaojie\",\"age\":22}";
}

配置处理器映射器进行转换

通过 SpringMVC 帮助我们对对象或集合进行 json 字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用 jackson 进行对象或集合的转换。

1
2
3
4
5
6
7
8
<!--配置处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
1
2
3
4
5
6
7
@RequestMapping(value = "/quick9")
@ResponseBody
public King save9 () throws IOException {
King king =new King();
king.setName("gaojie");
return king;
}


使用mvc的注解驱动代替上述配置

在方法上添加 @ResponseBody 就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc的注解驱动代替上述配置。

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使用 mvc:annotation-driven 自动加载 RequestMappingHandlerMapping(处理映射器)和 RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在 Spring-xml.xml 配置文件中使用 mvc:annotation-driven 替代注解处理器和适配器的配置。同时使用mvc:annotation-driven默认底层就会集成 jackson 进行对象或集合的 json 格式字符串的转换。

1
2
3
4
5
6
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
*************************

<!--MVC的注解驱动-->
<mvc:annotation-driven/>
1
2
3
4
5
6
7
@RequestMapping(value = "/quick9")
@ResponseBody
public King save9 () throws IOException {
King king =new King();
king.setName("gaojie");
return king;
}