SpringMVC 04: SpringMVC中4種頁面跳轉方式
轉發和重定向的頁面跳轉方式
- 頁面跳轉方式,本質上只有2種方式:轉發 + 重定向
- 但在SpringMVC的具體實現上,轉發可以細分為:普通的頁面轉發 + 經由action方法的頁面轉發
- 重定向可以細分為:普通的頁面重定向 + 經由action方法的頁面重定向
- 所以在具體的程式碼實現層面上,頁面跳轉可以細分為4種方式
- 本例中的SpringMVC項目配置和SpringMVC部落格集(指SpringMVC 02)一致
- 在webapp/admin目錄下新建main.jsp,作為各種請求的最終響應頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>main.jsp</title>
</head>
<body>
<h2>main......page......</h2>
</body>
</html>
- webapp/index.jsp如下,是包含四種頁面跳轉方式的前端頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index.jsp</title>
</head>
<body>
<h2>4種轉發和重定向的方式</h2>
<hr>
<a href="${pageContext.request.contextPath}/one.action">1.普通轉發頁面(對請求的默認處理方式)</a><br><br>
<a href="${pageContext.request.contextPath}/two.action">2.action轉發頁面</a><br><br>
<a href="${pageContext.request.contextPath}/three.action">3.普通重定向頁面</a><br><br>
<a href="${pageContext.request.contextPath}/four.action">4.action重定向頁面</a>
</body>
</html>
- 新建控制器:JumpAction,其中含有測試4種頁面跳轉方式的action方法
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class JumpAction {
/**
1.
之前在springmvc.xml中配置了視圖解析器,這是SpringMVC處理頁面跳轉的默認方式,屬於普通轉發跳轉
會將頁面轉發到action方法的返回值和前綴後綴拼接形成的路徑所對應資源頁面
*/
@RequestMapping("/one")
public String one(){
System.out.println("one action被訪問......");
return "main";
}
/** 2.
* 下面是我們註冊的視圖解析器的父類:UrlBasedViewResolver,中的幾個參數
* 通過對底層源程式碼的解讀,可知在action方法的返回值字元串中,如果以"redirect:"或者"forward:"開頭則不會執行視圖解析器的路徑拼接
* 而是會按照redirect或forward完成頁面重定向或頁面跳轉
*
* public static final String REDIRECT_URL_PREFIX = "redirect:";
* public static final String FORWARD_URL_PREFIX = "forward:";
* private String prefix = "";
* private String suffix = "";
*
* 注意:不管要使用action的頁面轉發或者是action的頁面重定向,由於action方法是控制器內部的方法
* 所以要想訪問action方法必須訪問到控制SpringMVC控制器,而要訪問控制器,前提是要能被SpringMVC核心處理器處理(也就是底層的servlet)
* 而要想被底層servlet處理,必須滿足請求路徑的通配條件,這是我們在web.xml文件中配置好的"*.action"
* 所以要在請求的末尾加上".action"以滿足請求的通配要求,才有資格被交給SpringMVC的控制器中的方法處理
*/
@RequestMapping("/two")
public String two(){
System.out.println("other action被訪問......");
return "forward:/one.action";
}
/**
* 如果是普通重定向,直接重定向到項目資源,不需要控制器中的action方法的處理,請求路徑後不用跟".action",直接寫重定向的資源路徑即可
*
*/
@RequestMapping("/three")
public String three(){
System.out.println("three action被訪問......");
return "redirect:/admin/main.jsp";
}
/**
* 要在請求的末尾加上".action"以滿足請求的通配要求,才有資格被交給SpringMVC的控制器中的方法執行
*
*/
@RequestMapping("/four")
public String four(){
System.out.println("other action被訪問....");
return "redirect:/three.action";
}
}
- 部署並啟動tomcat測試
- 網站首頁
- 測試1:普通轉發頁面
- 響應頁面(left),控制台輸出(right)如下:重點關注響應頁面的地址欄地址,由於訪問次序為one.action —>轉發—>main.jsp,所以顯示one.action
- 測試2:action轉發頁面
- 響應頁面(left),控制台輸出(right)如下:重點關注響應頁面的地址欄地址,由於訪問次序為two.action —>轉發—> one.action —>轉發—>main.jsp,所以顯示two.action
-
測試3:普通重定向頁面
-
響應頁面(left),控制台輸出(right)如下:重點關注響應頁面的地址欄地址,由於訪問次序為three.action —>重定向—>main.jsp,所以顯示main.jsp
- 測試4:action重定向頁面
- 響應頁面(left),控制台輸出(right)如下:重點關注響應頁面的地址欄地址,由於訪問次序為four.action —>重定向—> three.action —>重定向—>main.jsp,所以顯示main.jsp