说明:
(1)本篇博客必要性说明:
● 在前面几篇博客中,介绍的都是【请求】的内容;即【后端的Controller如何设置url映射】、【后端的Controller如何接收前端请求的数据】等;
● 本篇博客就介绍响应的相关内容,即【后端给前端的响应,是如何输出结果的】;
(2)本篇博客的代码沿用自【SpringMVC入门与数据绑定10:中文乱码问题:请求中的中文乱码;(包括:【get:修改Tomcat配置文件】【post:web.xml中配置过滤器】【响应:Spring配置文件中配置转换器】)】的【frist-springmvc项目】;
(3)本篇博客涉及到了JSP的一些内容,如有需要可以快速参考【(4)JavaWeb基础(网页搭建与JavaWeb基础)】中的相关内容;
(4)本篇博客的内容:
● 简单介绍了@ResponseBody,具体ResponseBody在实际开发中常用的场景,有待积累和总结;
● 引入了ModelAndView对象,有关该对象的详细内容,会在下篇博客中介绍;
目录
一:响应产生结果的两种方式:简介;(@ResponseBody注解,ModelAndView对象)
2.@ResponseBody演示;返回的HTML字符串,会被浏览器解释、渲染,然后显示;
(1)最简单的一个案例:后端没有传递数据:仅仅演示一下页面的跳转;
一:响应产生结果的两种方式:简介;(@ResponseBody注解,ModelAndView对象)
说明:
(1)第一种:@ResponseBody:在Controller的方法上,使用@ResponseBody注解,直接产生响应文本;前面接触过很多次,如下图;
(2)第二种:ModelAndView:
● 但有的时候,【响应中只包含文本,即浏览器只显示一个文本】是不够的;
● 后端在处理请求后,往往需要跳转到一个新的页面,然后这个新的页面获取响应中的数据并展示(这个页面也称作View视图),为此就需要【响应包含一些比较复杂的、有组织的数据】;
● 在Spring MVC中,可以利用【ModelAndView对象】(承载数据),再结合【模板引擎】(JSP或FreeMarker等),在前端生成对应的页面;
二:第一种方式:@ResponseBody注解;
1.@ResponseBody简介;
说明:
(1)Controller方法直接return一个字符串,这个返回的字符串就是单纯给前端浏览器显示的,不涉及任何模板引擎的内容;
(2)在实际开发中,Controller方法return的字符串,一般是JSON格式的字符串;
(3)
● 在【SpringMVC入门与数据绑定10:中文乱码问题:请求中的中文乱码;(包括:【get:修改Tomcat配置文件】【post:web.xml中配置过滤器】【响应:Spring配置文件中配置转换器】)】知道,StringHTTPMessageConverter是Spring MVC定义的一个转换器,这个转换器的作用是解决响应中的中文乱码;
● 响应中的文本信息(字符串、JSON、XML等)都会被StringHttpMessageConverter的配置所影响;
● 自然,Controller方法return的字符串,会被StringHttpMessageConverter所影响;
2.@ResponseBody演示;返回的HTML字符串,会被浏览器解释、渲染,然后显示;
启动Tomcat,观察效果;
说明:
(1)在实际开发中,后端一般不返回HTML片段;因为,这种方式太笨了;尤其对于复杂的页面,这样做的工作量太大了;
(2)在实际工作中,一般采用的策略:【后端产生数据】+【前端的模板引擎】,得到最终的前端页面;
注:虽然,目前看来@ResponseBody在【显示前端页面】上不太适合;但,@ResponseBody还是有很多适用的场景的;
三:第二种方式:ModelAndView对象;
1.ModelAndView对象简介;
说明:
(1)ModelAndView:通过名字可知,是Model和View的意思;
(2)ModelAndView对象的目的,就是将【数据对象】和【模板引擎】进行绑定;
(3)Spring MVC默认的模板引擎是JSP;自然,也可以通过配置,使用FreeMarker等其他模板引擎;
2.ModelAndView的一个入门案例;
通过一个简单的入门案例,演示通过ModelAndView如何实现【页面的跳转】和【使用JSP显示后端产生的数据】;
(1)最简单的一个案例:后端没有传递数据:仅仅演示一下页面的跳转;
首先,在URLMappingController中定义一个后端的方法;
package com.imooc.springmvc.controller; import com.imooc.springmvc.entity.User; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.scheduling.support.SimpleTriggerContext; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.swing.*; import java.util.Date; @Controller @RequestMapping("um") public class URLMappingController { @GetMapping("/view") public ModelAndView showView() { ModelAndView mav = new ModelAndView("/view.jsp"); return mav; } }
然后,编写要跳转到的前端页面view.jsp;
启动Tomcat,观察效果;
说明:
(1)上面的案例,只是演示了一下【使用ModelAndView对象方式的时候,如何实现页面的跳转】,并没有传递数据。而在实际开发中,一般后端会传递数据的。
……………………………………………………
(2) 稍微复杂的一个案例:后端传递了数据;
首先,在URLMappingController中,编写一个有传递数据的方法;
package com.imooc.springmvc.controller; import com.imooc.springmvc.entity.User; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.scheduling.support.SimpleTriggerContext; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.swing.*; import java.util.Date; @Controller @RequestMapping("um") public class URLMappingController { @GetMapping("/view") public ModelAndView showView(Integer userId) { ModelAndView mav = new ModelAndView("/view.jsp"); User user = new User(); if (userId == 1) { user.setUsername("zhang"); } else if (userId == 2) { user.setUsername("li"); } mav.addObject("u", user); return mav; } }
然后, 在前端的view.jsp中接收后端传过来的数据;
启动Tomcat,观察效果;
说明:
(1)有关JSP的EL表达式等内容, 如有需要可以快速参考【(4)JavaWeb基础(网页搭建与JavaWeb基础)】中的相关内容;
(2)上面的案例可以看到:
● 【数据:是后端Controller动态产生的】,【界面:是由JSP动态渲染的】;
● 上面的案例也体现了MVC的设计理念:视图和模型解耦;
● 而在Spring MVC中,就通过ModelAndView对象,来实现【视图和模型的解耦】,即【“数据产生的过程”和“界面展现的过程”,实现了解耦】;(已经知道,在没有Spring MVC的时候,我们一般把数据放在Servlet/Session/Context对象中;而这儿,我们把数据放在了ModelAndView对象中,可以感受到Spring MVC作了封装~~)
● 即在Spring MVC中,通过ModelAndView对象,就能很好的贯彻【MVC的设计理念】;