Spring MVC请求转发与重定向

1年前 (2024-04-27)
Spring MVC 是对 Servlet 的进一步封装,其本质就是一个 Servlet,因此在 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" /> Spring MVC 实现重定向-1

图3:Spring MVC 实现重定向

2. 通过 ModelAndView 实现重定向

我们还可以通过 ModelAndView 实现请求转发,示例代码如下。

@RequestMapping("/testRedirect")

public ModelAndView testDispatcher() {

ModelAndView modelAndView = new ModelAndView();

//设置逻辑视图名

modelAndView.setViewName("redirect:/login");

return modelAndView;

}

示例 4

下面我们通过一个简单的实例,来演示下如何通过 ModelAndView 实现重定向。

1. 在 net.biancheng.c.contorller 包下的 RedirectController 类中添加以下代码。

/**

* 通过 ModelAndView 实现重定向

* @param session

* @return

*/

@RequestMapping("/testRedirect2")

public ModelAndView testRedirect2(HttpSession session) {

ModelAndView modelAndView = new ModelAndView();

//设置逻辑视图名

modelAndView.setViewName("redirect:/user");

session.setAttribute("sessionScope", "ModelAndView:重定向!");

return modelAndView;

}


2. 重启 Tomcat 服务器,使用浏览器访问“http://localhost:8080/springmvc-dispatcher-redirect-demo/testRedirect2”,代码如下。


图4:Spring MVC 实现重定向-2