1. 程式人生 > >JSP九大內置對象和四大作用域和Servlet的三大作用域對象

JSP九大內置對象和四大作用域和Servlet的三大作用域對象

成功 tput sender 共享 多個 保留 規範 buffer 依賴

一、JSP九大內置對象:內置對象(又叫隱含對象,有9個內置對象):不需要預先聲明就可以在腳本代碼和表達式中隨意使用

內置對象特點:

  • 由JSP規範提供,不用編寫者實例化。

  • 通過Web容器實現管理

  • 所有JSP頁面均可使用

  • 只有在腳本元素的表達式代碼段中才可使用(<%=使用內置對象%><%使用內置對象%>)

常用內置對象:

  • ** 輸出輸入對象:**request對象、response對象、out對象

  • ** 通信控制對象:**pageContext對象、session對象、application對象

  • Servlet對象:page對象、config對象

  • 錯誤處理對象:

    exception對象

括號內為其對應的類

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四個作用域中

  1. 如果把變量放到pageContext裏,就說明它的作用域是page,它的有效範圍只在當前jsp頁面裏。 從把變量放到pageContext開始,到jsp頁面結束,你都可以使用這個變量。

  2. 如果把變量放到request裏,就說明它的作用域是request,它的有效範圍是當前請求周期。所謂請求周期,就是指從http請求發起,到服務器處理結束,返回響應的整個過程。在這個過程中可能使用forward的方式跳轉了多個jsp頁面,在這些頁面裏你都可以使用這個變量。

  3. 如果把變量放到session裏,就說明它的作用域是session,它的有效範圍是當前會話。所謂當前會話,就是指從用戶打開瀏覽器開始,到用戶關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要用戶不關瀏覽器,服務器就有辦法知道這些請求是一個人發起的,整個過程被稱為一個會話(session),而放到會話中的變量。

  4. 如果把變量放到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的三大作用域對象