SpringMVC中的转发和重定向怎么掌握

这篇文章主要介绍“SpringMVC中的转发和重定向怎么掌握”,在日常操作中,相信很多人在SpringMVC中的转发和重定向怎么掌握问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringMVC中的转发和重定向怎么掌握”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    当处理器完成请求处理后向其它资源进行跳转时,有两种跳转方式:请求转发重定向。根据跳转的资源类型,分为两类:跳转到 页面 与跳转到 其它处理器。请求转发的页面,可以是 WEB-INF 中页面,但重定向的页面不能为 WEB-INF中的页面的,因为重定向相当于用户重新发出一次请求,而用户是不可以直接访问 WEB-INF 中的资源。

    项目案例(共用资源)

    本项目案例是以 Idea+Maven 构建的项目,项目目录结构如下:

    SpringMVC中的转发和重定向怎么掌握

    pom.xml 文件配置如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>cn.kgc.springmvc03</groupId>
      <artifactId>springmvc03</artifactId>
      <packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>springmvc03 Maven Webapp</name>
      <url>http://maven.apache.org</url>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.3.9</version>
        </dependency>
    
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.14.1</version>
        </dependency>
    
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.24</version>
        </dependency>
    
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
        </dependency>
    
        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.4</version>
        </dependency>
      </dependencies>
    </project>

    spring-config.xml 文件配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <!-- 配置视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--逻辑视图前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <!--逻辑视图后缀,匹配模式:前缀+逻辑视图+后缀,形成完整路径名-->
            <property name="suffix" value=".jsp"></property>
        </bean>
        <!-- 配置组件扫描器 -->
        <context:component-scan base-package="cn.hh.springmvc03"/>
    </beans>

    web.xml 文件配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <display-name>springmvc17</display-name>
      <!--注册字符集过滤器-->
      <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <!--指定字符集-->
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <!--强制使用指定字符集-->
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    
      <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-config.xml</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

    1、请求转发到其他页面

    当处理器方法返回ModelAndView 时,跳转到指定的ViewName,默认情况下使用的是请求转发,当然也可显式的进行请求转发。此时,需在setViewName()指定的视图前添加forward关键字,一旦添加了forward关键字,控制器方法返回的视图名称就不会再与视图解析器中的前辍与后辍进行拼接,所以必须写出相对于项目根的完整路径才能返回正确的视图。

    当通过请求转发跳转到目标资源(页面或Controller)时,若需要目标资源传递数据,可以使用 HttpRequestServlet,HttpSession,还可以将数据存放于ModelAndView中的Model中。目标页面则通过 EL 表达式来访问该数据。下面案例演示使用ModelAndView的情形。

    项目案例: 用户注册完毕后,显示用户的注册信息。

    关键步骤:

    【1】在 WEB-INF/jsp 下新建 register.jsp 和 info.jsp 页面

    register.jsp 代码如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    用户注册
    <form action="doregister.do">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/>
    <input type="submit" value="注册"/>
    </form>
    </body>
    </html>

    indo.jsp 代码如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    用户注册信息<br/>
    用户名:${user.username}<br/>
    密码:${user.password}<br/>
    </body>
    </html>

    【2】在 cn.hh.springmvc03.entity 包下,新建实体类 User,代码如下:

    package cn.hh.springmvc03.entity;
    
    import lombok.Data;
    
    @Data
    public class User {
    	String username;
    	String password;
    }

    【3】在 cn.hh.springmvc03.controller 包下,新建 UserController 控制器,代码如下:

    package cn.hh.springmvc03.controller;
    
    import cn.hh.springmvc03.entity.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    @Controller
    @RequestMapping("/user")
    public class UserController {
    	@RequestMapping("/register.do")
    	public String register(){
    		return "register";
    	}
    	
    	@RequestMapping("/doregister.do")
    	public ModelAndView doRegister(User user){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("user",user);
    		mv.setViewName("forward:/WEB-INF/jsp/info.jsp");
    		return mv;
    	}
    }

    【4】运行测试,输入“http://localhost:8080/user/register.do”,注册和转发页面如下图所示:

    注册页面:

    SpringMVC中的转发和重定向怎么掌握

    转发页面:

    SpringMVC中的转发和重定向怎么掌握

    2、请求转发到其他控制器

    &emsp;&emsp;当前控制器的处理方法处理完毕后也可不返回视图,而是转发给下一个控制器方法继续处理。

    项目案例: 用户注册成功后,转发给其他方法,由其他方法返回视图显示当前用户的基本信息。

    关键步骤:

    【1】 将 cn.hh.springmvc03.controller 包下的 UserController 控制器的 doRegister 方法替换成下面两个方法,代码如下:

    package cn.hh.springmvc03.controller;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    package cn.hh.springmvc03..entity.User;
    @Controller
    @RequestMapping("/user")
    public class UserController {
    	@RequestMapping("/register.do")
    	public String register(){
    		return "register";
    	}
    	
    	@RequestMapping("/doregister.do")
    	public ModelAndView doRegister(User user){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("user",user);
    		mv.setViewName("forward:second.do");
    		return mv;
    	}
    	
    	@RequestMapping("/second.do")
    	public ModelAndView doSecond(User user){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("user",user);
    		mv.setViewName("forward:/WEB-INF/jsp/info.jsp");
    		return mv;
    	}
    }

    &emsp;&emsp;可以发现,参数仍然可以在两个方法之间传递,第一个方法把参数存进ModelAndView,第二个方法用同名形式参数接收。

    &emsp;&emsp;mv.setViewName(“forward:second.do”);这行代码实现转发到另一个方法second.do继续处理。

    【2】运行测试,结果同前。

    3、返回 String 时的请求转发

    &emsp;&emsp;当处理器方法返回String 时,该String 即为要跳转的视图。必须在其前面加上前辍 forward:,显式的指定跳转方式为请求转发。视图解析器将不会对其进行前辍与后辍的拼接,该String中的路径须是完整路径。

    &emsp;&emsp;请求转发的目标资源无论是一个页面,还是一个Controller,用法一样。

    项目案例: 用户注册成功后,转发给其他方法,由其他方法返回视图显示当前用户的基本信息。

    关键步骤:

    &emsp;&emsp;修改 UserController 控制器方法 doRegister 如下:

    package cn.hh.springmvc03.controller;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    package cn.hh.springmvc03..entity.User;
    @Controller
    @RequestMapping("/user")
    public class UserController {
    	@RequestMapping("/register.do")
    	public String register(){
    		return "register";
    	}
    	
    	@RequestMapping("/doregister.do")
    	public String doRegister(User user,HttpServletRequest request){
    		request.setAttribute("user", user);		
    		return "forward:/WEB-INF/jsp/info.jsp";
    	}
    }

    注意: 这种情况不能使用ModelAndView来传递数据,但可以使用HttpServletRequest等来传递数据。

    4、返回 void 时的请求转发

    &emsp;&emsp;当处理器方法返回void时,可以使用HttpServletRequest实现请求转发。既可转发到页面,也可转发到其他控制器方法。若有数据需要向目标资源传递,可将数据放入到 HttpServletRequest或 HttpSession 中。但不能将数据放到 Model、RedirectAttributes中,因为这两者的数据都是通过拼接到处理器方法的返回值中,作为请求的一部分出现向下传递的。但这里没有返回值,所以它们中的数据无法向下传递。

    package cn.hh.springmvc03.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    import cn.hh.springmvc03.entity.User;
    @Controller
    @RequestMapping("/user")
    public class UserController {
    	
    	@RequestMapping("/login.do")
    	public String login(){
    		return "login";
    	}
    	//重定向到控制器
    	@RequestMapping("/dologin.do")
    	public String doLogin(User user,Model model){
    		model.addAttribute("username",user.getUsername());
    		model.addAttribute("password",user.getPassword());
    		return "redirect:second.do";
    	}
    	
    	//逐个参数接收
    	@RequestMapping("/second.do")
    	public ModelAndView doSecond(String username,String password){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",username);
    		mv.addObject("password",password);
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}
    	
    	//整体接收
    	@RequestMapping("/third.do")
    	public ModelAndView doThird(User user){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",user.getUsername());
    		mv.addObject("password",user.getPassword());
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}
    	
    	@RequestMapping("/fourth.do")
    	public ModelAndView doFifth(HttpSession session){
    		User user=(User) session.getAttribute("user");
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",user.getUsername());
    		mv.addObject("password",user.getPassword());
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}
    
    	@RequestMapping("/register.do")
    	public String register(){
    		return "register";
    	}
    	
    	@RequestMapping("/doregister.do")
    	public String doRegister(User user,HttpServletRequest request){
    		request.setAttribute("user", user);		
    		return "forward:/WEB-INF/jsp/info.jsp";
    	}
    }

    5、请求重定向到其他页面

    &emsp;&emsp;在重定向时,请求参数不能通过HttpServletRequest向目标资源中传递。可以通过以下方式之一来传递请求参数。

    【1】通过 ModelAndView 中的 Model 携带参数

    &emsp;&emsp;当ModelAndView中的Model 存入数据后,视图解析器InternalResourceViewResolver 会将map中的key 与value,以请求参数的形式放到请求的URL后。 注意事项:

    放入到Model中的value,只能是基本数据类型与 String,不能是自定义类型的对象数据。原因是视图解析器会将Map的value放入到URL后作为请求参数传递出去,任何类型的value,都会变为String。重定向的面页中是无法从request 中读取数据的。但由于map中的key与value,以请求参数的形式放到了请求的URL后,所以,页面可以通过EL表达式中的请求参数param读取。重定向的页面不能是/WEB-INF下的页面。因为重定向相当于客户端发出一次新的请求,而客户端是不可以请求/WEB-INF下的资源的。

    项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

    关键步骤:

    【1.1】在WebContent 下创建页面 show.jsp,复制之前的 login.jsp 页面。

    show.jsp 代码如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    登录用户信息
    <form action="doregister.do">
    用户名:${param.username}<br/>
    密码:${param.password}<br/>
    </body>
    </html>

    【注意】这里用到了 param 对象。

    Login.jsp 代码如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    用户登录
    <form action="dologin.do">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/><br/>
    <input type="submit" value="登录"/>
    </form>
    </body>
    
    </html>

    【1.2】修改 UserController 控制器,添加方法 doLogin 如下:

    package cn.hh.springmvc03.controller;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    import cn.hh.springmvc03.User;
    @Controller
    @RequestMapping("/user")
    public class UserController {
    	@RequestMapping("/login.do")
    	public String login(){
    		return "login";
    	}
    	
    	@RequestMapping("/dologin.do")
    	public ModelAndView doLogin(User user){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",user.getUsername());
    		mv.addObject("password",user.getPassword());
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}
    
    	@RequestMapping("/register.do")
    	public String register(){
    		return "register";
    	}
    	
    	@RequestMapping("/doregister.do")
    	public String doRegister(User user,HttpServletRequest request){
    		request.setAttribute("user", user);		
    		return "forward:/WEB-INF/jsp/info.jsp";
    	}
    }

    【1.3】测试运行,输入“http://localhost:8080/user/login.do”。

    再次测试:如果在 show.jsp 页面删除 param,能否接收到数据。

    【2】使用 HttpSession 携带参数

    项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

    关键步骤:

    【2.1】在WebContent 下创建页面 show2.jsp,代码如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    登录用户信息<br/>
    
    用户名:${user.username}<br/>
    密码:${user.password}<br/>
    </body>
    </html>

    【2.2】修改方法 doLogin 代码如下:

    	@RequestMapping("/dologin.do")
    	public ModelAndView doLogin(User user,HttpSession session){
    		ModelAndView mv=new ModelAndView();
    		session.setAttribute("user", user);
    		mv.setViewName("redirect:/show2.jsp");
    		return mv;
    	}

    【2.3】测试运行,输入“http://localhost:8080/user/login.do”。

    6、请求重定向到其他控制器

    &emsp;&emsp;重定向到其它 Controller方法时,携带参数可以采用前面的其中一个方式。而目标Controller 接收这些参数,也有多种方式。

    【1】通过 ModelAndView 的 Model 携带参数

    &emsp;&emsp;目标Controller在接收这些参数时,只要保证目标 Controller的方法形参名称与发送 Controller 发送的参数名称相同即可接收。当然,目标 Controller 也可以进行参数的整体接收。只要保证参数名称与目标 Controller接收参数类型的类的属性名相同即可。

    项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。(

    【1.1】修改doLogin方法,添加两个目标方法。

    	@RequestMapping("/dologin.do")
    	public ModelAndView doLogin(User user){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",user.getUsername());
    		mv.addObject("password",user.getPassword());
    		//第1次测试
    		mv.setViewName("redirect:second.do");
    		//第2次测试
    		//mv.setViewName("redirect:third.do");
    		return mv;
    	}	
    	
    	//整体接收
    	@RequestMapping("/second.do")
    	public ModelAndView doSecond(User user){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",user.getUsername());
    		mv.addObject("password",user.getPassword());
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}	
    	
    	//逐个参数接收
    	@RequestMapping("/third.do")
    	public ModelAndView doThird(String username,String password){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",username);
    		mv.addObject("password",password);
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}

    【1.2】测试运行,输入http://localhost:8080/user/login.do。

    &emsp;&emsp;注释掉mv.setViewName(“redirect:second.do”),添加mv.setViewName(“redirect:third.do”)再次测试。观察两次结果是否相同。

    【2】使用 HttpSession 携带参数

    项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

    关键步骤: 修改 UserController 代码如下:

    	@RequestMapping("/dologin.do")
    	public ModelAndView doLogin(User user,HttpSession session){
    		session.setAttribute("user", user);
    		ModelAndView mv=new ModelAndView();		
    		mv.setViewName("redirect:fourth.do");
    		return mv;
    	}	
    	
    	@RequestMapping("/fourth.do")
    	public ModelAndView doFifth(HttpSession session){
    		User user=(User) session.getAttribute("user");
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",user.getUsername());
    		mv.addObject("password",user.getPassword());
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}

    7、返回 String 时的重定向

    &emsp;&emsp;可以重定向到页面,也可以重定向到其他控制器方法。当处理器的方法返回类型为String时,可在字符串中添加前缀redired:即可实现重定向。如果还要传递参数,可以通过URL携带参数,通过HttpSession 携带参数,通过Model携带参数等多种办法。这里重点介绍Model和RedirectAttributes携带参娄和的办法。

    【1】重定向到页面时携带参数

    【1.1】通过 Model 形参携带参数

    &emsp;&emsp;在Controller形参中添加 Model 参数,将要传递的数据放入 Model 中进行参数传递。这种方式同样也是将参数拼接到了重定向请求的 URL后,因而放入其中的数据只能是基本类型数据,不能是自定义类型。

    项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

    关键步骤: 修改 UserController 代码如下:

    	@RequestMapping("/dologin.do")
    	public String doLogin(User user,Model model){
    		model.addAttribute("username",user.getUsername());
    		model.addAttribute("password",user.getPassword());
    		return "redirect:/show.jsp";
    	}

    【1.2】通过形参 RedirectAttributes 携带参数

    &emsp;&emsp;RedirectAttributes专门用于携带重定向参数的。它其实继承自Model的接口,底层仍然使用ModelMap 实现。所以,这种携带参数的方式,同样不能携带自定义对象。

    项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

    关键步骤: 修改 UserController 代码如下:

    	@RequestMapping("/dologin.do")
    	public String doLogin(User user,RedirectAttributes rd){
    		rd.addAttribute("username",user.getUsername());
    		rd.addAttribute("password",user.getPassword());
    		return "redirect:/show.jsp";
    	}

    &emsp;&emsp;要使用 RedirectAttributes 参数,还需要在 SpringMVC 的配置文件中注册MVC 的注解驱动。

    <mvc:annotation-driven/>

    【2】重定向到控制器时携带参数

    &emsp;&emsp;重定向到控制器时,携带参数的方式,可以使用请求 URL 后携带方式,HttpSession携带方式,Model 形参携带方式等,下面案例学习下使用Model 形参携带参数,注意传递与接收的要点就是接收方法的形参的名称要与传递方法的model中的key名称一致。可以整体接收,也可以逐个参数接收。

    项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

    关键步骤: 修改 UserController 代码如下:

    	//重定向到控制器
    	@RequestMapping("/dologin.do")
    	public String doLogin(User user,Model model){
    		model.addAttribute("username",user.getUsername());
    		model.addAttribute("password",user.getPassword());
    		return "redirect:second.do";
    	}
    	//逐个参数接收
    	@RequestMapping("/second.do")
    	public ModelAndView doSecond(String username,String password){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",username);
    		mv.addObject("password",password);
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}
    	//整体接收
    	@RequestMapping("/second.do")
    	public ModelAndView doSecond(User user){
    		ModelAndView mv=new ModelAndView();
    		mv.addObject("username",user.getUsername());
    		mv.addObject("password",user.getPassword());
    		mv.setViewName("redirect:/show.jsp");
    		return mv;
    	}

    8、返回 void 时的重定向

    &emsp;&emsp;当处理器方法返回 void 时,使用 HttpServletResponse 的sendRedirect()方法实现重定向。若有数据需要向下一级资源传递,需要将数据放入到HttpSession中,不能放在HttpServletRequest中。

    项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

    关键步骤:

    修改 UserController 代码如下:

    	//重定向到控制器
    	@RequestMapping("/dologin.do")
    	public void doLogin(User user,HttpSession session,HttpServletRequest request,HttpServletResponse response){
    		session.setAttribute("username",user.getUsername());
    		session.setAttribute("password",user.getPassword());
    		try {
    			response.sendRedirect(request.getContextPath()+"/show3.jsp");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}

    在WebContent下添加页面 show3.jsp,代码如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    	<title>Insert title here</title>
    </head>
    <body>
    	登录用户信息<br/>
    	用户名:${username}<br/>
    	密码:${password}<br/>
    </body>
    </html>

    到此,关于“SpringMVC中的转发和重定向怎么掌握”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程之家网站,小编会继续努力为大家带来更多实用的文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原理介绍,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。传统事务中回滚点的使...
    今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
    这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区别,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Cloud Netfli...
    本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。第一步:整合pom文件,在S...
    本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List 坑列表 = new ArrayList(2);...
    这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇...
    本篇内容主要讲解“Spring中的@Autowired和@Resource注解怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学...
    今天小编给大家分享一下SpringSecurity怎么定义多个过滤器链的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
    这篇文章主要介绍“Spring的@Conditional注解怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring的@Con...
    这篇文章主要介绍了SpringCloudGateway的熔断限流怎么配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud&nb...
    今天小编给大家分享一下怎么使用Spring解决循环依赖问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
    这篇文章主要介绍“Spring事务及传播机制的原理及应用方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Sp...
    这篇“SpringCloudAlibaba框架实例应用分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价
    本篇内容主要讲解“SpringBoot中怎么使用SpringMVC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习...
    这篇文章主要介绍“SpringMVC适配器模式作用范围是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC
    这篇“导入SpringCloud依赖失败如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
    这篇文章主要讲解了“SpringMVC核心DispatcherServlet处理流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来
    今天小编给大家分享一下SpringMVCHttpMessageConverter消息转换器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
    这篇文章主要介绍“Spring框架实现依赖注入的原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring框架...
    本篇内容介绍了“Spring单元测试控制Bean注入的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下