返回值类型和json交互
1. 控制器方法的返回值类型
-
String
-
void
-
ModelAndView
演示和说明的代码
package com.zmysna.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@Controller
public class MethodReturnController {
/**
* 1. 控制器方法返回 String
* 说明: controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址
*/
@RequestMapping("returnMapping")
public String returnString() {
System.out.println("返回字符串");
return "success";
}
/**
* 2. 控制器方法返回 void
* 在 controller 方法形参上可以定义 request 和 response ,使用 request 或 response指定响应结果:
*/
@RequestMapping("returnVoid")
public void returnVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//转发
request.getRequestDispatcher("/pages/success.jsp").forward(request,response);
//重定向
response.sendRedirect("/pages/success.jsp");
}
/**
* 通过model和modelMap接收ExtendedModelMap。设置request域的属性值。
*/
@RequestMapping("model")
public String modelTest(Model model, ModelMap modelMap) {
model.addAttribute("model", "modelValue");
modelMap.addAttribute("modelMap", "modelMapValue");
return "success";
}
/**
* 3. 控制器方法返回 ModelAndView
* ModelAndView 是 SpringMVC 为我们提供的一个对象,包含了逻辑视图和模型数据
*/
@RequestMapping("mv")
public ModelAndView mv() {
ModelAndView mv = new ModelAndView();
//往request域中添加对象
mv.addObject("mv","mv");
//设置逻辑视图名
mv.setViewName("success");
return mv;
}
}
视图界面success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
<!--通过el表达式获取域中的值-->
${model}
${modelMap}
${mv}
</body>
</html>
2. springmvc的转发和重定向
控制器返回提供String返回值时默认就是请求转发,返回的值是逻辑视图名,经过视图解析器解析为实际视图。如果用 forward ,路径名称必须是实际的视图名称。使用 redirect 可以实现重定向,路径名称同样是实际的视图名称
@Controller
public class ForwardAndRedirectController {
@RequestMapping("forward")
public String forwardTest(){
System.out.println("转发");
return "forward:/pages/success.jsp";
}
@RequestMapping("redirect")
public String RedirectTest() {
System.out.println("重定向");
return "redirect:/pages/success.jsp";
}
}
3. 接收json数据和返回json数据
- @RequestBody
作用:在处理器方法形参上使用,把请求的 json 格式数据,转换成 java 对象。 - @ResponseBody
作用:在处理器方法返回值上使用,或者方法上使用。把响应的 java 对象,转换成 json 格式数据。
springmvc 默认,使用 HttpMessageConverter 消息转换器,进行 json 格式数据转换。需要加入 jackson 依赖包支持。使用maven进行依赖导入
<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-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
- 前端发送请求,参数为json数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
${model}
${modelMap}
${mv}
<p id="ajaxPost">ajaxPost</p>
</body>
<script src="../js/jquery-3.3.1.js"
type="text/javascript"></script>
<script>
$(function () {
$("#ajaxPost").click(function () {
$.post({
// 请求地址
url: "/responseBodyJson",
// 发送给后台的 ajax 数据
data: '{"id":100,"name":"jack","money":9.9}',
// 后台返回的数据格式
dataType: "json",
// 请求格式与编码
contentType: "application/json;charset=utf-8",
// 返回json数据
success: function (jsn) {
alert("jsn=" + jsn + "; jsn.id=" + jsn.id + ";")
jsn.name = "+jsn.name+";
jsn.money = "+jsn.money)";
}
});
});
});
</script>
</html>
- 后台接收json数据,用@RequestBody封装为User对象,用@ResponseBody将User对象转为json字符串并返回。
@Controller
public class JsonController {
@RequestMapping(value = "responseBodyJson")
@ResponseBody
public User body(@RequestBody User user) {
System.out.println(user);
return user;
}
}