Spring MVC请求转发与重定向
在 Spring MVC 中,我们可以在逻辑视图名中通过“forward:”和“redirect:”两个关键字来表示转发和重定向。
请求转发
我们可以在控制器方法指定逻辑视图名(View Name)时,使用“forward:”关键字进行请求转发操作。当控制器方法中所设置的逻辑视图名称以“forward:”为前缀时,该逻辑视图名称不会被 Spring MVC 配置的视图解析器解析,而是会将前缀“forward:”去掉,以剩余部分作为最终路径通过转发的方式实现跳转。
在 Spring MVC 中,实现请求转发的最常用的方式两种,下面我们就来对它们进行介绍。
1. 通过 String 类型的返回值实现转发
我们可以通过控制方法返回的 String 字符串类型的返回值实现请求转发,示例代码如下。
@RequestMapping("/testDispatcher")
public String testDispatcher() {
return "forward:/login";
}
在上面的代码中,控制器方法返回的是一个字符串类型的值“forward:/login”,此时 Spring MVC 会将“forward:”识别为转发指示符,而剩余的“/login”则会被当做转发的 URL,即路径“/testDispatcher”请求最终会被转发到 “/login”上进行处理。
示例
下面我们就通过一个简单的实例,来演示下如何通过控制器方法的返回值进行转发处理。1. 新建一个名为 springmvc-dispatcher-redirect-demo 的 Web 项目,并将 Spring MVC 相关依赖引入到项目中,web.xml 的配置如下。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3网站站点" rel="nofollow" />
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework网站站点" rel="nofollow" />
package net.biancheng.c.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author c语言中文网
*/
@Controller
public class ForwardController {
/**
* 通过控制器方法返回值实现转发
* @param model
* @return
*/
@RequestMapping("/testForward")
public String testDispatcher(Model model) {
//通过 Model 向 request 域中添加信息
model.addAttribute("requestScope", "控制器返回值:转发!");
//通过返回值将请求转发的 /userPage 上
return "forward:/user";
}
}
4. 在 webapp/WEB-INF 下新建一个 templates 目录,并在该目录下创建一个 userPage.html,代码如下。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf网站站点" rel="nofollow" />
图1:转发-1
2. 通过 ModelAndView 实现转发
我们还可以通过 ModelAndView 实现请求转发,示例代码如下。@RequestMapping("/testDispatcher")
public ModelAndView testDispatcher() {
ModelAndView modelAndView = new ModelAndView();
//设置逻辑视图名
modelAndView.setViewName("forward:/login");
return modelAndView;
}
示例 2
下面我们通过一个实例,演示下如何通过 ModelAndView 实现请求转发。1. 在 springmvc-dispatcher-redirect-demo 的 net.biancheng.c.controller.ForwardController 中添加以下代码。
/**
* 通过 ModeAndView 实现转发
* @return
*/
@RequestMapping("/testForward2")
public ModelAndView testForward2() {
ModelAndView modelAndView = new ModelAndView();
//设置逻辑视图名
modelAndView.setViewName("forward:/user");
//在request域对象中添加信息
modelAndView.addObject("requestScope", "ModelAndView:转发!");
return modelAndView;
}
2. 重启 Tomcat 服务器,使用浏览器访问“http://localhost:8080/springmvc-dispatcher-redirect-demo/testForward2”,结果如下图。

图2:请求转发-2
重定向
我们可以在控制器方法指定逻辑视图名(View Name)时,使用“redirect:”关键字进行重定向操作。当控制器方法中所设置的视图名称以“redirect:”为前缀时,该视图名称不会被 Spring MVC 配置的视图解析器解析,而是会将前缀“redirect:”去掉,以剩余部分作为最终路径通过重定向的方式实现跳转。
在 Spring MVC 中,实现重定向的最常用的方式两种,下面我们就来对它们进行介绍。
1. 通过 String 类型的返回值实现重定向
我们可以通过控制器方法返回的字符串类型的返回值实现重定向,示例代码如下。@RequestMapping("/testRedirect")
public String testRedirect() {
return "redirect:/login";
}
示例 3
下面我们就通过一个简单的实例,来演示下如何通过控制器方法的返回值实现重定向。1. 在 springmvc-dispatcher-redirect-demo 的 net.biancheng.c.controller 包下,创建一个名为 RedirectController 的 Controller 类,代码如下。
package net.biancheng.c.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
/**
* @author c语言中文网
*/
@Controller
public class RedirectController {
/**
* 通过 String 类型的返回值实现重定向
* @param session
* @return
*/
@RequestMapping("/testRedirect")
public String testRedirect(HttpSession session) {
//向session域对象中添加信息
session.setAttribute("sessionScope", "控制器返回值:重定向!");
return "redirect:/user";
}
}
2. 对 userPage.html 的代码进行修改,代码如下。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf网站站点" rel="nofollow" />