a. 轉發是一個請求一次響應,重定向是兩次請求兩次響應;java
b. 轉發地址欄不發生變化,重定向地址欄發生變化(會顯示重定向後的地址);web
c. 轉發只能轉發到本項目中其餘控制器(在學習JavaWeb的時候,說的是:轉發只能轉發到本項目中其餘Servlet),重定向不只能重定向到本項目中的其餘控制器(或其餘Servlet),還能重定向到其餘項目;spring
d. 轉發是服務器端的行爲,只需給出轉發的相對路徑,重定向須要給出請求URI(即包含項目名)。服務器
a. 若須要地址欄發生變化,則使用重定向;mvc
b. 轉發會攜帶數據,重定向不會攜帶數據。app
c. 轉發能夠轉發到JavaWeb項目的/WEB-INF目錄下面的頁面,可是重定向不能夠重定向到/WEB-INF目錄下面的頁面(資源),由於/WEB-INF目錄下面的資源是不能夠直接訪問的,因爲轉發是服務器端行爲,因此能夠轉發到jsp
/WEB-INF目錄下面的資源,可是重定向至關於發送了兩次請求,重定向到/WEB-INF目錄下面的資源,就至關於直接訪問了/WEN-INF目錄下面的資源,因此是不被容許的。學習
package com.sun.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 使用ServletAPI進行數據輸出到界面、轉發和重定向 * * @author sunhongguang * @create 2020-11-25-23:04 */ @Controller @RequestMapping(path = "/c2") public class ControllerTest2 { /** * 使用response向頁面輸出數據 * * @param request * @param response * @throws IOException */ @GetMapping(path = "/t1") public void test1(HttpServletRequest request, HttpServletResponse response) throws IOException { response.getWriter().println(request.getSession().getId()); } /** * 使用request.getRequestDispatcher(path).forward(request,response) 進行轉發 * 注意:轉發的路徑前面不用寫項目名 (本項目的項目名稱是/springmvc) * @param request * @param response * @throws ServletException * @throws IOException */ @GetMapping(path = "/t2") public void test2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("msg", request.getSession().getId()); request.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(request, response); } /** * 使用request.getRequestDispatcher(path).forward(request,response) 進行轉發,轉發到本項目中的其餘控制器(好比轉發到 t2) * 注意:轉發到其餘控制器時,只能寫相對路徑(即:要轉發的路徑前面不能帶 / ) * * @param request * @param response * @throws ServletException * @throws IOException */ @GetMapping(path = "/t2_1") public void test2_1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("t2").forward(request, response); } /** * 使用response.sendRedirect(paht)進行重定向 * * @param request * @param response */ @GetMapping(path = "/t3") public void test3(HttpServletRequest request, HttpServletResponse response) throws IOException { response.sendRedirect("/springmvc/index.jsp"); } /** * 使用response.sendRedirect(paht)進行重定向 * 注意:要重定向的路徑前面不能帶 / ,即要使用相對路徑 * * @param request * @param response * @throws IOException */ @GetMapping(path = "/t3_1") public void test3_1(HttpServletRequest request, HttpServletResponse response) throws IOException { response.sendRedirect("t3"); } }
package com.sun.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; /** * 經過SpringMVC實現轉發和重定向(不須要視圖解析器) * @author sunhongguang * @create 2020-11-26-0:04 */ @Controller @RequestMapping(path = "/c3") public class ControllerTest3 { /** * 直接寫要轉發的路徑(不用帶項目名) * @return */ @GetMapping(path = "/t1") public String test1(HttpServletRequest request){ request.setAttribute("msg", request.getSession().getId()); return "/WEB-INF/jsp/test.jsp"; } /** * 直接寫要轉發的路徑(不用帶項目名,轉發的路徑前面寫上forward) * @return */ @GetMapping(path = "/t1_1") public String test1_1(HttpServletRequest request){ request.setAttribute("msg", request.getSession().getId()); return "forward:/WEB-INF/jsp/test.jsp"; } /** * 轉發到另一個請求(好比轉發到 /t1),不帶forward * @return */ @GetMapping(path = "/t1_2") public String test1_2(){ return "t1"; } /** * 轉發到另一個請求(好比轉發到 /t1),帶forward * @return */ @GetMapping(path = "/t1_3") public String test1_3(){ return "forward:t1"; } /** * 重定向須要加上redirect,不用寫項目名 * @return */ @RequestMapping("/t2") public String test2(){ return "redirect:/index.jsp"; } /** * 重定向須要加上redirect, * @return */ @RequestMapping("/t2_1") public String test2_1(){ return "redirect:t2"; } }