Spring MVC 是对 Servlet 的进一步封装,其本质就是一个 Servlet,因此在 Spring MVC 中也存在转发和重定向的概念。
在 Spring MVC 中,我们可以在逻辑视图名中通过“forward:”和“redirect:”两个关键字来表示转发和重定向。
请求转发
我们可以在控制器方法指定逻辑视图名(View Name)时,使用“forward:”关键字进行请求转发操作。
当控制器方法中所设置的逻辑视图名称以“forward:”为前缀时,该逻辑视图名称不会被 Spring MVC 配置的视图解析器解析,而是会将前缀“forward:”去掉,以剩余部分作为最终路径通过转发的方式实现跳转。
1.通过 String 类型的返回值实现转发
我们可以通过控制方法返回的 String 字符串类型的返回值实现请求转发。
@RequestMapping("/testDispatcher")
public String testDispatcher() {
return "forward:/login";
}
在上面的代码中,控制器方法返回的是一个字符串类型的值“forward:/login”,此时 Spring MVC 会将“forward:”识别为转发指示符,而剩余的“/login”则会被当做转发的 URL,即路径“/testDispatcher”请求最终会被转发到 “/login”上进行处理。
2. 通过 ModelAndView 实现转发
我们还可以通过 ModelAndView 实现请求转发
/**
* 通过 ModeAndView 实现转发
* @return
*/
@RequestMapping("/testForward2")
public ModelAndView testForward2() {
ModelAndView modelAndView = new ModelAndView();
//设置逻辑视图名
modelAndView.setViewName("forward:/user");
//在request域对象中添加信息
modelAndView.addObject("requestScope", "ModelAndView:转发!");
return modelAndView;
}
重定向
我们可以在控制器方法指定逻辑视图名(View Name)时,使用“redirect:”关键字进行重定向操作。
当控制器方法中所设置的视图名称以“redirect:”为前缀时,该视图名称不会被 Spring MVC 配置的视图解析器解析,而是会将前缀“redirect:”去掉,以剩余部分作为最终路径通过重定向的方式实现跳转。
在 Spring MVC 中,实现重定向的最常用的方式两种:
1.通过 String 类型的返回值实现重定向
我们可以通过控制器方法返回的字符串类型的返回值实现重定向,示例代码如下。
@RequestMapping("/testRedirect")
public String testRedirect() {
return "redirect:/login";
}
2.通过 ModelAndView 实现重定向
我们还可以通过 ModelAndView 实现请求转发,示例代码如下。
@RequestMapping("/testRedirect")
public ModelAndView testDispatcher() {
ModelAndView modelAndView = new ModelAndView();
//设置逻辑视图名
modelAndView.setViewName("redirect:/login");
return modelAndView;
}
```
# [学习原文](http://c.biancheng.net/spring_mvc/9674.html)