亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC中的轉發和重定向怎么掌握

發布時間:2023-04-07 16:33:17 來源:億速云 閱讀:127 作者:iii 欄目:開發技術

這篇文章主要介紹“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中的轉發和重定向怎么掌握”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    苗栗市| 邯郸县| 隆化县| 沅江市| 利津县| 阜阳市| 海原县| 万源市| 临湘市| 舒兰市| 三原县| 界首市| 聂拉木县| 新昌县| 包头市| 黎平县| 宁波市| 宜昌市| 丹巴县| 镇沅| 车致| 崇文区| 灵台县| 历史| 惠东县| 丰都县| 湖南省| 钟山县| 罗田县| 丰县| 北川| 伽师县| 东方市| 江西省| 枣强县| 那坡县| 榆社县| 华坪县| 崇礼县| 博白县| 台东市|