一文徹底吃透SpringMVC中的轉(zhuǎn)發(fā)和重定向
當處理器完成請求處理后向其它資源進行跳轉(zhuǎn)時,有兩種跳轉(zhuǎn)方式:請求轉(zhuǎn)發(fā) 與 重定向。根據(jù)跳轉(zhuǎn)的資源類型,分為兩類:跳轉(zhuǎn)到 頁面 與跳轉(zhuǎn)到 其它處理器。請求轉(zhuǎn)發(fā)的頁面,可以是 WEB-INF 中頁面,但重定向的頁面不能為 WEB-INF中的頁面的,因為重定向相當于用戶重新發(fā)出一次請求,而用戶是不可以直接訪問 WEB-INF 中的資源。
項目案例(共用資源)
本項目案例是以 Idea+Maven 構(gòu)建的項目,項目目錄結(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> <!--注冊字符集過濾器--> <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、請求轉(zhuǎn)發(fā)到其他頁面
當處理器方法返回ModelAndView 時,跳轉(zhuǎn)到指定的ViewName,默認情況下使用的是請求轉(zhuǎn)發(fā),當然也可顯式的進行請求轉(zhuǎn)發(fā)。此時,需在setViewName()指定的視圖前添加forward關(guān)鍵字,一旦添加了forward關(guān)鍵字,控制器方法返回的視圖名稱就不會再與視圖解析器中的前輟與后輟進行拼接,所以必須寫出相對于項目根的完整路徑才能返回正確的視圖。
當通過請求轉(zhuǎn)發(fā)跳轉(zhuǎn)到目標資源(頁面或Controller)時,若需要目標資源傳遞數(shù)據(jù),可以使用 HttpRequestServlet,HttpSession,還可以將數(shù)據(jù)存放于ModelAndView中的Model中。目標頁面則通過 EL 表達式來訪問該數(shù)據(jù)。下面案例演示使用ModelAndView的情形。
項目案例: 用戶注冊完畢后,顯示用戶的注冊信息。
關(guān)鍵步驟:
【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”,注冊和轉(zhuǎn)發(fā)頁面如下圖所示:
注冊頁面:
轉(zhuǎn)發(fā)頁面:
2、請求轉(zhuǎn)發(fā)到其他控制器
當前控制器的處理方法處理完畢后也可不返回視圖,而是轉(zhuǎn)發(fā)給下一個控制器方法繼續(xù)處理。
項目案例: 用戶注冊成功后,轉(zhuǎn)發(fā)給其他方法,由其他方法返回視圖顯示當前用戶的基本信息。
關(guān)鍵步驟:
【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; } }
可以發(fā)現(xiàn),參數(shù)仍然可以在兩個方法之間傳遞,第一個方法把參數(shù)存進ModelAndView,第二個方法用同名形式參數(shù)接收。
mv.setViewName(“forward:second.do”);這行代碼實現(xiàn)轉(zhuǎn)發(fā)到另一個方法second.do繼續(xù)處理。
【2】運行測試,結(jié)果同前。
3、返回 String 時的請求轉(zhuǎn)發(fā)
當處理器方法返回String 時,該String 即為要跳轉(zhuǎn)的視圖。必須在其前面加上前輟 forward:,顯式的指定跳轉(zhuǎn)方式為請求轉(zhuǎn)發(fā)。視圖解析器將不會對其進行前輟與后輟的拼接,該String中的路徑須是完整路徑。
請求轉(zhuǎn)發(fā)的目標資源無論是一個頁面,還是一個Controller,用法一樣。
項目案例: 用戶注冊成功后,轉(zhuǎn)發(fā)給其他方法,由其他方法返回視圖顯示當前用戶的基本信息。
關(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來傳遞數(shù)據(jù),但可以使用HttpServletRequest等來傳遞數(shù)據(jù)。
4、返回 void 時的請求轉(zhuǎn)發(fā)
當處理器方法返回void時,可以使用HttpServletRequest實現(xiàn)請求轉(zhuǎn)發(fā)。既可轉(zhuǎn)發(fā)到頁面,也可轉(zhuǎn)發(fā)到其他控制器方法。若有數(shù)據(jù)需要向目標資源傳遞,可將數(shù)據(jù)放入到 HttpServletRequest或 HttpSession 中。但不能將數(shù)據(jù)放到 Model、RedirectAttributes中,因為這兩者的數(shù)據(jù)都是通過拼接到處理器方法的返回值中,作為請求的一部分出現(xiàn)向下傳遞的。但這里沒有返回值,所以它們中的數(shù)據(jù)無法向下傳遞。
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"; } //逐個參數(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、請求重定向到其他頁面
在重定向時,請求參數(shù)不能通過HttpServletRequest向目標資源中傳遞。可以通過以下方式之一來傳遞請求參數(shù)。
【1】通過 ModelAndView 中的 Model 攜帶參數(shù)
當ModelAndView中的Model 存入數(shù)據(jù)后,視圖解析器InternalResourceViewResolver 會將map中的key 與value,以請求參數(shù)的形式放到請求的URL后。 注意事項:
放入到Model中的value,只能是基本數(shù)據(jù)類型與 String,不能是自定義類型的對象數(shù)據(jù)。原因是視圖解析器會將Map的value放入到URL后作為請求參數(shù)傳遞出去,任何類型的value,都會變?yōu)镾tring。重定向的面頁中是無法從request 中讀取數(shù)據(jù)的。但由于map中的key與value,以請求參數(shù)的形式放到了請求的URL后,所以,頁面可以通過EL表達式中的請求參數(shù)param讀取。重定向的頁面不能是/WEB-INF下的頁面。因為重定向相當于客戶端發(fā)出一次新的請求,而客戶端是不可以請求/WEB-INF下的資源的。
項目案例: 用戶登錄成功后, 通過重定向頁面實現(xiàn)登錄后顯示用戶信息。
關(guān)鍵步驟:
【1.1】在WebContent 下創(chuàng)建頁面 show.jsp,復(fù)制之前的 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,能否接收到數(shù)據(jù)。
【2】使用 HttpSession 攜帶參數(shù)
項目案例: 用戶登錄成功后, 通過重定向頁面實現(xiàn)登錄后顯示用戶信息。
關(guān)鍵步驟:
【2.1】在WebContent 下創(chuàng)建頁面 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方法時,攜帶參數(shù)可以采用前面的其中一個方式。而目標Controller 接收這些參數(shù),也有多種方式。
【1】通過 ModelAndView 的 Model 攜帶參數(shù)
目標Controller在接收這些參數(shù)時,只要保證目標 Controller的方法形參名稱與發(fā)送 Controller 發(fā)送的參數(shù)名稱相同即可接收。當然,目標 Controller 也可以進行參數(shù)的整體接收。只要保證參數(shù)名稱與目標 Controller接收參數(shù)類型的類的屬性名相同即可。
項目案例: 用戶登錄成功后, 通過重定向頁面實現(xiàn)登錄后顯示用戶信息。(
【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; } //逐個參數(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】測試運行,輸入http://localhost:8080/user/login.do。
注釋掉mv.setViewName(“redirect:second.do”),添加mv.setViewName(“redirect:third.do”)再次測試。觀察兩次結(jié)果是否相同。
【2】使用 HttpSession 攜帶參數(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 時的重定向
可以重定向到頁面,也可以重定向到其他控制器方法。當處理器的方法返回類型為String時,可在字符串中添加前綴redired:即可實現(xiàn)重定向。如果還要傳遞參數(shù),可以通過URL攜帶參數(shù),通過HttpSession 攜帶參數(shù),通過Model攜帶參數(shù)等多種辦法。這里重點介紹Model和RedirectAttributes攜帶參婁和的辦法。
【1】重定向到頁面時攜帶參數(shù)
【1.1】通過 Model 形參攜帶參數(shù)
在Controller形參中添加 Model 參數(shù),將要傳遞的數(shù)據(jù)放入 Model 中進行參數(shù)傳遞。這種方式同樣也是將參數(shù)拼接到了重定向請求的 URL后,因而放入其中的數(shù)據(jù)只能是基本類型數(shù)據(jù),不能是自定義類型。
項目案例: 用戶登錄成功后, 通過重定向頁面實現(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】通過形參 RedirectAttributes 攜帶參數(shù)
RedirectAttributes專門用于攜帶重定向參數(shù)的。它其實繼承自Model的接口,底層仍然使用ModelMap 實現(xiàn)。所以,這種攜帶參數(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 的配置文件中注冊MVC 的注解驅(qū)動。
<mvc:annotation-driven/>
【2】重定向到控制器時攜帶參數(shù)
重定向到控制器時,攜帶參數(shù)的方式,可以使用請求 URL 后攜帶方式,HttpSession攜帶方式,Model 形參攜帶方式等,下面案例學(xué)習(xí)下使用Model 形參攜帶參數(shù),注意傳遞與接收的要點就是接收方法的形參的名稱要與傳遞方法的model中的key名稱一致??梢哉w接收,也可以逐個參數(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"; } //逐個參數(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 時的重定向
當處理器方法返回 void 時,使用 HttpServletResponse 的sendRedirect()方法實現(xiàn)重定向。若有數(shù)據(jù)需要向下一級資源傳遞,需要將數(shù)據(jù)放入到HttpSession中,不能放在HttpServletRequest中。
項目案例: 用戶登錄成功后, 通過重定向頁面實現(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下添加頁面 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決異常FileNotFoundException:class path resource找不到資源文件的問題
今天小編就為大家分享一篇關(guān)于解決異常FileNotFoundException:class path resource找不到資源文件的問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12Java實現(xiàn)自定義ArrayList類的示例代碼
這篇文章主要為大家簡單的介紹ArrayList一下里面的add方法、size方法、isEmpty方法,以及如何實現(xiàn)自定義ArrayList類,感興趣的可以了解一下2022-08-08SpringBoot整合Web之CORS支持與配置類和 XML配置及注冊攔截器
這篇文章主要介紹了SpringBoot整合Web開發(fā)中CORS支持與配置類和 XML配置及注冊攔截器的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Scala可變參數(shù)列表,命名參數(shù)和參數(shù)缺省詳解
這篇文章主要介紹了Scala可變參數(shù)列表,命名參數(shù)和參數(shù)缺省詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06