SpringMvc的请求转发和重定向
1、SpringMVc的请求转发---thymeleafView
thymeleafVIew视图
如果在处理请求的方法的返回值【视图名】不加任何前缀那么这个视图会被SpringMvc配置的视图解析器解析,这个视图是一个thymeleaf视图。至于为什么会有这个区分是因为用的是thymeleaf的视图解析器和html页面展示效果,如果用jsp【现在没啥人用】那么配置的视图解析器就是InternalResourceView,在底下有关于这个视图的学习
如果想要实现页面跳转就要经过很多页面,为了方便就要使用请求转发。在下面先是从首页跳转到show页面再跳转到thymeleafView页面。【实际可以直接跳转过去,只是为了说明跳转】
在Java中
@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
return "thymeleafView";
}
@RequestMapping("/goToThymeleafView")
public String goToThymeleafView(){
return "show";
}
2、SpringMvc的请求转发---InternalResourceView
SpringMvc默认的转发视图是InternalResourceView
当在处理请求的方法的返回值上加了前缀【forward:】此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转。它实际负责的功能也是请求转发。在前缀后面加的不是视图名称而是请求路径但是在底层处理时会两次解析这个返回值,两次将返回封装为ModelAndView,就是第一次将返回的ModelAndView解析为InternalResourceView,第二次解析为thymeleafView。
在java中
@RequestMapping("/testInternalResourceView")
public String testInternalResourceView(){
return "forward:/testThymeleafView";
}
解读:
在源码中
首先使用debug模式找到执行disPatchservlet方法的那一行,做断电,进去后首先能看见接受到返回值【ModelAndView对象】是forward:/testThymeleafView
执行到applyDefaultViewName这里可以发现,当Viewname不为空就会把当前那么值赋给viewname。就是刚传过来的值,这里联想到使用ModelAnderAndView时的setViewName可以很好的理解
到了render方法后,就会解析视图名
在执行resolveViewNames方法时就会将刚才返回的ModelAndView对象的值也就是视图名,进行解析。最终将在标记的那一行解析为InternalResourceView。在后面的处理中获取到需要请求的路径【目标资源,后缀后面带的那个路径】
这里就是第二次对返回结果进行封装成为ModelAndView对象,在得到了请求的目标资源就会再次调用在Controller中负责处理请求这个路径的controller方法,后面就会再次将解析的目标路径返回值封装为thymeleafView,经过渲染显示在浏览器页面上。
用的不多
3、SpringMvc的请求重定向---RedirectView
使用RedirectVIew实现的是请求重定向的请求,在使用时需要在控制器方法返回值前加上【 redirect: 】,在添加之后这个返回值就不会被SpringMvc配置文件中的视图解析器解析。在处理时将把前缀去掉,剩下的部分以请求重定向的方式进行请求。
区别:
使用请求转发时,发起请求的地址和最后出现在浏览器地址栏的地址一样。返回的视图请求路径是【/thymeleafView】,一次请求
使用请求重定向时,发请求的地址是被控制器方法解析的地址,最后转发完成后,浏览器地址栏上面出现的是返回的视图的请求路径,地址栏上出现了返回的视图请求路径【 /thymeleafView 】,两次请求。
在java中
@RequestMapping("/testRedirect")
public String testRedirect(){
// 这个html页面在WEB-INF目录下不能直接跳转到页面,而是跳转到一个请求,让请求被dispatcherServlet解析,来到Controller
// 再被SpringMvc处理请求后得到视图名,最后由视图解析器解析视图的到视图经过渲染展示到浏览器上
return "redirect:/testThymeleafView";
}
4、SpringMvc的视图控制器
如果创建的控制器方法只是为了实现请求转发页面转,在方法内没有其他功能的代码就可以在SpringMvc的配置文件中使用视图控制器。以标签mvc:view-controller配置视图控制器
使用:首先添加命名空间mvc【就是把第一个xmlns的复制,加上 :命名空间名称,再把schema后面的名称换为命名空间的名称,再把底下的那个http后面那一串复制一遍,加在标签里,并且把你复制的那一串中的beans换成将要添加的命名空间名称就可以了,如果报错就看看是不是双引号和 > 多了还是少了 】
<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 http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
当你在SpringMvc配置文件中添加了视图控制器,此时所有的控制器方法都会失效。就需要添加上标签mvc:annotation-driven开启mvc的注解驱动,就能恢复正常访问
在配置文件中
这里有可能视图名会冒红,那是因为视图在WEB-INF下,冒它的冒,不影响正常访问。但是想通过首页访问其他页面就要加mvc:annotation-driven标签开启mvc的注解驱动,这个标签是mvc命名空间的
<!--配置视图控制器-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!--开启mvc的注解驱动-->
<mvc:annotation-driven/>