三者概述
requset概述:
request是表示一個請求,只要發出一個請求就會建立一個request
用處:常用於伺服器間同一請求不同頁面之間的引數傳遞,常應用於表單的控制元件值傳遞。
session概述:
伺服器會為每個會話建立一個session物件,所以session中的資料可供當前會話中所有servlet共享。
會話:使用者開啟瀏覽器會話開始,直到關閉瀏覽器會話才會結束。一次會話期間只會建立一個session物件。
用處:常用於web開發中的登陸驗證介面(當使用者登入成功後瀏覽器分配其一個session鍵值對)。
application概述:
Application屬性範圍值,只要設定一次,則所有的網頁視窗都可以取得資料。
ServletContext在伺服器啟動時建立,在伺服器關閉時銷燬,一個JavaWeb應用只建立一個ServletContext物件,所有的客戶端在訪問伺服器時都共享同一個ServletContext物件;
用處:ServletContext物件一般用於在多個客戶端間共享資料時使用;
具體案例
我寫了一個小demo,大家可以看一下,下面這是程式碼。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/getCount")
public class CountServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException {
// super.service(req, resp);
Integer countRequset = (Integer) requset.getAttribute("count");
if (countRequset==null) {
countRequset = 0;
}
countRequset++;
requset.setAttribute("count",countRequset);
System.out.println("ok");
Integer countSession = (Integer) requset.getSession().getAttribute("count");
if (countSession==null) {
countSession = 0;
}
countSession++;
requset.getSession().setAttribute("count",countSession);
Integer countContext = (Integer) requset.getSession().getServletContext().getAttribute("count");
if (countContext==null) {
countContext = 0;
}
countContext++;
requset.getSession().getServletContext().setAttribute("count",countContext);
requset.getRequestDispatcher("WEB-INF/page/count_page.jsp").forward(requset,response);
}
}
我在程式碼中申明瞭三個變數,都是count,不同就在於不是同一個空間中的變數,我們來瀏覽器看看效果:
-
這是在一個瀏覽器中,第一次進入之後的效果。
-
我在這個瀏覽器中重新整理8次:
可以看到,每次的請求都是1,其他的隨著我的重新整理次數而增加。 -
我在其他瀏覽器輸入相同的訪問網址:
可以看到,請求和會話都重置,只有伺服器的次數是上一次的再加1。
上面是具體效果,下面我們來詳細的看看他們
三者共同作用
三者共同目的:
requset,session,application三者存在的意義就是前後端進行資料傳輸。
三者使用各自的作用域進行傳遞資料和儲存資料
三者共有的常用屬性:
getAttribute()與setAttribute()
後端要透過getAttribute()進行資料的獲取以及透過setAttribute()進行設定屬性,然後資料被前端使用。
所以三者都可以透過 setAttribute() 賦值和 getAttribute() 取值。
同時還有其他類如removesetAttribute()等屬性,不做詳解。
三者主要區別
三者作用域不同
作用域大小為
requset(請求作用域)< session(會話作用域) < application(全域性作用範圍)
request:
第一個作用域是request,他僅在當前請求中有效。
作用域:一次HTTP請求到伺服器處理結束,返回響應的整個過程。
session:
第二個作用域是session,他在當前會話有效。
作用域:當一臺電腦上的同意瀏覽器對伺服器進行多次訪問的時候,在這多次訪問之間傳遞信的資訊就是session作用域的範圍。
application:
第三個作用域是application,它所在的所有應用程式中都有效。
作用域:如果不進行手工刪除,它們將一直可以使用,也就是當伺服器開始到伺服器結束的這段時間,application作用域中儲存的資料都是有效的,所有使用者均可使用。
request、session以及application這3個物件的作用域範圍是逐個增加的:
- request只在一個請求的範圍內;
- session 是在瀏覽器視窗的範圍內;
- application則是在整個伺服器的執行過程中。
作用域選擇不正確會有什麼後果:
- 作用域小了:不能在需要的場景獲得資料。
- 作用域大了:記憶體浪費。
如何正確的選擇作用域
- request:跟當前操作功能相關
- session: 跟使用者資訊相關
- application:跟專案全域性資訊相關----->京東配送地址
注意事項(備註&擴充套件)
request
request物件內資料存活範圍是當客戶端向伺服器傳送一個請求,伺服器向客戶端返回一個響應之後,該請求物件就被銷燬了。之後再次傳送的請求也無法獲取之前request物件存放的任何資料。
session
session是伺服器端物件,儲存在伺服器端。並且伺服器可以將建立session後產生的sessionid透過一個cookie返回給客戶端,以便下次驗證。(session底層依賴於cookie)
它從瀏覽器發出第一個HTTP請求即可認為是會話的開始,但是會話結束的時間是不確定的,因為在瀏覽器關閉的時候並不會通知伺服器,一般Tomcat設定的預設時間為120分鐘,也可以進行設定,或者是強制結束當前會話。
其他
這三者的setAttribute與getAttribute方法都是在伺服器端內部執行的,客戶端不知道伺服器端是否執行過這兩個方法。