目录
SpringMVC的视图
1. ThymeleafView
2. 转发视图
3. 重定向视图
4. 视图控制器view-controller
SpringMVC的视图
(1)SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户。
(2)SpringMVC视图的种类很多,默认有转发视图(forward)和重定向视图(redirect)。
(3)若当工程引入jstl(jstl标签库)的依赖,转发视图会自动转换为JstlView。
(4)若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView。
1. ThymeleafView
当控制器方法中所设置的视图名称没有任何前缀时(有前缀也就是forward:和redirct:这两种),此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转!
其实前面一直使用的就是这种方式!
视图解析器
发送请求,并拼接视图解析器中的前后缀
2. 转发视图
(1)SpringMVC中默认的转发视图是InternalResourceView。
(2)SpringMVC中创建转发视图的情况:当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转!
例如:我们从two跳转到one,此时就不需要视图解析器
此时会去调forward:,直接跳转到/one路径,不会被视图解析器解析,就不会加上前后缀!
注:此时创建的就不是ThymeleafView视图,而是InternalResourceView!
注:如果用的是jsp,那么视图解析器中配置的就是InternalResourceView(没有任何前缀也是这个),就没有InternalResourceView什么事了!
@RequestMapping("/one")
public String one(){
return "success";
}
@RequestMapping("/two")
public String two(){
return "forward:/one";
}
3. 重定向视图
(1)SpringMVC中默认的重定向视图是RedirectView。
(2)当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转。
复习:转发与重定向
①转发实际上是一次请求(相对于浏览器而言),第一次是浏览器发出请求,第二次是发生在服务器内部的;所以地址栏还是第一次发出请求的地址。重定向是两次请求,第一次访问的是servlet,第二次是访问我们重定向的地址;地址栏是重定向的地址。
②转发可以携带数据,因为是一次请求,调用的是同一个request对象。重定向不可以,数据会丢失,因为是两次请求,对应着两个不同的request对象。
③转发可以访问WEB-INF下的资源。重定向不可以访问WEB-INF下的资源。
④转发不能跨域。重定向可以跨域。
对比转发和重定向的地址栏变化
@RequestMapping("/one")
public String one(){
return "success";
}
@RequestMapping("/two")
public String two(){
return "forward:/one";
}
@RequestMapping("/three")
public String three(){
return "redirect:/one";
}
使用转发:/two转发到/one(地址栏应该是two),然后经过视图解析解析跳转到success
使用重定向:/three重定向到/one(地址栏应该是one),然后经过视图解析解析跳转到success
4. 视图控制器view-controller
当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用mvc命名空间的view-controller标签进行表示!
在springmvc.xml中增加以下配置
①path:设置处理的请求地址;
②view-name:设置请求地址所对应的视图名称。
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
以上代码就等价于:
@RequestMapping("/")
public String demo(){
return "index";
}
但是此时会出现一个新的问题:当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效!此时需要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!--开启mvc的注解驱动-->
<mvc:annotation-driven/>
总结:
(1)对于html,一般配置的是Thymeleaf视图解析器,因为对于html是无法使用java代码的;例如我们写路径发送请求时,需要利用thymeleaf的命名空间去处理!
注:此时会根据thymeleaf在one路径前面加上项目的上下文路径名!
<a th:href="@{/one}"></a>
(2)对于jsp,一般的配置的是InternalResourceViewResolver视图解析器,因为对于jsp中是可以使用java代码的,我们可以通过java代码动态获取上下文的路径名!
注:此时使用pageContext.request.contextPath去动态获取上下文的路径名!
<a href="${pageContext.request.contextPath}/one"></a>