J2EE中幾個易混淆的點的不同!

以下內容爲網頁摘抄


URL和URI:

        

作者:daixinye
鏈接:https://www.zhihu.com/question/21950864/answer/154309494
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

統一資源標誌符URI就是在某一規則下能把一個資源獨一無二地標識出來。
拿人做例子,假設這個世界上所有人的名字都不能重複,那麼名字就是URI的一個實例,通過名字這個字符串就可以標識出唯一的一個人。
現實當中名字當然是會重複的,所以身份證號纔是URI,通過身份證號能讓我們能且僅能確定一個人。
那統一資源定位符URL是什麼呢。也拿人做例子然後跟HTTP的URL做類比,就可以有:

動物住址協議://地球/中國/浙江省/杭州市/西湖區/某大學/14號宿舍樓/525號寢/張三.人

可以看到,這個字符串同樣標識出了唯一的一個人,起到了URI的作用,所以URL是URI的子集。URL是以描述人的位置來唯一確定一個人的。
在上文我們用身份證號也可以唯一確定一個人。對於這個在杭州的張三,我們也可以用:

身份證號:123456789

來標識他。
所以不論是用定位的方式還是用編號的方式,我們都可以唯一確定一個人,都是URl的一種實現,而URL就是用定位的方式實現的URI。

回到Web上,假設所有的Html文檔都有唯一的編號,記作html:xxxxx,xxxxx是一串數字,即Html文檔的身份證號碼,這個能唯一標識一個Html文檔,那麼這個號碼就是一個URI。
而URL則通過描述是哪個主機上哪個路徑上的文件來唯一確定一個資源,也就是定位的方式來實現的URI。
對於現在網址我更傾向於叫它URL,畢竟它提供了資源的位置信息,如果有一天網址通過號碼來標識變成了741236985.html,那感覺叫成URI更爲合適,不過這樣子的話還得想辦法找到這個資源咯…

response.sendRedirect() 和 dispatcher.forward(request,response):

        

Java Web開發中,採用MVC模式的時候,在控制器完成模型的調用之後會選擇界面對用戶響應,用常有兩種方式:

1、通過response對象的sendRedirect方法。

2、通過RequestDispatcher對象的forward方法。

例如要跳轉登錄界面login.jsp,可以使用下面的兩種方式:

1、使用response

response.sendRedirect(request.getContextPath()+"/main.jsp");     // 使用request.getContextPath()獲取網站根目錄

2、使用RequestDispatcher

RequestDispatcher rd = request.getRequestDispatcher("login.jsp");

rd.forward(request,response);

這兩種方式有什麼區別?什麼情況下應該使用哪一種方式呢?

首先介紹兩者的區別。

第一點區別,過程不同:第一種方式相當於瀏覽器接收到了響應之後又向服務器發送了一次請求,所以相當於兩次請求。第二種方式相當於方法調用,在執行當前文件的過程中轉向執行目標文件,兩個文件(當前文件和目標文件)屬於同一次請求,最本質的特點就是兩次請求共享了reques對象和response對象。

第二點區別,地址欄不同:第一種方式下用戶在瀏覽器地址欄中看到的是目標文件的地址,第二種方式下用戶在瀏覽器地址欄中看到的是當前文件的地址。這一點也非常重要,後面介紹。

在使用的時候具體應如何選擇呢?

如果兩個文件的關係非常密切,則應該使用RequestDispatcher,如果兩個文件沒有直接的關聯關係,則應該使用response的sendRedirect方法。什麼樣的關係算是關係密切,什麼樣的關係算是沒有直接的關聯關係呢?例如查詢的控制器和查詢的結果界面之間就應該算是關係密切,因爲查詢控制器處理完之後肯定要轉向查詢結果界面。再例如添加信息的控制器和查詢控制器之間的關係就是沒有直接關係,通常在添加信息之後會跳轉到列表界面的控制器然後再跳轉到列表界面,修改信息或者刪除信息之後也可能會跳轉到列表界面的控制器然後再跳轉到列表界面。

下面是兩個比較特殊的應用:

1、如果希望通過request把當前在控制器中獲取的信息傳遞給目標文件(通過request.setAttribute和request.getAttribute),這時候應該選擇RequestDispatcher。因爲需要當前文件和目標文件共享request對象。通常用於查詢。

2、對數據進行修改(包括刪除和添加操作)的功能的控制器與之後的界面或者控制器應該採用response.sendRedirect方式。如果採用了RequestDiapatcher的forward方式,會產生嚴重錯誤。因爲地址欄是修改信息的控制器,如果用戶在刷新的時候,會重新發送一次對數據進行修改的請求,這不是用戶想看到的結果。所以有同學在做添加功能的時候,每刷新一次就添加一條。

如何採用第二種方式,如何傳遞數據呢?有兩種方式:

1、可以選擇session,但是在第二個文件中一定要刪除。

2、可以在請求字符串中編寫,例如login.jsp?info="用戶不存在!

 

爲什麼response.sendRedirect()不跳轉,在其後加上return;就能夠跳轉了呢

response.sendRedirect是通過瀏覽器來做轉向的,所以只有在整個頁面處理完成後,纔會有實際的動作。

Cookie和Session:

Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集羣、數據庫、文件中;

Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式

具體看一看這個博客:點擊打開鏈接

發佈了41 篇原創文章 · 獲贊 22 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章