JSP九大內置對象和四大作用域和Servlet的三大作用域對象
一、JSP九大內置對象:內置對象(又叫隱含對象,有9個內置對象):不需要預先聲明就可以在腳本代碼和表達式中隨意使用
內置對象特點:
由JSP規範提供,不用編寫者實例化。
通過Web容器實現和管理
所有JSP頁面均可使用
只有在腳本元素的表達式或代碼段中才可使用(<%=使用內置對象%>或<%使用內置對象%>)
常用內置對象:
** 輸出輸入對象:**request對象、response對象、out對象
** 通信控制對象:**pageContext對象、session對象、application對象
Servlet對象:page對象、config對象
錯誤處理對象:
括號內為其對應的類
Request(ServletRequest):它包含了有關瀏覽器請求的信息.通過該對象可以獲得請求中的頭信息、Cookie和請求參數。
Response(ServletResponse):作為JSP頁面處理結果返回給用戶的響應存儲在該對象中。並提供了設置響應內容、響應頭以及重定向的方法(如cookies,頭信息等)
Out(JspWriter):用於將內容寫入JSP頁面實例的輸出流中,提供了幾個方法使你能用於向瀏覽器回送輸出結果。
pageContext(PageContext):描述了當前JSP頁面的運行環境。可以返回JSP頁面的其他隱式對象及其屬性的訪問,另外,它還實現將控制權從當前頁面傳輸至其他頁面的方法。
Session(HttpSession):會話對象存儲有關此會話的信息,也可以將屬性賦給一個會話,每個屬性都有名稱和值。會話對象主要用於存儲和檢索屬性值。
Application(ServletContext):存儲了運行JSP頁面的servlet以及在同一應用程序中的任何Web組件的上下文信息。
Page(Object):表示當前JSP頁面的servlet實例
Config(ServletConfig):該對象用於存取servlet實例的初始化參數。
Exception(Throwable):在某個頁面拋出異常時,將轉發至JSP錯誤頁面,提供此對象是為了在JSP中處理錯誤。只有在錯誤頁面中才可使用<%@page isErrorPage=“true”%>
Jsp內置對象 | 功能 | 主要方法 |
---|---|---|
out | 向客戶端輸出數據 | print() println() flush() clear() isAutoFlush() getBufferSize() close() ………… |
request | 向客戶端請求數據 | getAttributeNames() getCookies() getParameter() getParameterValues() setAttribute() getServletPath() ………… |
response | 封裝了jsp產生的響應,然後被發送到客戶端以響應客戶的請求 | addCookie() sendRedirect() setContentType() flushBuffer() getBufferSize() getOutputStream() sendError() containsHeader()…………… |
application | Gryffindor | 90 |
config | 表示Servlet的配置,當一個Servlet初始化時,容器把某些信息通過此對象傳遞給這個Servlet | getServletContext() getServletName() getInitParameter() getInitParameterNames()…………… |
page | Jsp實現類的實例,它是jsp本身,通過這個可以對它進行訪問 | flush()……… |
pagecontext | 為JSP頁面包裝頁面的上下文。管理對屬於JSP中特殊可見部分中己經命名對象的該問 | forward() getAttribute() getException() getRequest() getResponse() getServletConfig() getSession() getServletContext() setAttribute() removeAttribute() findAttribute() …………… |
session | 用來保存每個用戶的信息,以便跟蹤每個用戶的操作狀態 | getAttribute() getId() getAttributeNames() getCreateTime() getMaxInactiveInterval() invalidate() isNew() |
exception | 反映運行的異常 | getMessage()………… |
二、JSP四大作用域
jsp的四大作用域為:PageContext,ServletRequest,HttpSession,ServletContext;
ServletRequest域:作用範圍是整個請求鏈(請求轉發也存在);生命周期是在service方法調用前由服務器創建,傳入service方法。整個請求結束,request生命結束。
HttpSession域:作用範圍是一次會話。生命周期是在第一次調用request.getSession()方法時,服務器會檢查是否已經有對應的session,如果沒有就在內存中創建一個session並返回。當一段時間內session沒有被使用(默認為30分鐘),則服務器會銷毀該session。如果服務器非正常關閉(強行關閉),沒有到期的session也會跟著銷毀。如果調用session提供的invalidate() ,可以立即銷毀session。
ServletContext域:作用範圍是整個Web應用。生命周期是當Web應用被加載進容器時創建代表整個web應用的ServletContext對象,當服務器關閉或Web應用被移除時,ServletContext對象跟著銷毀。
作用域從小到大為:PageContext(jsp頁面)< ServletRequest(一次請求)< HttpSession(一次會話)< ServletContext(整個web應用)。
pageContext, request, session、application四個作用域中
如果把變量放到pageContext裏,就說明它的作用域是page,它的有效範圍只在當前jsp頁面裏。 從把變量放到pageContext開始,到jsp頁面結束,你都可以使用這個變量。
如果把變量放到request裏,就說明它的作用域是request,它的有效範圍是當前請求周期。所謂請求周期,就是指從http請求發起,到服務器處理結束,返回響應的整個過程。在這個過程中可能使用forward的方式跳轉了多個jsp頁面,在這些頁面裏你都可以使用這個變量。
如果把變量放到session裏,就說明它的作用域是session,它的有效範圍是當前會話。所謂當前會話,就是指從用戶打開瀏覽器開始,到用戶關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要用戶不關瀏覽器,服務器就有辦法知道這些請求是一個人發起的,整個過程被稱為一個會話(session),而放到會話中的變量。
如果把變量放到application裏,就說明它的作用域是application,它的有效範圍是整個應用。整個應用是指從應用啟動,到應用結束。我們沒有說“從服務器啟動,到服務器關閉”是因為一個服務器可能部署多個應用,當然你關閉了服務器,就會把上面所有的應用都關閉了。application作用域裏的變量,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。與上述三個不同的是,application裏的變量可以被所有用戶共用。如果用戶甲的操作修改了application中的變量,用戶乙訪問時得到的是修改後的值。這在其他scope中都是不會發生的,page, request, session都是完全隔離的,無論如何修改都不會影響其他
** 三、servlet的三大作用域對象:**
1.request(HttpServletRequest)
request是表示一個請求,只要發出一個請求就會創建一個request,它的作用域:僅在當前請求中有效。
用處:常用於服務器間同一請求不同頁面之間的參數傳遞,常應用於表單的控件值傳遞。
方法:request.setAttribute(); request.getAttribute(); request.removeAttribute(); request.getParameter().
2.session(HttpSession):
服務器會為每個會話創建一個session對象,所以session中的數據可供當前會話中所有servlet共享。
會話:用戶打開瀏覽器會話開始,直到關閉瀏覽器會話才會結束。一次會話期間只會創建一個session對象。
用處:常用於web開發中的登陸驗證界面(當用戶登錄成功後瀏覽器分配其一個session鍵值對)。
方法:session.setAttribute(); session.getAttribute(); session.removeAttribute();
獲得session對象方法:
在Servlet中:HttpSession session = request.getSession();
由於session屬於jsp九大內置對象之一,當然可以直接使用。例如:<%session.serAttribute("name","admin")%>。session被銷毀
1.session超時;
2.客戶端關閉後,再也訪問不到和該客戶端對應的session了,它會在超時之後被銷毀;
3.調用session. invalidate();
備註: session是服務器端對象,保存在服務器端。並且服務器可以將創建session後產生的sessionid通過一個cookie返回給客戶端,以便下次驗證。(session底層依賴於cookie)
3.application(ServletContext):
tomcat啟動時創建,tomcat關閉時銷毀,整個web的生命周期只有一個
作用範圍:所有的用戶都可以取得此信息,此信息在整個服務器上被保留。Application屬性範圍值,只要設置一次,則所有的網頁窗口都可以取得數據。ServletContext在服務器啟動時創建,在服務器關閉時銷毀,一個JavaWeb應用只創建一個ServletContext對象,所有的客戶端在訪問服務器時都共享同一個ServletContext對象;ServletContext對象一般用於在多個客戶端間共享數據時使用;
- 獲取application對象方法(Servlet中):
ServletContext app01 = this.getServletContext();
app01.setAttribute("name", "kaixuan"); //設置一個值進去
ServletContext app02 = this.getServletContext();
app02.getAttribute("name"); //獲取鍵值對
ServletContext同屬於JSP九大內置對象之一,故可以直接使用
備註:服務器只會創建一個ServletContext 對象,所以app01就是app02,通過app01設置的值當然可以通過app02獲取。
Servlet三大作用域總結:
作用域: (1)request,(2)session,(3)application
(1)使用作用域傳遞數據和存儲數據
(2)使用作用域傳遞數據時,必須掌握作用域對應的生命周期和作用範圍
生命周期
(1) request:只限於一次請求
(2) session:一次會話(多次請求)
開始
用戶向服務器發送請求的時候 結束 客戶端 丟失JsessionId值的時候(關閉瀏覽器) 服務器端 關閉服務器 超過會話的不活動周期時間
(3) application:項目的加載到卸載
作用範圍
(1) requset:所有被請求轉發的Servlet
(2) session:所有的Servlet
(3)application:所有的Servlet(換一個瀏覽器演示,跟session作用域區分)
如何正確的選擇作用域
(1) request:跟當前操作功能相關
(2) session: 跟用戶信息相關
(3) application:跟項目全局信息相關
如何正確的選擇作用域不正確,會出現什麽情況:
內存浪費
JSP九大內置對象和四大作用域和Servlet的三大作用域對象