Springmvc中转发和重定向
- 配置IndexController
package com.powernode.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class IndexController {
@RequestMapping("/")
public ModelAndView index(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
return modelAndView;
}
}
- 配置index.html页面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a th:href="@{/a}">A页面</a><br>
<a th:href="@{/b}">B页面</a><br>
</body>
</html>
- 配置ForwardController类
package com.powernode.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ForwardController {
@RequestMapping("/a")
public String toA(){
//返回逻辑视图名称view对象为ThymeleafView
return "a";
//返回的不是逻辑视图名称,而是以转发的方式跳转到另一个页面,转发底层会创建InternalResourceView然后根据"forward:/b"创建ThymeleafView:"b"对象
// return "forward:/b";
//重定向底层会创建RedirectView对象,见图1,然后根据"redirect:/b"创建ThymeleafView对象,见图2
// return "redirect:/b";
}
@RequestMapping("/b")
public String toB(){
return "b";
}
}
图1:
图2:
这说明转发底层创建的视图对象是:InternalResourceView。
思考:既然会创建InternalResourceView,应该会对应一个视图解析器呀(InternalResourceViewResolver)?但是我在springmvc.xml文件中只配置了ThymeleafViewResolver,并没有配置InternalResourceViewResolver呀?这是为什么?
这是因为forward: 后面的不是逻辑视图名,而是一个请求路径。因此转发是不需要视图解析器的。
另外,转发使用的是InternalResourceView,也说明了转发是内部资源的跳转。(Internal是内部的意思,Resource是资源的意思。)同时InternalResourceViewSpring 也是MVC框架内置的,专门为JSP模板语法准备的