欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文徹底吃透SpringMVC中的轉(zhuǎn)發(fā)和重定向

 更新時(shí)間:2023年04月07日 11:50:14   作者:Java?Fans  
大家應(yīng)該都知道springmvc本來(lái)就會(huì)把返回的字符串作為視圖名解析,然后轉(zhuǎn)發(fā)到對(duì)應(yīng)的視圖,這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)和重定向的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

當(dāng)處理器完成請(qǐng)求處理后向其它資源進(jìn)行跳轉(zhuǎn)時(shí),有兩種跳轉(zhuǎn)方式:請(qǐng)求轉(zhuǎn)發(fā)重定向。根據(jù)跳轉(zhuǎn)的資源類型,分為兩類:跳轉(zhuǎn)到 頁(yè)面 與跳轉(zhuǎn)到 其它處理器。請(qǐng)求轉(zhuǎn)發(fā)的頁(yè)面,可以是 WEB-INF 中頁(yè)面,但重定向的頁(yè)面不能為 WEB-INF中的頁(yè)面的,因?yàn)橹囟ㄏ蛳喈?dāng)于用戶重新發(fā)出一次請(qǐng)求,而用戶是不可以直接訪問(wèn) WEB-INF 中的資源。

項(xiàng)目案例(共用資源)

本項(xiàng)目案例是以 Idea+Maven 構(gòu)建的項(xiàng)目,項(xiàng)目目錄結(jié)構(gòu)如下:

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>
  <!--注冊(cè)字符集過(guò)濾器-->
  <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>
      <!--強(qiáng)制使用指定字符集-->
      <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、請(qǐng)求轉(zhuǎn)發(fā)到其他頁(yè)面

當(dāng)處理器方法返回ModelAndView 時(shí),跳轉(zhuǎn)到指定的ViewName,默認(rèn)情況下使用的是請(qǐng)求轉(zhuǎn)發(fā),當(dāng)然也可顯式的進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)。此時(shí),需在setViewName()指定的視圖前添加forward關(guān)鍵字,一旦添加了forward關(guān)鍵字,控制器方法返回的視圖名稱就不會(huì)再與視圖解析器中的前輟與后輟進(jìn)行拼接,所以必須寫出相對(duì)于項(xiàng)目根的完整路徑才能返回正確的視圖。

當(dāng)通過(guò)請(qǐng)求轉(zhuǎn)發(fā)跳轉(zhuǎn)到目標(biāo)資源(頁(yè)面或Controller)時(shí),若需要目標(biāo)資源傳遞數(shù)據(jù),可以使用 HttpRequestServlet,HttpSession,還可以將數(shù)據(jù)存放于ModelAndView中的Model中。目標(biāo)頁(yè)面則通過(guò) EL 表達(dá)式來(lái)訪問(wèn)該數(shù)據(jù)。下面案例演示使用ModelAndView的情形。

項(xiàng)目案例: 用戶注冊(cè)完畢后,顯示用戶的注冊(cè)信息。

關(guān)鍵步驟:

【1】在 WEB-INF/jsp 下新建 register.jsp 和 info.jsp 頁(yè)面

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>
用戶注冊(cè)
<form action="doregister.do">
姓名:<input type="text" name="username"/><br/>
密碼:<input type="text" name="password"/><br/>
<input type="submit" value="注冊(cè)"/>
</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>
用戶注冊(cè)信息<br/>
用戶名:${user.username}<br/>
密碼:${user.password}<br/>
</body>
</html>

【2】在 cn.hh.springmvc03.entity 包下,新建實(shí)體類 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】運(yùn)行測(cè)試,輸入“http://localhost:8080/user/register.do”,注冊(cè)和轉(zhuǎn)發(fā)頁(yè)面如下圖所示:

注冊(cè)頁(yè)面:

轉(zhuǎn)發(fā)頁(yè)面:

2、請(qǐng)求轉(zhuǎn)發(fā)到其他控制器

  當(dāng)前控制器的處理方法處理完畢后也可不返回視圖,而是轉(zhuǎn)發(fā)給下一個(gè)控制器方法繼續(xù)處理。

項(xiàng)目案例: 用戶注冊(cè)成功后,轉(zhuǎn)發(fā)給其他方法,由其他方法返回視圖顯示當(dāng)前用戶的基本信息。

關(guān)鍵步驟:

【1】 將 cn.hh.springmvc03.controller 包下的 UserController 控制器的 doRegister 方法替換成下面兩個(gè)方法,代碼如下:

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

  可以發(fā)現(xiàn),參數(shù)仍然可以在兩個(gè)方法之間傳遞,第一個(gè)方法把參數(shù)存進(jìn)ModelAndView,第二個(gè)方法用同名形式參數(shù)接收。

  mv.setViewName(“forward:second.do”);這行代碼實(shí)現(xiàn)轉(zhuǎn)發(fā)到另一個(gè)方法second.do繼續(xù)處理。

【2】運(yùn)行測(cè)試,結(jié)果同前。

3、返回 String 時(shí)的請(qǐng)求轉(zhuǎn)發(fā)

  當(dāng)處理器方法返回String 時(shí),該String 即為要跳轉(zhuǎn)的視圖。必須在其前面加上前輟 forward:,顯式的指定跳轉(zhuǎn)方式為請(qǐng)求轉(zhuǎn)發(fā)。視圖解析器將不會(huì)對(duì)其進(jìn)行前輟與后輟的拼接,該String中的路徑須是完整路徑。

  請(qǐng)求轉(zhuǎn)發(fā)的目標(biāo)資源無(wú)論是一個(gè)頁(yè)面,還是一個(gè)Controller,用法一樣。

項(xiàng)目案例: 用戶注冊(cè)成功后,轉(zhuǎn)發(fā)給其他方法,由其他方法返回視圖顯示當(dāng)前用戶的基本信息。

關(guān)鍵步驟:

  修改 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來(lái)傳遞數(shù)據(jù),但可以使用HttpServletRequest等來(lái)傳遞數(shù)據(jù)。

4、返回 void 時(shí)的請(qǐng)求轉(zhuǎn)發(fā)

  當(dāng)處理器方法返回void時(shí),可以使用HttpServletRequest實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)。既可轉(zhuǎn)發(fā)到頁(yè)面,也可轉(zhuǎn)發(fā)到其他控制器方法。若有數(shù)據(jù)需要向目標(biāo)資源傳遞,可將數(shù)據(jù)放入到 HttpServletRequest或 HttpSession 中。但不能將數(shù)據(jù)放到 Model、RedirectAttributes中,因?yàn)檫@兩者的數(shù)據(jù)都是通過(guò)拼接到處理器方法的返回值中,作為請(qǐng)求的一部分出現(xiàn)向下傳遞的。但這里沒(méi)有返回值,所以它們中的數(shù)據(jù)無(wú)法向下傳遞。

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";
	}
	
	//逐個(gè)參數(shù)接收
	@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、請(qǐng)求重定向到其他頁(yè)面

  在重定向時(shí),請(qǐng)求參數(shù)不能通過(guò)HttpServletRequest向目標(biāo)資源中傳遞??梢酝ㄟ^(guò)以下方式之一來(lái)傳遞請(qǐng)求參數(shù)。

【1】通過(guò) ModelAndView 中的 Model 攜帶參數(shù)

  當(dāng)ModelAndView中的Model 存入數(shù)據(jù)后,視圖解析器InternalResourceViewResolver 會(huì)將map中的key 與value,以請(qǐng)求參數(shù)的形式放到請(qǐng)求的URL后。 注意事項(xiàng):

放入到Model中的value,只能是基本數(shù)據(jù)類型與 String,不能是自定義類型的對(duì)象數(shù)據(jù)。原因是視圖解析器會(huì)將Map的value放入到URL后作為請(qǐng)求參數(shù)傳遞出去,任何類型的value,都會(huì)變?yōu)镾tring。重定向的面頁(yè)中是無(wú)法從request 中讀取數(shù)據(jù)的。但由于map中的key與value,以請(qǐng)求參數(shù)的形式放到了請(qǐng)求的URL后,所以,頁(yè)面可以通過(guò)EL表達(dá)式中的請(qǐng)求參數(shù)param讀取。重定向的頁(yè)面不能是/WEB-INF下的頁(yè)面。因?yàn)橹囟ㄏ蛳喈?dāng)于客戶端發(fā)出一次新的請(qǐng)求,而客戶端是不可以請(qǐng)求/WEB-INF下的資源的。

項(xiàng)目案例: 用戶登錄成功后, 通過(guò)重定向頁(yè)面實(shí)現(xiàn)登錄后顯示用戶信息。

關(guān)鍵步驟:

【1.1】在WebContent 下創(chuàng)建頁(yè)面 show.jsp,復(fù)制之前的 login.jsp 頁(yè)面。

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 對(duì)象。

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】測(cè)試運(yùn)行,輸入“http://localhost:8080/user/login.do”。

再次測(cè)試:如果在 show.jsp 頁(yè)面刪除 param,能否接收到數(shù)據(jù)。

【2】使用 HttpSession 攜帶參數(shù)

項(xiàng)目案例: 用戶登錄成功后, 通過(guò)重定向頁(yè)面實(shí)現(xiàn)登錄后顯示用戶信息。

關(guān)鍵步驟:

【2.1】在WebContent 下創(chuàng)建頁(yè)面 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】測(cè)試運(yùn)行,輸入“http://localhost:8080/user/login.do”。

6、請(qǐng)求重定向到其他控制器

  重定向到其它 Controller方法時(shí),攜帶參數(shù)可以采用前面的其中一個(gè)方式。而目標(biāo)Controller 接收這些參數(shù),也有多種方式。

【1】通過(guò) ModelAndView 的 Model 攜帶參數(shù)

  目標(biāo)Controller在接收這些參數(shù)時(shí),只要保證目標(biāo) Controller的方法形參名稱與發(fā)送 Controller 發(fā)送的參數(shù)名稱相同即可接收。當(dāng)然,目標(biāo) Controller 也可以進(jìn)行參數(shù)的整體接收。只要保證參數(shù)名稱與目標(biāo) Controller接收參數(shù)類型的類的屬性名相同即可。

項(xiàng)目案例: 用戶登錄成功后, 通過(guò)重定向頁(yè)面實(shí)現(xiàn)登錄后顯示用戶信息。(

【1.1】修改doLogin方法,添加兩個(gè)目標(biāo)方法。

	@RequestMapping("/dologin.do")
	public ModelAndView doLogin(User user){
		ModelAndView mv=new ModelAndView();
		mv.addObject("username",user.getUsername());
		mv.addObject("password",user.getPassword());
		//第1次測(cè)試
		mv.setViewName("redirect:second.do");
		//第2次測(cè)試
		//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;
	}	
	
	//逐個(gè)參數(shù)接收
	@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】測(cè)試運(yùn)行,輸入http://localhost:8080/user/login.do。

  注釋掉mv.setViewName(“redirect:second.do”),添加mv.setViewName(“redirect:third.do”)再次測(cè)試。觀察兩次結(jié)果是否相同。

【2】使用 HttpSession 攜帶參數(shù)

項(xiàng)目案例: 用戶登錄成功后, 通過(guò)重定向頁(yè)面實(shí)現(xiàn)登錄后顯示用戶信息。

關(guān)鍵步驟: 修改 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 時(shí)的重定向

  可以重定向到頁(yè)面,也可以重定向到其他控制器方法。當(dāng)處理器的方法返回類型為String時(shí),可在字符串中添加前綴redired:即可實(shí)現(xiàn)重定向。如果還要傳遞參數(shù),可以通過(guò)URL攜帶參數(shù),通過(guò)HttpSession 攜帶參數(shù),通過(guò)Model攜帶參數(shù)等多種辦法。這里重點(diǎn)介紹Model和RedirectAttributes攜帶參婁和的辦法。

【1】重定向到頁(yè)面時(shí)攜帶參數(shù)

【1.1】通過(guò) Model 形參攜帶參數(shù)

  在Controller形參中添加 Model 參數(shù),將要傳遞的數(shù)據(jù)放入 Model 中進(jìn)行參數(shù)傳遞。這種方式同樣也是將參數(shù)拼接到了重定向請(qǐng)求的 URL后,因而放入其中的數(shù)據(jù)只能是基本類型數(shù)據(jù),不能是自定義類型。

項(xiàng)目案例: 用戶登錄成功后, 通過(guò)重定向頁(yè)面實(shí)現(xiàn)登錄后顯示用戶信息。

關(guān)鍵步驟: 修改 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】通過(guò)形參 RedirectAttributes 攜帶參數(shù)

  RedirectAttributes專門用于攜帶重定向參數(shù)的。它其實(shí)繼承自Model的接口,底層仍然使用ModelMap 實(shí)現(xiàn)。所以,這種攜帶參數(shù)的方式,同樣不能攜帶自定義對(duì)象。

項(xiàng)目案例: 用戶登錄成功后, 通過(guò)重定向頁(yè)面實(shí)現(xiàn)登錄后顯示用戶信息。

關(guān)鍵步驟: 修改 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 參數(shù),還需要在 SpringMVC 的配置文件中注冊(cè)MVC 的注解驅(qū)動(dòng)。

<mvc:annotation-driven/>

【2】重定向到控制器時(shí)攜帶參數(shù)

  重定向到控制器時(shí),攜帶參數(shù)的方式,可以使用請(qǐng)求 URL 后攜帶方式,HttpSession攜帶方式,Model 形參攜帶方式等,下面案例學(xué)習(xí)下使用Model 形參攜帶參數(shù),注意傳遞與接收的要點(diǎn)就是接收方法的形參的名稱要與傳遞方法的model中的key名稱一致??梢哉w接收,也可以逐個(gè)參數(shù)接收。

項(xiàng)目案例: 用戶登錄成功后, 通過(guò)重定向頁(yè)面實(shí)現(xiàn)登錄后顯示用戶信息。

關(guān)鍵步驟: 修改 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";
	}
	//逐個(gè)參數(shù)接收
	@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 時(shí)的重定向

  當(dāng)處理器方法返回 void 時(shí),使用 HttpServletResponse 的sendRedirect()方法實(shí)現(xiàn)重定向。若有數(shù)據(jù)需要向下一級(jí)資源傳遞,需要將數(shù)據(jù)放入到HttpSession中,不能放在HttpServletRequest中。

項(xiàng)目案例: 用戶登錄成功后, 通過(guò)重定向頁(yè)面實(shí)現(xiàn)登錄后顯示用戶信息。

關(guān)鍵步驟:

修改 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下添加頁(yè)面 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>

總結(jié)

到此這篇關(guān)于SpringMVC中轉(zhuǎn)發(fā)和重定向的文章就介紹到這了,更多相關(guān)SpringMVC轉(zhuǎn)發(fā)和重定向內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決異常FileNotFoundException:class path resource找不到資源文件的問(wèn)題

    解決異常FileNotFoundException:class path resource找不到資源文件的問(wèn)題

    今天小編就為大家分享一篇關(guān)于解決異常FileNotFoundException:class path resource找不到資源文件的問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Intellij IDEA配置Jetty的方法示例

    Intellij IDEA配置Jetty的方法示例

    這篇文章主要介紹了Intellij IDEA配置Jetty的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Java實(shí)現(xiàn)自定義ArrayList類的示例代碼

    Java實(shí)現(xiàn)自定義ArrayList類的示例代碼

    這篇文章主要為大家簡(jiǎn)單的介紹ArrayList一下里面的add方法、size方法、isEmpty方法,以及如何實(shí)現(xiàn)自定義ArrayList類,感興趣的可以了解一下
    2022-08-08
  • Java的Channel通道之FileChannel類詳解

    Java的Channel通道之FileChannel類詳解

    這篇文章主要介紹了Java的Channel通道之FileChannel類詳解,FileChannel類是Java NIO中的一個(gè)重要類,用于在文件中進(jìn)行讀寫操作,它提供了一種高效的方式來(lái)處理大文件和隨機(jī)訪問(wèn)文件的需求,需要的朋友可以參考下
    2023-10-10
  • 詳解JVM虛擬機(jī)的類加載機(jī)制

    詳解JVM虛擬機(jī)的類加載機(jī)制

    這篇文章主要介紹了詳解JVM虛擬機(jī)的類加載機(jī)制,虛擬機(jī)把描述類的數(shù)據(jù)從 Class 文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的 Java 類型,這就是虛擬機(jī)的類加載機(jī)制,需要的朋友可以參考下
    2023-08-08
  • java實(shí)現(xiàn)文件下載的兩種方式

    java實(shí)現(xiàn)文件下載的兩種方式

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件下載的兩種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SpringBoot整合Web之CORS支持與配置類和 XML配置及注冊(cè)攔截器

    SpringBoot整合Web之CORS支持與配置類和 XML配置及注冊(cè)攔截器

    這篇文章主要介紹了SpringBoot整合Web開(kāi)發(fā)中CORS支持與配置類和 XML配置及注冊(cè)攔截器的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Scala可變參數(shù)列表,命名參數(shù)和參數(shù)缺省詳解

    Scala可變參數(shù)列表,命名參數(shù)和參數(shù)缺省詳解

    這篇文章主要介紹了Scala可變參數(shù)列表,命名參數(shù)和參數(shù)缺省詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 圖解JVM內(nèi)存模型

    圖解JVM內(nèi)存模型

    這篇文章主要介紹了JVM內(nèi)存模型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java虛擬機(jī),感興趣的朋友可以了解詳細(xì)
    2020-10-10
  • 一篇文章輕松了解SpringBoot配置高級(jí)

    一篇文章輕松了解SpringBoot配置高級(jí)

    大家都知道SpringBoot擁有良好的基因,還能簡(jiǎn)化編碼、配置、部署、監(jiān)控,也是現(xiàn)在面試必問(wèn)的一個(gè)點(diǎn),下面這篇文章主要給大家介紹了如何通過(guò)一篇文章輕松了解SpringBoot配置高級(jí)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評(píng)論