本篇博文介绍 springMVC 不同类型返回值的控制器方法处理响应数据。
代码详情已上传至 GitHub,地址:https://github.com/Jacks5320/springMvcStudy
应用示例:
@Controller
@RequestMapping("/demo6")
public class Demo6Controller {
@GetMapping("/testString")
public String testString(Model model) {
System.out.println("<== testString 方法执行了 ==>");
// 返还 pojo 类
Book book = new Book();
book.setName("SpringMVC从入门到转行");
book.setAuthor("劝退大师");
book.setVersion(1);
// model 对象,将返回属性存入到 model 对象中,
// 进而存到 request 域转发给页面,
// 页面可以使用返回值渲染页面。
model.addAttribute("book", book);
return "success";
}
}
请求与结果
<%--设置 isELIgnored="false" 可以使用 EL 表达式获取 request 域属性。--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>操作成功页面title>
head>
<body>
<h3>操作成功跳转的页面h3>
<p>方法返回值为 String 类型,使用 Model 存储对象,转发给页面p>
<p>书名:${book.name}p>
<p>作者:${book.author}p>
<p>版本:${book.version}p>
body>
html>
默认情况会根据配置的视图解析器去访问对应的资源,如果我作如下配置:
视图解析器:
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
bean>
@Controller
@RequestMapping("/demo6")
public class Demo6Controller {
@GetMapping("/testVoid")
public void testVoid(){
}
}
http://localhost:8080/demo/demo6/testVoid
时( demo 是我的项目路径)/demo/WEB-INF/pages/demo6/testVoid.jsp
这个资源。1 请求转发
@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("<== testVoid 方法执行了 ==>");
// 请求转发,请求转发一次请求,不需要编写项目的名称
// 手动转发,springmvc 就不会再提供视图解析器了,需要手动补全资源路径
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
}
2 重定向
@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("<== testVoid 方法执行了 ==>");
// 请求重定向,重定向是重新发送一个请求。
// 前端发送的请求不能直接访问 WEB-INF 文件夹下的资源,所以这里直接重定向到 index.jsp 页面
response.sendRedirect("/demo/index.jsp");
// 也可以使用 request.getContextPath() 来获取项目路径
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
3 直接使用字符流响应
@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("<== testVoid 方法执行了 ==>");
// 直接响应页面,使用输出流响应页面
// 设置响应类型
response.setContentType("text/html;charset=utf-8");
// 在页面输出一句话,如果是中文,需要设置编码
response.getWriter().println("操作成功了");
}
@GetMapping("/testModelAndView")
public ModelAndView testModelAndView(){
// 创建 ModelAndView 对象
ModelAndView modelAndView = new ModelAndView();
// 创建 pojo 对象
Book book = new Book();
book.setName("MySQL从删库到跑路");
book.setAuthor("跑路大师");
book.setVersion(1);
// 使用 ModelAndView 对象以 key-value 的方式存储 pojo 对象
modelAndView.addObject("book",book);
// 跳转页面,可以使用 视图解析器 进行解析,然后跳转
// String 类型返回值的方法底层也会使用 ModelAndView 对象来调用视图解析器
modelAndView.setViewName("success");
return modelAndView;
}
forward
redirect
// 请求转发
@GetMapping("/testKeyWord")
public String testKeyWord(){
// 不能使用 视图解析器,所以需要补全资源路径
return "forward:/WEB-INF/pages/success.jsp";
}
// 重定向:不能直接访问 WEB-INF 中的资源
@GetMapping("/testKeyWord")
public String testKeyWord(){
// 不需要再加项目路径,直接映射资源路径
return "redirect:/index.jsp";
}
@RequestBody
接收 ajax
发送的 json
格式请求体。@Response
注解返回 json
格式响应体给 ajax
解析处理。ajax
发送请求和处理请求。导入 json 相关依赖
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.9version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.9.9version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.9.9version>
dependency>
控制器方法
@PostMapping("/testJson")
@ResponseBody
public Book testJson(@RequestBody Book book){
book.setVersion(2);
return book;
}
ajax 请求
<button id="btn">发送 ajax 请求button>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js">script>
<script>
// 页面加载,绑定点击事件。
$(function () {
$("#btn").click(function () {
// alert("hello btn");
$.ajax({
// 编写 json 格式,设置属性和值。
url: "demo6/testJson",
contentType: "application/json;charset=UTF-8",
data: '{"name":"Linux从入门到入土","author":"秃头大师","version":"1"}',
dataType: "json",
type: "post",
success: function (data) {
//data 是服务器端响应的 json 数据,进行解析
console.log(data);
console.log(data.name);
console.log(data.author);
console.log(data.version);
}
})
});
});
script>