SpringMVC之轉發&重定向

 1. 使用Servlet原生API進行數據輸出到頁面、轉發和重定向

  1.1 轉發和重定向的區別

  a. 轉發是一個請求一次響應,重定向是兩次請求兩次響應;java

  b. 轉發地址欄不發生變化,重定向地址欄發生變化(會顯示重定向後的地址);web

  c. 轉發只能轉發到本項目中其餘控制器(在學習JavaWeb的時候,說的是:轉發只能轉發到本項目中其餘Servlet),重定向不只能重定向到本項目中的其餘控制器(或其餘Servlet),還能重定向到其餘項目;spring

  d. 轉發是服務器端的行爲,只需給出轉發的相對路徑,重定向須要給出請求URI(即包含項目名)。服務器

  1.2 說明

  a. 若須要地址欄發生變化,則使用重定向;mvc

  b. 轉發會攜帶數據,重定向不會攜帶數據。app

  c. 轉發能夠轉發到JavaWeb項目的/WEB-INF目錄下面的頁面,可是重定向不能夠重定向到/WEB-INF目錄下面的頁面(資源),由於/WEB-INF目錄下面的資源是不能夠直接訪問的,因爲轉發是服務器端行爲,因此能夠轉發到jsp

      /WEB-INF目錄下面的資源,可是重定向至關於發送了兩次請求,重定向到/WEB-INF目錄下面的資源,就至關於直接訪問了/WEN-INF目錄下面的資源,因此是不被容許的。學習

  1.3 代碼

 

 

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

2. 經過SpringMVC實現轉發和重定向(不須要視圖解析器)

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";
    }
}
相關文章
相關標籤/搜索