SpringMVC|SpringMVC 响应数据与结果视图

响应数据与结果视图
文章目录

  • 响应数据与结果视图
    • 1 String 类型返回值的控制器方法
    • 2 void 类型返回值的控制器方法
    • 3 ModelAndView 类型返回值的控制器方法
    • 4 使用关键字进行转发和重定向
    • 5 POJO 类型返回值的控制器方法

本篇博文介绍 springMVC 不同类型返回值的控制器方法处理响应数据。
代码详情已上传至 GitHub,地址:https://github.com/Jacks5320/springMvcStudy
1 String 类型返回值的控制器方法
  • 如果控制器方法的返回值是一个 String 类型,springmvc 会根据配置的视图解析器的路径去匹配资源。
  • 如果需要返还给前端作数据渲染,可以使用 Model 的实现类来存储。因为 Model 的实现类都直接或间接继承了 Map 集合。
  • Model 存储的属性,最终会存入 request 域中,jsp 页面可以使用 el 表达式获取。
【SpringMVC|SpringMVC 响应数据与结果视图】应用示例:
@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"; } }

请求与结果
操作成功页面 - 锐客网 操作成功跳转的页面
方法返回值为 String 类型,使用 Model 存储对象,转发给页面
书名:${book.name}
作者:${book.author}
版本:${book.version}

SpringMVC|SpringMVC 响应数据与结果视图
文章图片

2 void 类型返回值的控制器方法 默认情况会根据配置的视图解析器去访问对应的资源,如果我作如下配置:
视图解析器:

@Controller @RequestMapping("/demo6") public class Demo6Controller {@GetMapping("/testVoid") public void testVoid(){} }

  • 当我们访问 http://localhost:8080/demo/demo6/testVoid 时( demo 是我的项目路径)
  • 默认情况 springMVC 会映射到 /demo/WEB-INF/pages/demo6/testVoid.jsp 这个资源。
  • 资源路径的拼接方式:项目路径/视图解析器路径/请求路径.jsp,也就是我这里的 /demo + /WEB-INF/pages/ + /demo6/testVoid.jsp
  • 如果这个资源不存在,页面会报 404 错误。
  • 如果希望处理页面不报 404,有两种方式解决:1 在项目中创建这个资源;2 使用 servlet 的原生接口进行 请求转发、重定向,又或者是使用字符流直接响应到界面。
  • 下面演示使用 servlet 原生接口作响应处理。
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("操作成功了"); }

3 ModelAndView 类型返回值的控制器方法
  • ModelAndView 对象是 Spring 提供的一个对象,可以用调整具体的 JSP 视图。
  • ModelAndView 对象可以存储数据,进而存入到 request 域对象中。
@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; }

SpringMVC|SpringMVC 响应数据与结果视图
文章图片

4 使用关键字进行转发和重定向
  • 使用关键字进行转发和重定向不能使用视图解析器,需要手动补全资源路径。
  • 重定向依赖不能访问 WEB-INF 中的资源。
  • 相比于使用原生 servlet 接口方式的重定向,使用关键字进行重定向可以不加项目路径,直接使用资源路径即可。
  • 请求转发关键字: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"; }

5 POJO 类型返回值的控制器方法
  • 在 [SpringMVC 注解] 一文中已经介绍过注解的使用方式了。
  • 使用 @RequestBody 接收 ajax 发送的 json 格式请求体。
  • 使用 @Response 注解返回 json 格式响应体给 ajax 解析处理。
  • 下面依然使用 ajax 发送请求和处理请求。
导入 json 相关依赖
com.fasterxml.jackson.core jackson-databind 2.9.9 com.fasterxml.jackson.core jackson-core 2.9.9 com.fasterxml.jackson.core jackson-annotations 2.9.9

控制器方法
@PostMapping("/testJson") @ResponseBody public Book testJson(@RequestBody Book book){book.setVersion(2); return book; }

  • 这里将请求体中的 version 从 1 修改成 2,然后返回。
ajax 请求
src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"> > //页面加载,绑定点击事件。 $(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); } }) }); });

SpringMVC|SpringMVC 响应数据与结果视图
文章图片

  • 关于响应处理方式就到这里了,可能还有其他方法,仅作参考。

    推荐阅读