06、SpringMVC的视图
6.1、概述
SpringMVC
中的视图是View
接口,视图的作用渲染数据,将模型Model中的数据展示给用户SpringMVC
视图的种类很多,默认有转发视图和重定向视图- 当工程引入jstl的依赖,转发视图会自动转换为
JstlView
- 若使用的视图技术为
Thymeleaf
,在SpringMVC
的配置文件中配置了Thymeleaf
的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView
6.2、ThymeleafView
1、当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC
配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转。
2、代码演示:
【test_view.html】
<a th:href="@{/testThymeleafView}">测试thymeleafView</a>
【ViewController.java】
@Controller
public class ViewController {
@RequestMapping("/testThymeleafView")
public String testThymeleafView() {
return "success";
}
}
6.3、转发视图
1、SpringMVC
中默认的转发视图是InternalResourceView
2、SpringMVC
中创建转发视图的情况:
当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView
视图,此时的视图名称不会被SpringMVC
配置文件中所配置的视图解析器解析,而是会将前缀 "forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转。
3、代码演示:
【test_view.html】
<a th:href="@{/testForward}">测试InternalResourceView</a>
【ViewController.java】
@Controller
public class ViewController {
@RequestMapping("/testForward")
public String testForward() {
return "forward:/testThymeleafView";
}
}
注意:代码执行过程中会创建两次视图:
- 第一次视图(
InternalResourceView
视图):先解析"forward:/testThymeleafView",把前缀去掉,剩余的"/testThymeleafView"需要转发- 第二次视图(
ThymeleafView
视图):由于"/testThymeleafView"也是一次请求,所以此时创建ThymeleafView
来实现转发。
6.4、重定向视图
1、SpringMVC
中默认的重定向视图是RedirectView
2、当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView
视图,此时的视图名称不会被SpringMVC
配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转。
转发与重定向的区别:
1、浏览器请求次数:
- 转发是一次请求,虽然转发也可以说是两次请求,第一次是浏览器发送,第二次发送是在服务器内部。此处说转发是一次请求是指浏览器是一次请求。
- 重定向是两次请求。
2、访问
WEB-INF
下的资源
- 转发能够访问
WEB-INF
下的资源。- 重定向不能访问
WEB-INF
下的资源,因为WEB-INF
下的资源具有安全性,具有隐藏性,只能通过服务器内部来访问,不能通过浏览器访问。3、跨域
- 转发不能跨域,转发是发生在服务器内部的,则只能访问服务器内部的资源。
- 重定向可以跨域,重定向是浏览器发送的两次请求,通过浏览器可以访问任何资源。
3、代码演示:
【test_view.html】
<a th:href="@{/testRedirect}">测试RedirectView</a><br>
【ViewController.java】
@Controller
public class ViewController {
@RequestMapping("testRedirect")
public String testRedirect() {
return "redirect:/testThymeleafView";
}
}
重定向视图在解析时,会先将
redirect:
前缀去掉,然后会判断剩余部分是否以/
开头,若是则会自动拼接上下文路径
6.5、视图控制器view-controller
1、当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view-controller
标签进行表示。
2、代码演示:
【springMVC.xml】
<!--
path:设置处理的请求地址
view-name:设置请求地址所对应的视图名称
-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
注意:
当
SpringMVC
中设置任何一个view-controller
时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC
的核心配置文件中设置开启mvc
注解驱动的标签:<!--开启MVC的注解驱动--> <mvc:annotation-driven/>