SpringMVC学习总结(五)SpringMVC的视图/ThymeleafView/InternalResourceView/RedirectView/视图控制器/使用JSP作为视图
SpringMVC中的视图是View接口,视图的作用是渲染数据,将模型Model中的数据展示给用户。
- SpringMVC视图的种类有很多,默认有转发视图 InternalResourceView 和重定向视图 RedirectView
- 当工程引入jstl的依赖,转发视图会自动转换为 JstlView
- 若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView
- 数据传输到前端,实现页面的跳转
一、ThymeleafView视图
当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析(如果配置了Thymeleaf视图解析器那么没有任何前缀时就是创建的ThymeleafView视图),视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转。
案例:
@RequestMapping("/testHello")
public String testHello(){
//返回视图名称
return "hello";//前面没有任何前缀
}
二、转发视图 InternalResourceView
- SpringMVC中默认的转发视图是 InternalResourceView
- 当控制器方法中所设置的视图名称以
"forward:"
为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"
去掉,剩余部分作为最终路径通过转发的方式实现跳转。
例如"forward:/"
,"forward:/employee"
案例:
controller:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping(value = "/")
public String toIndex(){
return "index";
}
@RequestMapping(value = "/target")
public String toTarget(){
return "target";
}
@RequestMapping(value = "/testForward")
public String testForward(){
return "forward:/target";
}
}
index.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testForward}">测试InternalResourceView</a>
</body>
</html>
target.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>目标页面</title>
</head>
<body>
这是target.html<br>
</body>
</html>
我们可以发现,跳转到了target页面但是地址栏的请求没有变还是/testForward
而不是/target
。
三、重定向视图
- SpringMVC中默认的重定向视图是 RedirectView
- 当控制器方法中所设置的视图名称以
"redirect:"
为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"
去掉,剩余部分作为最终路径通过重定向的方式实现跳转。
例如"redirect:/"
,"redirect:/employee"
案例:
controller:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping(value = "/")
public String toIndex(){
return "index";
}
@RequestMapping(value = "/target")
public String toTarget(){
return "target";
}
@RequestMapping(value = "/testRedirect")
public String testRedirect(){
return "redirect:/target";
}
}
index.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
这是index.html<br>
<a th:href="@{/testRedirect}">测试RedirectView</a>
</body>
</html>
我们可以发现,跳转到了target页面且地址栏的请求也变成了/target
而不是/testRedirect
。
四、视图控制器view-controller
当控制器方法中,仅仅用来实现页面跳转,而没有其他的逻辑操作,即只需要设置视图名称时,可以将控制器方法使用view-controller标签进行代替。
在我们的springMVC.xml加上如下代码:
<!--
path:设置处理的请求地址
view-name:设置请求地址所对应的视图名称
-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
它就可以取代如下代码:
@RequestMapping(value = "/")
public String toIndex(){
return "index";
}
注意:
当SpringMVC中只要设置了任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签解决这一问题:
<!--开启mvc的注解驱动-->
<mvc:annotation-driven />
五、使用JSP作为视图
- JSP作为JavaWeb应用程序的视图技术已经超过15年了,现在仍然是使用量最大的视图技术。
- InternalResourceViewResolver是最简单和最常用的JSP视图解析器。这种视图解析器遵循一种约定,会在视图名上添加前缀和后缀,进而确定一个Web应用中视图资源的物理路径。在通常的Web应用中,我们把JSP文件放到Web应用的WEB-INF目录下,防止对它的直接访问。
- 当控制器方法中所设置的视图名称没有任何前缀或以
"forward:"
为前缀时,都是创建的InternalResourceView视图,而以"redirect:"
为前缀时,创建的是RedirectView视图。
案例:
springMVC.xml:
<?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"
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">
<!-- 自动扫描包 -->
<context:component-scan base-package="com.fox.mvc.controller"/>
<!-- 配置InternalResourceViewResolver视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/templates/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
controller:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
@RequestMapping(value = "/target")
public String toTarget(){
return "target";
}
}
index.jsp:
target.jsp:
启动Tomcat:
我们的controller里面不需要写方法和index.jsp创建映射关系,因为Tomcat中的web.xml中有如下配置:
它会自动打开和上面同名的首页。