转发和重定向的区别及其原理,参考文章
视图类型及特点
视图的作用就是将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视图解析器解析
通过转发的方式实现跳转
<a th:href="@{/testThymeleafView}">测试ThymeleafViewa><br>
@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
return "success";
}
转发视图
当控制器方法返回或在ModelView对象中所设置的视图名称以"forward:"为前缀
时,此时的视图名称会被InternalResourceView视图解析器解析
转发到某个请求或页面(可以解析jsp页面中的语法)
<a th:href="@{/testForward}">测试InternalResourceViewa><br>
@RequestMapping("/testForward")
public String testForward(){
// 这种方式转发到的页面中如果有ThymeleafView语法是不会被解析的
return "forward:/testThymeleafView";
}
重定向视图
当控制器方法返回或在ModelView对象中所设置的视图名称以"redirect:"为前缀
时,此时的视图名称会被RedirectView视图解析器解析
/开始
则会自动拼接上下文路径作为最终请求路径重定向到某个请求或页面
<a th:href="@{/testRedirect}">测试RedirectViewa><br>
@RequestMapping("/testRedirect")
public String testRedirect(){
//redirect:/会自动加上下文路径
return "redirect:/testThymeleafView";
}
配置视图控制器view-controller
在控制器方法中只需要实现页面跳转(只设置页面视图名称)
功能而没有其他业务,此时可以在SpringMvc的配置文件中使用view-controller
标签表示控制器方法
mvc
的命名空间及其约束文件只有视图控制器配置的请求才会生效
,其他控制器方法中配置的请求映射将全部失效mvc:annotation-driven
,可以保证视图控制器设置的请求和控制器方法设置的请求全部都会被前端控制器处理属性 | 功能 |
---|---|
path | 设置处理的请求地址即请求映射RequestMapping |
view-name | 设置请求地址所对应的视图名称即控制器方法返回值,依然遵守视图解析器的流程 |
需求: WEB-INF目录下的资源是受保护的
即不能通过路径在浏览器中直接访问
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页title>
head>
<body>
<h1>Hello SpringMvch1>
body>
html>
单独定义一个控制器方法跳转到首页
@Controller
public class HelloController {
// 处理http://localhost:8080/SpringMvc/请求
@RequestMapping("/")
public String index() {
// 返回逻辑视图名称,对应页面的物理地址为/WEB-INF/templates/index.html
return "index";
}
}
在SpringMvC的核心配置文件中使用视图控制器标签跳转到首页
<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>
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
bean>
<mvc:view-controller path="/" view-name="index">mvc:view-controller>
<mvc:annotation-driven />
beans>