request是表示一個請求,只要發出一個請求就會建立一個request
用處:常用於伺服器間同一請求不同頁面之間的引數傳遞,常應用於表單的控制元件值傳遞。
伺服器會為每個對談建立一個session物件,所以session中的資料可供當前對談中所有servlet共用。
對談:使用者開啟瀏覽器對談開始,直到關閉瀏覽器對談才會結束。一次對談期間只會建立一個session物件。
用處:常用於web開發中的登陸驗證介面(當用戶登入成功後瀏覽器分配其一個session鍵值對)。
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物件內資料存活範圍是當用戶端向伺服器傳送一個請求,伺服器向用戶端返回一個響應之後,該請求物件就被銷燬了。之後再次傳送的請求也無法獲取之前request物件存放的任何資料。
session是伺服器端物件,儲存在伺服器端。並且伺服器可以將建立session後產生的sessionid通過一個cookie返回給使用者端,以便下次驗證。(session底層依賴於cookie)
它從瀏覽器發出第一個HTTP請求即可認為是對談的開始,但是對談結束的時間是不確定的,因為在瀏覽器關閉的時候並不會通知伺服器,一般Tomcat設定的預設時間為120分鐘,也可以進行設定,或者是強制結束當前對談。
這三者的setAttribute與getAttribute方法都是在伺服器端內部執行的,使用者端不知道伺服器端是否執行過這兩個方法。