九大內置對象
內置對象(又叫隱含對象,有9個內置對象):不需要預先聲明就可以在腳本代碼和表達式中隨意使用
JSP中九大內置對象為:
- pageContext 頁面上下文對象 類型 javax.servlet.jsp.PageContext 作用域 Page
- request 請求對象 類型 javax.servlet.ServletRequest 作用域 Request
- response 響應對象 類型 javax.servlet.SrvletResponse 作用域 Page
- session 會話對象 類型 javax.servlet.http.HttpSession 作用域 Session
- application 應用程序對象 類型 javax.servlet.ServletContext 作用域 Application
- out 輸出對象 類型 javax.servlet.jsp.JspWriter 作用域 Page
- config 配置對象 類型 javax.servlet.ServletConfig 作用域 Page
- exception 例外對象 類型 javax.lang.Throwable 作用域 page
- page 頁面對象 類型javax.lang.Object 作用域 Page
1)pageContext
①javax.servlet.jsp.PageContext(抽象類)類型,pageContext 對象直譯時可以稱作“頁面上下文”對象,代表的是當前頁面運行的一些屬性。此對象提供自身和其他3個作用域層次的屬性查詢和修改能力,同時可以獲取其他8個內置對象。它也提供了轉發請求到其它資源和包含其他資源的方法:該對象的方法都是抽象方法。作用域為page(頁面執行期)。
②常用的方法有 :findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope,一般情況下pageContext對象用到得也不是很多,只有在項目所面臨的情況比較復雜的情況下,才會利用到頁面屬性來輔助處理。
2)request
①javax.servlet.ServletRequest的子類型,equest 對象代表的是來自客戶端的請求,例如我們在FORM表單中填寫的信息等,封裝了由WEB瀏覽器或其它客戶端生 成地HTTP請求的細節(參數,屬性,頭標和數據等),是最常用的對象。作用域為request(用戶請求期)。
②常用的方法有:getParameter、getParameterNames 和getParameterValues等,通過調用這幾個方法來獲取請求對象中所包含的參數的值,方法可查看API。
3)response
①javax.servlet.ServletResponse的子類型,response 對象代表的是對客戶端的響應,此對象封裝了返回到HTTP客戶端的輸出,向頁面作者提供設置響應頭標和狀 態碼的方式。經常用來設置HTTP標題,添加cookie,設置響應內容的類型和狀態,發送HTTP重定向和編碼URL等。作用域為page(頁面執行期)。
②也就是說可以通過response 對象來組織發送到客戶端的數據。但是由於組織方式比較底層,所以不建議普通讀者使用,需要向客戶端發送文字時直接使用。
③常用方法有:sendRedirect、setContentType、encodeRedirectURL、addHeader、addCookie、getWriter等
4)session
①avax.servlet.http.HttpSession類型,主要用於跟蹤對話。HttpSession是一個類似哈希表的與單一WEB瀏覽器會話相關的對象,它存在於HTTP請求之間,可以存 儲任何類型的命名對象。作用域session(會話期)。若不需要在請求之間跟蹤會話對象,可以通過在page指令中指定session="false"。
②session對象代表服務器與客戶端所建立的會話,當需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物、客戶軌跡跟蹤等。“session” 對象建立在 cookie的基礎上,所以使用時應注意判斷一下客戶端是否打開了cookie。注意:不要把cookie也理解為九大內置對象之一,cookie主要是實現了session的作用。
概要:
HTTP是無狀態(stateless)協議;
Web Server 對每一個客戶端請求都沒有歷史記憶;
Session用來保存客戶端狀態信息;
由Web Server 寫入;
存於客戶端;
客戶端的每次訪問都把上次的session記錄傳遞給Web Server;
Web Server讀取客戶端提交的session來獲取客戶端的狀態信息。
③常用方法有:getAttribute、setAttribute、removeAttribute、setMaxInactiveInterval、getId、 getValue、 getValueNames和putValue等。
5)application
①javax.servlet.ServletContext類型,作用域是application(整個程序運行期)。它提供了關於服務器版本,應用級初始化參數和應用內資源絕對路徑,注冊信息的方 式,負責提供應用程序在服務器中運行時的一些全局信息。
②常用的方法有:getMimeType、getRealPath、getResourceAsStream
等。
③獲取ServletContext對象的途徑:
方法一:通過GenericServlet提供的 getServletContext()
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext3 = getServletContext();
}
方法二:通過ServletConfig提供的getServletContext()
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext2 = getServletConfig().getServletContext();
}
方法三:通過HttpServletRequest獲取
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext1 = req.getServletContext();
}
方法四:通過HttpSession獲取。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getSession().getServletContext();
}
servlet的環境通過調用getServletConfig().getContext()方法獲得。
6)out
①javax.servlet.jsp.JspWriter類型,代表輸出流的對象。作用域為page(頁面執行期)。
②out 對象代表了向客戶端發送數據的對象,與“response” 對象不同,通過“out” 對象發送的內容將是瀏覽器需要顯示的內容,是文本一級的,可以通過“out” 對象直 接向客戶端寫一個由程序動態生成HTML文件。常用的方法除了pirnt和println之外,還包括clear、clearBuffer、flush、getBufferSize和getRemaining,這是因 為“out”對象內部包含了一個緩沖區,所以需要一些對緩沖區進行操作的方法。
7)config
①javax.servlet.ServletConfig類型,“config” 對象提供一些配置信息,作用域為page(頁面執行期)。
②常用的方法有:getInitParameter和getInitParameterNames,以獲得Servlet初始化時的參數。
8)exception
①java.lang.Throwable類型,通過JSP錯誤頁面中一個catch塊已經益出但沒有捕獲的java.lang.Throwable的任意實例,傳向了errorPage的URI。作用域為page(頁面執行期)。
②“exception” 代表了JSP文件運行時所產生的例外對象,此對象不能在一般JSP文件中直接使用,而只能在使用了page指令“<%@ page isErrorPage="true "%>”的JSP文件中使用。
9)page
①java.lang.Object類型,指向頁面自身的方式。作用域為page(頁面執行期)。
②“page” 對象代表了正在運行的由JSP文件產生的類對象,不建議一般讀者使用。
四大作用域
四個域對象:pageContext -- page域
request -- request域
session -- session域
application -- context域
1)域對象作用:保存數據和獲取數據,用於數據共享。
2)域對象方法:setAttribute("name",Object) 保存數據
getAttribute("name") 獲取數據
removeAttribute("name") 清除數據
3)域對象作用范圍:
page域: 只能在當前jsp頁面中使用(當前頁面)
request域: 只能在同一個請求中使用(轉發)
session域: 只能在同一個會話(session對象)中使用(私有的)
context域: 只能在同一個web應用中使用。(全局的)
1、如果把變量放到pageContext里,就說明它的作用域是page,它的有效范圍只在當前jsp頁面里。 從把變量放到pageContext開始,到jsp頁面結束,你都可以使用這個變量。
2、如果把變量放到request里,就說明它的作用域是request,它的有效范圍是當前請求周期。所謂請求周期,就是指從http請求發起,到服務器處理結束,返回響應的整個過程。就算在這個過程中,使用request對象的getRequestDispatcher("path").forward(request, response)的請求轉發方式跳轉了多個jsp頁面,在這些頁面里你都可以使用這個變量,但如果使用了response對象的sendRedirect("path")重定向方式,那這個request域就會失去效果。因為response的sendRedirect("path")重定向方式,跟request對象的getRequestDispatcher("path").forward(request, response)的請求轉發方式是有區別的,因為重定向涉及到瀏覽器的兩次請求和兩次響應,故第二次的request會將第一次的request域刷新。
3、如果把變量放到session里,就說明它的作用域是session,有效范圍是當前會話。所謂當前會話,是指從用戶打開瀏覽器開始,到用戶關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要用戶不關瀏覽器,服務器就有辦法知道這些請求是一個人發起的,整個過程被稱為一個會話(session),而放到會話中的變量。
session是在服務器端建立的,瀏覽器訪問服務器會有一個jsessionid,瀏覽器端通過 jsessionid定位服務器端的session,session的創建和銷毀由服務器端控制。當瀏覽器關閉后,session還存在在服務器端,只不過你新開的瀏覽器去訪問服務器會創建另一個session,這個時候的jsessionid已經不一樣了。也就不能訪問上一次的哪個session里面的內容了。
那服務器端session如何創建的呢? 普通htm不會創建,jsp默認是創建的,只要你訪問一個任何一個jsp就會創建(不過只創建一次),你關閉瀏覽器從新訪問又會創建一個,這些創建的 session由服務器自己控制銷毀(tomcat默認為30分鍾,web.xml中配置),你也可以在服務器端代碼中手動調用session.invalidate()銷毀它。
注意:如果JSP沒有顯示的使用 <%@page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true),這也是JSP中隱含的session對象的來歷。
4、如果把變量放到application里,就說明它的作用域是application,它的有效范圍是整個應用。整個應用是指從應用啟動,到應用結束。我們沒有說“從服務器啟動,到服務器關閉”是因為一個服務器可能部署多個應用,當然你關閉了服務器,就會把上面所有的應用都關閉了。application作用域里的變量,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。與上述三個不同的是,application里的變量可以被所有用戶共用。如果用戶甲的操作修改了application中的變量,用戶乙訪問時得到的是修改后的值。
EL表達式獲取指定域中變量值: 例如${pageScope.name.value}
域范圍: pageScoep / requestScope / sessionScope / applicationScope