SpringMVC-2-处理响应数据&视图解析

处理响应数据

​ 使用ModelAndView、Map、Model输出数据模型。是 后端-->前端 返回数据时可以使用的数据类型,底层都是将其转换为ModelAndView类对象来进行返回,而ModelAndView对象底层又是通过map来实现。

使用ModelAndView返响应模型数据
/**
 * @author : zhukang
 * @date : 2021-06-24
 * @return :
 * @description : 使用ModelAndView响应模型数据和视图
 */
@RequestMapping("/testSpringMvcModelAndView")
public ModelAndView testSpringMvcModelAndView(HttpServletRequest request){
    // 创建ModelAndView对象
    ModelAndView mav = new ModelAndView();

    // 添加模型数据
    mav.addObject("userName", request.getParameter("userName"));

    // 设置响应视图名称
    mav.setViewName("success");

    // 返回ModelAndView对象
    return mav;
}
使用map响应模型数据
/**
 * @author : zhukang
 * @date : 2021-06-24
 * @return :
 * @description : 使用Map响应模型数据,map必须是请求处理方法的入参,不能再方法内创建map(无效的)
 */
@RequestMapping("/testSpringMvcMap")
public String testSpringMvcMap(Map<String, Object> map, HttpServletRequest request){

    // 添加模型数据
    map.put("userName", request.getParameter("userName"));

    // 返回目标视图名称
    return "success";
}
使用Model响应模型数据
/**
 * @author : zhukang
 * @date : 2021-06-24
 * @return :
 * @description : 使用Model响应模型数据
 */
@RequestMapping("/testModelestSpringMvcModel")
public String testSpringMvcModel(Model model, HttpServletRequest request){

    // 添加模型数据
    model.addAttribute("userName", request.getParameter("userName"));

    // 返回目标视图名称
    return "success";
}
前端界面统统使用el表达式来接受数据:
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>欢迎</title>
</head>
<body>
    <h2>Success Page</h2>
    <h2>Hello:${userName}</h2>
</body>
</html>

视图解析

​ 1) 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户,主要就是完成转发或者是重定向的操作.
​ 2) 为了实现视图模型和具体实现技术的解耦,Spring 在org.springframework.web.servlet 包中定义了个高度抽象的 View 接口
​ 3) 视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题

常用的视图实现类

  • InternalResourceView:将JSP或其它资源封装成一个视图,是 InternalResourceViewResolver 默认使用的视图实现类

  • JstlView:若项目中使用了 JSTL,则 SpringMVC 会自动把视图由 InternalResourceView 转为 JstlView (断点调试,将 JSTL 的 jar 包增加到项目中,视图解析器会自动修改为 JstlView)

  • 若希望直接响应通过 SpringMVC 渲染的页面,可以使用 mvc:view-controller 标签实现

视图解析器

​ 1) SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中 配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。
​ 2) 视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。
​ 3) 所有的视图解析器都必须实现 ViewResolver 接口

常用的视图解析器

BeanNarmeViewResolver:
​ 将逻辑视图名解析为一个Bean , Bean 的 id等于逻辑视图名将视图名解析为一个URL文件,一般使用该解析器将视图名。
lnternalResourceViewResolver:
​ 映射为一个保存在WEB-INF目录下的程序文件(如JSP )解析为URL文件。

mvc:view-controller 标签

<!--  不经过请求处理器,直接跳转页面
    一旦配置了mvc:view-controller,导致所有的@RequestMapping注解的映射失效,必须增加配置让注解生效
-->
<mvc:view-controller path="testViewController" view-name="success"/>

<!--  开启注解扫描  -->
<mvc:annotation-driven/>
设置了以上配置后,就可以实现空参跳转

重定向

  1. 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
  2. 如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进 行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来 处理
  3. redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作
  4. forward:success.jsp:会完成一个到 success.jsp 的转发操作
/**
 * @author : zhukang
 * @date : 2021-06-24
 * @return :
 * @description : 使用重定向,在返回的字符串前面增加前缀:redirect:
 */
@RequestMapping("/testSpringMvcRedirect")
public String testSpringMvcRedirect(){

    // 重定向
    return "redirect:ok.jsp";
}

/**
 * @author : zhukang
 * @date : 2021-06-24
 * @return :
 * @description : 使用转发,在返回的字符串前面增加前缀:forward:
 */
@RequestMapping("/testSpringMvcForward")
public String testSpringMvcForward(){

    // 转发,需要携带参数
    // 不能走视图解析到success页面
    // return "forward:success";
    // 转发到自定义的目标页面
    return "forward:ok.jsp";
    // 转发到目标请求
    // return "forward:testSpringMvcModel";
}

处理 JSON

/**
 * @author : zhukang
 * @date : 2021-06-24
 * @return :
 * @description : 返回json格式数据,返回类型就是目标类型,增加注解@ResponseBody
 * 前提:必须增加Jackson的jar包依赖,否则报错,视图解析不了
 * ResponseBody注解,可以加在类上,类中所有方法都返回json字符串,加在方法上,当前方法返回json字符串
 */
@RequestMapping("/testSpringMvcJson")
@ResponseBody
public List<User> testSpringMvcJson(){
    // 模拟获取用户列表
    List<User> users = new ArrayList<>();
    users.add(new User("Tom", 20));
    users.add(new User("Jack", 30));
    return users;
}

方法的返回类型不能是字符串String

Q.E.D.