SpringMVC的视图
转发和重定向的区别及其原理,参考文章
视图类型及特点
视图的作用就是将Model中的数据渲染到页面上并展示给用户
,SpringMVC中视图对应的View接口有三种实现类对应三种视图解析器
- 默认有
转发视图InternalResourceView
和重定向视图RedirectView
以及ThymeleafView视图
,当工程引入jstl
的依赖转发视图会自动转换为JstlView
// 视图接口
View view;
// 获取视图名称
String viewName = mv.getViewName();
if (viewName != null) {
// 解析视图名称,根据视图名称创建对应的视图解析器
view = resolveViewName(viewName, mv.getModelInternal(),locale,request);
}
ThymeleafView视图
当控制器方法返回或在ModelView对象中设置的视图名称没有任何前缀
时,此时的视图名称会被SpringMVC配置文件中所配置的ThymeleafView视图解析器解析
- ThymeleafView视图解析器会给视图名称拼接上视图前缀和视图后缀得到页面的物理地址,然后解析页面中的Thymeleaf语法渲染数据并
通过转发的方式实现跳转
<a th:href="@{/testThymeleafView}">测试ThymeleafView</a><br>
@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
return "success";
}
转发视图
当控制器方法返回或在ModelView对象中所设置的视图名称以"forward:"为前缀
时,此时的视图名称会被InternalResourceView视图解析器解析
- InternalResourceView视图解析器会将前缀"forward:"去掉,剩余部分作为最终请求路径
转发到某个请求或页面(可以解析jsp页面中的语法)
<a th:href="@{/testForward}">测试InternalResourceView</a><br>
@RequestMapping("/testForward")
public String testForward(){
// 这种方式转发到的页面中如果有ThymeleafView语法是不会被解析的
return "forward:/testThymeleafView";
}
重定向视图
当控制器方法返回或在ModelView对象中所设置的视图名称以"redirect:"为前缀
时,此时的视图名称会被RedirectView视图解析器解析
- RedirectView视图解析器会将前缀"redirect:"去掉,如果剩余部分以
/开始
则会自动拼接上下文路径作为最终请求路径重定向到某个请求或页面
<a th:href="@{/testRedirect}">测试RedirectView</a><br>
@RequestMapping("/testRedirect")
public String testRedirect(){
//redirect:/会自动加上下文路径
return "redirect:/testThymeleafView";
}
配置视图控制器view-controller
在控制器方法中只需要实现页面跳转(只设置页面视图名称)
功能而没有其他业务,此时可以在SpringMvc的配置文件中使用view-controller
标签表示控制器方法
- 首先要引入
mvc
的命名空间及其约束文件 - 只要在SpringMvc的配置文件中设置了view-controller标签,此时
只有视图控制器配置的请求才会生效
,其他控制器方法中配置的请求映射将全部失效 - 开启MVC的注解驱动
mvc:annotation-driven
,可以保证视图控制器设置的请求和控制器方法设置的请求全部都会被前端控制器处理
属性 | 功能 |
---|---|
path | 设置处理的请求地址即请求映射RequestMapping |
view-name | 设置请求地址所对应的视图名称即控制器方法返回值,依然遵守视图解析器的流程 |
需求: WEB-INF目录下的资源是受保护的
即不能通过路径在浏览器中直接访问
<!DOCTYPE html>
<!--引入thymeleaf的命名空间,使用thymeleaf标签-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello SpringMvc</h1>
</body>
</html>
单独定义一个控制器方法跳转到首页
@Controller
public class HelloController {
// 处理http://localhost:8080/SpringMvc/请求
@RequestMapping("/")
public String index() {
// 返回逻辑视图名称,对应页面的物理地址为/WEB-INF/templates/index.html
return "index";
}
}
在SpringMvC的核心配置文件中使用视图控制器标签跳转到首页
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--自动扫描控制层组件-->
<context:component-scan base-package="com.atguigu.mvc.controller"></context:component-scan>
<!--配置Thymeleaf视图解析器-->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
</bean>
<!--视图控制器,设置请求对应的视图名称实现页面的跳转-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!--开启MVC的注解驱动,保证视图控制器设置的请求和控制器方法设置的请求全部都会被前端控制器处理-->
<mvc:annotation-driven />
</beans>