首頁 > 軟體

一文徹底吃透SpringMVC中的轉發和重定向

2023-04-08 06:01:45

當處理器完成請求處理後向其它資源進行跳轉時,有兩種跳轉方式:請求轉發重定向。根據跳轉的資源型別,分為兩類:跳轉到 頁面 與跳轉到 其它處理器。請求轉發的頁面,可以是 WEB-INF 中頁面,但重定向的頁面不能為 WEB-INF中的頁面的,因為重定向相當於使用者重新發出一次請求,而使用者是不可以直接存取 WEB-INF 中的資源。

專案案例(共用資源)

本專案案例是以 Idea+Maven 構建的專案,專案目錄結構如下:

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”,註冊和轉發頁面如下圖所示:

註冊頁面:

轉發頁面:

2、請求轉發到其他控制器

  當前控制器的處理方法處理完畢後也可不返回檢視,而是轉發給下一個控制器方法繼續處理。

專案案例: 使用者註冊成功後,轉發給其他方法,由其他方法返回檢視顯示當前使用者的基本資訊。

關鍵步驟:

【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;
	}
}

  可以發現,引數仍然可以在兩個方法之間傳遞,第一個方法把引數存進ModelAndView,第二個方法用同名形式引數接收。

  mv.setViewName(“forward:second.do”);這行程式碼實現轉發到另一個方法second.do繼續處理。

【2】執行測試,結果同前。

3、返回 String 時的請求轉發

  當處理器方法返回String 時,該String 即為要跳轉的檢視。必須在其前面加上前輟 forward:,顯式的指定跳轉方式為請求轉發。檢視解析器將不會對其進行前輟與後輟的拼接,該String中的路徑須是完整路徑。

  請求轉發的目標資源無論是一個頁面,還是一個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 String doRegister(User user,HttpServletRequest request){
		request.setAttribute("user", user);		
		return "forward:/WEB-INF/jsp/info.jsp";
	}
}

注意: 這種情況不能使用ModelAndView來傳遞資料,但可以使用HttpServletRequest等來傳遞資料。

4、返回 void 時的請求轉發

  當處理器方法返回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、請求重定向到其他頁面

  在重定向時,請求引數不能通過HttpServletRequest向目標資源中傳遞。可以通過以下方式之一來傳遞請求引數。

【1】通過 ModelAndView 中的 Model 攜帶引數

  當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、請求重定向到其他控制器

  重定向到其它 Controller方法時,攜帶引數可以採用前面的其中一個方式。而目標Controller 接收這些引數,也有多種方式。

【1】通過 ModelAndView 的 Model 攜帶引數

  目標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。

  註釋掉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 時的重定向

  可以重定向到頁面,也可以重定向到其他控制器方法。當處理器的方法返回型別為String時,可在字串中新增字首redired:即可實現重定向。如果還要傳遞引數,可以通過URL攜帶引數,通過HttpSession 攜帶引數,通過Model攜帶引數等多種辦法。這裡重點介紹Model和RedirectAttributes攜帶參婁和的辦法。

【1】重定向到頁面時攜帶引數

【1.1】通過 Model 形參攜帶引數

  在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 攜帶引數

  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";
	}

  要使用 RedirectAttributes 引數,還需要在 SpringMVC 的組態檔中註冊MVC 的註解驅動。

<mvc:annotation-driven/>

【2】重定向到控制器時攜帶引數

  重定向到控制器時,攜帶引數的方式,可以使用請求 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 時的重定向

  當處理器方法返回 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中轉發和重定向的文章就介紹到這了,更多相關SpringMVC轉發和重定向內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com