forward、redirect、瀏覽器的路徑問題



瀏覽器:

1、路徑以“/”開頭,瀏覽器會把http://localhost:8080/作為根目錄

<img src="http://images.cnblogs.com/mark_arrow_03.gif" width="14" height="14"/> 在sysmgr文件中。

瀏覽器請求:http://zmg-pc:8088/images/mark_arrow_03.gif   失敗

2、路徑以“../”開頭,瀏覽器會把當前所在的目錄作為根目錄,查找上一級目錄

<img src="../images/mark_arrow_03.gif" width="14" height="14"/> 在sysmgr文件中。

瀏覽器請求:http://zmg-pc:8088/DRP/images/mark_arrow_03.gif   成功

3、以文件名開頭,瀏覽器會把當前所在的目錄作為根目錄,查找子目錄

<img src="images/mark_arrow_03.gif" width="14" height="14"/> 在sysmgr文件中。

瀏覽器請求:http://zmg-pc:8088/DRP/sysmgr/images/mark_arrow_03.gif  失敗

 

 

forward,redirect

在相對路徑上,兩者的表現是相同的

看看lingo-sample/03-03/這個例子,如果我們去請求relative/forward.jsp或redirect.jsp,然后從這里再轉向它下面的result/result.jsp會怎樣呢?

  1. forward的例子:

    <%request.getRequestDispatcher("result/result.jsp").forward(request, response);%>

    這里的相對路徑就是result/result.jsp。

    因為剛剛請求的test.jsp是在/03-03/relative/下,所以我們的當前路徑就是/03-03/relative/,執行forward的時候會尋找當前路徑下的result/result.jsp,/03-03/relative/result/result.jsp,找到之后便轉發請求。

  2. redirect的例子:

    <%response.sendRedirect("result/result.jsp");%>

    這里的相對路徑也是result/result.jsp。

    因為剛剛請求的test.jsp是在/03-03/relative/下,所以我們的當前路徑就是/03-03/relative/,
    執行redirect的時候會把當前路徑加上(相當於尋找當前路徑下)result/result.jsp,把結果作為重定向的地址發送給瀏覽器,
    瀏覽器再去請求/03-03/relative/result/result.jsp,從而得到響應。

3.4.1.2. 絕對路徑

問題出現了,絕對路徑在forward和redirect中出現了差別,還是剛才的情況,但使用絕對路徑的時候寫法便不同了。

  1. forward的例子:

    <%request.getRequestDispatcher("/relative/result/result.jsp").forward
    (request, response);%>

    這里的絕對路徑就是/relative/result/result.jsp。

    在本地測試時,forward把http://localhost:8080/03-03/當作根路徑,在它的基礎上計算絕對路徑。為什么?

    因為這是由jsp的部署方式決定的,webapp里可以放好多項目,為了讓這些項目可以互不影響、獨立運行,不能讓請求從一個項目直接在服務器內部轉移到另一個項目。為了防止出現這種情況,Tomcat在執行forward的時候干脆把項目的路徑當作根目錄,開發者看不到其他項目,也就不會出現問題了。

  2. redirect的例子:

    <%response.sendRedirect("/03-03/absolute/result/result.jsp");%>

    這里的絕對路徑卻是/03-03/absolute/result/result.jsp。

    在本地測試時,redirect把http://localhost:8080/當作根路徑,在它的基礎上計算絕對路徑。

    因為redirect會讓瀏覽器重新發起一個新請求,所以不會攪亂服務器里多個項目之間的關系,
    也就不需要對它做限制,如果需要在多個項目之間進行跳轉,就只能使用redirect。不過因為
    重新發起了新的請求,上次請求的那些數據都會丟失,如果有什么重要的數據,記得要重新設置。

總結:

以“文件名開頭”,相對路徑,都在當前目錄下找。

以“../”開頭的,相對路徑,都在當前目錄的上一級目錄找。

以“/”開頭,絕對路徑,forward以當前項目文件為根目錄找,瀏覽器和redirect以http://localhost:8080/為根目錄找。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM