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/>
设置了以上配置后,就可以实现空参跳转
重定向
- 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
- 如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进 行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来 处理
- redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作
- 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.