天天看點

技術分析:JSP頁面的五種跳轉方法find /home/michael/test -lname b.javafind /home/michael/test -samefile /home/michael/test/a.txtfind /home -inum 660650find /home/michael/test -type l -ls

①RequestDispatcher.forward()

是在伺服器端起作用,當使用forward()時,Servlet engine傳遞HTTP請求從目前的Servlet or JSP到另外一個Servlet,JSP 或普通HTML檔案,也即你的form送出至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此時form送出的所有資訊在 b.jsp都可以獲得,參數自動傳遞. 但forward()無法重定向至有frame的jsp檔案,可以重定向至有frame的html檔案,同時forward()無法在後面帶參數傳遞,比如servlet?name=frank,這樣不行,可以程式内通過response.setAttribute(name,name)來傳至下一個頁面。

重定向後浏覽器位址欄URL不變。

例:在servlet中進行重定向

通常在servlet中使用,不在jsp中使用。

② response.sendRedirect()

是在使用者的浏覽器端工作,sendRedirect()可以帶參數傳遞,比如servlet?name=frank傳至下個頁面,同時它可以重定向至不同的主機上,sendRedirect()可以重定向有frame.的jsp檔案.

重定向後在浏覽器位址欄上會出現重定向頁面的URL

例:在servlet中重定向

由于response是jsp頁面中的隐含對象,故在jsp頁面中可以用response.sendRedirect()直接實作重定位。

注意:

(1) 使用response.sendRedirect時,前面不能有HTML輸出;

這并不是絕對的,不能有HTML輸出其實是指不能有HTML被送到了浏覽器。事實上現在的server都有cache機制,一般在8K(我是說 JSP SERVER),這就意味着,除非你關閉了cache,或者你使用了out.flush()強制重新整理,那麼在使用sendRedirect之前,有少量的HTML輸出也是允許的。

(2) response.sendRedirect之後,應該緊跟一句return。

我們已經知道response.sendRedirect是通過浏覽器來做轉向的,是以隻有在頁面處理完成後,才會有實際的動作。既然你已經要做轉向了,那麼後的輸出還的意義呢?而且有可能會因為後面的輸出導緻轉向失敗。

比較:

(1) Dispatcher.forward()是容器中控制權的轉向,在用戶端浏覽器位址欄中不會顯示出轉向後的位址;

(2) response.sendRedirect()則是完全的跳轉,浏覽器将會得到跳轉的位址,并重新發送請求連結。這樣,從浏覽器的位址欄中可以看到跳轉後的連結位址。

前者更加高效,在前者可以滿足需要時,盡量使用RequestDispatcher.forward()方法。

注:在有些情況下,比如,需要跳轉到一個其它伺服器上的資源,則必須使用HttpServletResponse.sendRequest()方法。

③<jsp:forward page= />https://www.yaoruanwen.com/n/464060.html

它的底層部分是由RequestDispatcher來實作的,是以它帶有RequestDispatcher.forward()方法的印記。

如果在之前有很多輸出,前面的輸出已使緩沖區滿,将自動輸出到用戶端,那麼該語句将不起作用,這一點應該特别注意。

另外要注意:它不能改變浏覽器位址,重新整理的話會導緻重複送出

④ 修改HTTP header的Location屬性來重定向

通過設定直接修改位址欄來實作頁面的重定向。

jsp檔案代碼如下:

⑤ JSP中實作在某頁面停留若幹秒後,自動重定向到另一頁面

在html檔案中,下面的代碼:

<meta http-equiv=refresh content=300; url=target.jsp>

它的含義:在5分鐘之後正在浏覽的頁面将會自動變為target.htmlhttps://www.yaoruanwen.com/n/464057.html這一頁。代碼中300為重新整理的延遲時間,以秒為機關。targer.html為你想轉向的目标頁,若為本頁則為自動重新整理本頁。

由上可知,可以通過setHeader來實作某頁面停留若幹秒後,自動重定向到另一頁面。

在學習檔案處理指令時,我們學習了如何建立軟連結和硬連結。這兩種檔案是linux系統中的“特殊檔案”,相當于windows檔案系統中的快捷方式。那麼下面再具體講講軟連接配接和硬連結的差別。如果想弄明白軟硬連結,首先我們得先知道inode的概念。

1、inode

在前面的文章我們提過,一個檔案是由目錄塊、inode、資料塊三部分組成。

1)目錄塊:記錄着檔案名和inode節點号碼;

2)inode: 存儲的資訊有唯一辨別号碼, 建立時間、修改時間 、檔案大小、屬主、歸屬組、讀寫權限、資料所在block号等資訊

3)資料塊:是儲存檔案真實資料的地方。

在 Linux 中, inode存儲的參數中唯獨不包含檔案名,而inode号碼(索引節點号)才是檔案的唯一辨別而非檔案名。檔案名僅是為了友善人們的記憶和使用,系統或程式通過 inode 号尋找正确的檔案資料塊。下圖展示了程式通過檔案名擷取檔案内容的過程。

在Linux 系統中檢視 inode 号可使用指令 stat 或 ls -i(若是 AIX 系統,則使用指令 istat)。

當我們使用指令 mv 移動并重命名檔案時,檔案的使用者資料及https://www.yaoruanwen.com/n/464054.html inode号碼不會改變,檔案移動前後 inode 号還是:916538。

為解決檔案的共享使用,Linux 系統引入了兩種連結:硬連結 (hard link) 與軟連結(soft link)。連結不僅解決了檔案的共享使用,還帶來了隐藏檔案路徑、增權重限安全及節省存儲等優勢。

2、硬連結

若一個 inode 号對應多個檔案名,則稱這些檔案為硬連結。換言之,硬連結就是同一個檔案使用了多個别名(如下圖,硬連結就是file的一個别名,他們有共同的 inode)。

下面我們來做個測試:我們先準備兩個檔案,詳情如下:

然後,給a.txt做一個硬連結aaaHard,詳情如下:

建立硬連結前,a.txt顯示的連結數目為1,建立連結後

1)a.txt和aaaHard的連結數目都變為2。

2)a.txt和aaaHard的inode号是一樣的,都是916538

3)a.txt和aaaHard顯示的檔案大小也是一樣,都是11B。

再使用stat指令查詢一下:

由此可見:a.txt和aaaHard隻是同一個檔案的兩個名字而已, 它們具有同樣的索引節點号和檔案屬性,建立檔案a.txt的硬連結,就是為https://www.yaoruanwen.com/n/464053.html a.txt的檔案索引節點在目前目錄上建立一個新指針。你可以删除其中任何一個,如rm a.txt,每次隻會删除一個指針,連結數同時減一,隻有将所有指向檔案内容的指針,也即連結數減為0時,核心才會把檔案内容從磁盤上删除。

3、軟連接配接

軟連結與硬連結不同,軟連結就是一個普通檔案,有着自己的 inode 号以及使用者資料塊,隻不過對應的資料塊裡的内容比較特殊,存儲的是另一檔案的路徑名的指向。(見圖解)

現在,我們繼續上一個測試,給b.java添加軟連接配接,詳情如下:

從上圖,我們不難發現,軟連結的inode号碼與b.java的不是同一個,檔案大小也不一樣等等。

4、硬連結與軟連接配接的差別

硬連結和軟連結不僅僅是在概念上的不同,在實作方式上也不同。我們總結一下硬連結與軟連結的差別:

硬連結檔案和源檔案公用一個inode号,說明他們是同一個檔案,而軟連結檔案和源檔案擁有不同的inode号,表明他們是兩個不同的檔案;https://www.yaoruanwen.com/n/464048.html

在檔案屬性上軟連結明确寫出了是連結檔案,而硬連結沒有寫出來,因為在本質上硬連結檔案和源檔案是同一個檔案;

連結數目是不一樣的,軟連結的連結數目不會增加;

檔案大小是不一樣的,硬連結檔案顯示的大小是跟原檔案是一樣的。而軟連結大小與源檔案就不同了。

使用者不能給目錄建立硬連結,軟連接配接卻可以指向目錄

硬連結不可以跨檔案系統。因為 inode 是這個檔案在目前分區中的索引值,是相對于這個分區的。而軟連結沒有任何檔案系統的限制

軟連接配接也是有缺點的:因為軟連接配接的資料塊記憶體儲的是源檔案的路徑資訊,是以當源檔案被移動到其他目錄後,再通路連結檔案,系統就找不到了源檔案了,軟連結就成了死連結。而硬連結是沒有這個缺陷的,怎麼移動源檔案都沒有關系;還有它要系統配置設定額外的空間用于建立新的索引節點和儲存源檔案的路徑的資料塊。

5、與軟硬連結相關的操作

除了“ls -il”指令檢視檔案的屬性及其inode号碼,和stat指令 檢視檔案的inode資訊外,我們還可以使用find指令進行一些查詢操作:

案例1: 查找在路徑https://www.yaoruanwen.com/n/464045.html /home/michael/test 下的檔案 b.java 的軟連結

find /home/michael/test -lname b.java

案例2: 檢視路徑 /home/michael/test有相同 inode 的所有硬連結

find /home/michael/test -samefile /home/michael/test/a.txt

案例3:查詢inode号碼是660650的檔案

find /home -inum 660650

案例4:列出路徑 /home/michael/test下的所有軟連結檔案

find /home/michael/test -type l -ls