九大內建對象
內建對象(又叫隱含對象,有9個內建對象):不需要預先聲明就可以在指令碼代碼和運算式中隨意使用
1-out:
javax.servlet.jsp.JspWriter類型,代表輸出資料流的對象。範圍為page(頁面執行期)
request:javax.servlet.ServletRequest的子類型,此對象封裝了由WEB瀏覽器或其它用戶端產生地HTTP
請求的細節(參數,屬性,頭標和資料)。範圍為request(使用者請求期)。
方法由可查看API
response:javax.servlet.ServletResponse的子類型,此對象封裝了返回到HTTP用戶端的輸出,向頁面作者提供設定回應標頭標和狀態代碼的方式。經常用來設定HTTP標題,添加cookie,設定響應內容的類型和狀態,發送HTTP重新導向和編碼URL。範圍為page(頁面執行期)。
pageContext:javax.servlet.jsp.PageContext(抽象類別)類型,範圍為page(頁面執行期)。此對象提供所有四個範圍層次的屬性查詢和修改能力,它也提供了轉寄請求到其它資源和包含其他資源的方法:
該對象的方法都是抽象方法
session:javax.servlet.http.HttpSession類型,主要用於跟蹤對話。範圍session(會話期—)。
HttpSession是一個類似雜湊表的與單一WEB瀏覽器會話相關的對象,它存在於HTTP請求之間,可以儲存任
何類型的命名物件。
如果不需要在請求之間跟蹤會話對象,可以通過在page指令中指定session="false"
需要記住的是pageContext對象也可以與session.getAttribute(),session.setAttribute()一樣的方式取得並設定會話屬性。
application:javax.servlet.ServletContext類型,servlet的環境通過調用getServletConfig
().getContext()方法獲得。範圍是application(整個程式運行期)。它提供了關於伺服器版本,應用級初始化參數和應用內資源絕對路徑,註冊資訊的方式
config:javax.servlet.ServletConfig,範圍為page(頁面執行期)
exception:java.lang.Throwable,通過JSP錯誤頁面中一個catch塊已經益出但沒有捕獲的
java.lang.Throwable的任意執行個體,傳向了errorPage的URI。範圍為page(頁面執行期)。注意
exception只有在page指令中具有屬性isErrorPage="true"時才有效。
page:java.lang.Object類型,指向頁面自身的方式。範圍為page(頁面執行期
JSP中九大內建對象為:
request 請求對象 類型 javax.servlet.ServletRequest 範圍 Request
response 響應對象 類型 javax.servlet.SrvletResponse 範圍 Page
pageContext 頁面內容物件 類型 javax.servlet.jsp.PageContext 範圍 Page
session 會話對象 類型 javax.servlet.http.HttpSession 範圍 Session
application 應用程式物件 類型 javax.servlet.ServletContext 範圍 Application
out 輸出對象 類型 javax.servlet.jsp.JspWriter 範圍 Page
config 設定物件 類型 javax.servlet.ServletConfig 範圍 Page
page 頁面對象 類型 javax.lang.Object 範圍 Page
exception 例外對象 類型 javax.lang.Throwable 範圍 page
request 對象代表的是來自用戶端的請求,例如我們在FORM表單中填寫的資訊等,是最常用的對象常用的方法有:getParameter、getParameterNames 和getParameterValues 通過調用這幾個方法來擷取請求對象中所包含的參數的值。
response 對象代表的是對用戶端的響應,也就是說可以通過response 對象來組織發送到用戶端的資料。但是由於組織方式比較底層,所以不建議普通讀者使用,需要向用戶端發送文字時直接使用
pageContext 對象直譯時可以稱作“頁面上下文”對象,代表的是當前頁面啟動並執行一些屬性
常用的方法有 :findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope
一般情況下pageContext對象用到得也不是很多,只有在項目所面臨的情況比較複雜的情況下,才會利用到頁面屬性來輔助處理。
session 對象代表格服務器與用戶端所建立的會話,當需要在不同的JSP頁面中保留客戶資訊的情況下使用,比如線上購物、客戶軌跡跟蹤等。“session” 對象建立在cookie的基礎上,所以使用時應注意判斷一下用戶端是否開啟了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。
概要
HTTP是無狀態(stateless)協議;
Web Server 對每一個用戶端請求都沒有曆史記憶;
Session用來儲存用戶端狀態資訊;
由Web Server 寫入;
存於用戶端;
用戶端的每次訪問都把上次的session記錄傳遞給Web Server;
Web Server讀取用戶端提交的session來擷取用戶端的狀態資訊
application 對象負責提供應用程式在伺服器中運行時的一些全域資訊,常用的方法有getMimeType和getRealPath等。
out 對象代表了向用戶端發送資料的對象,與“response” 對象不同,通過“out” 對象發送的內容將是瀏覽器需要顯示的內容,是文本一級的,可以通過“out” 對象直接向用戶端寫一個由程式動態產生HTML檔案。常用的方法除了pirnt和println之外,還包括clear、clearBuffer、 flush、getBufferSize和getRemaining,這是因為“out” 對象內部包含了一個緩衝區,所以需要一些對緩衝區進行操作的方法
“config” 對象提供一些配置資訊,常用的方法有getInitParameter和getInitParameterNames,以獲得Servlet初始化時的參數。
“page” 對象代表了正在啟動並執行由JSP檔案產生的類對象,不建議一般讀者使用。
“exception” 對象則代表了JSP檔案運行時所產生的例外對象,此對象不能在一般JSP檔案中直接使用,而只能在使用了“<%@ page isErrorPage="true "%>”的JSP檔案中使用四個範圍:
何為範圍
先讓我們看看效果:
大概流程是這樣的,我們訪問04-01/index.jsp的時候,分別對pageContext, request, session,
application四個範圍中的變數進行累加。(當然先判斷這個變數是不是存在,如果變數不存在,則要把變數初始化成1。)計算完成後就從index.jsp執行forward跳轉到test.jsp。在test.jsp裡再進行一次累加,然後顯示出這四個整數來。
從顯示的結果來看,我們可以直觀的得出結論:
page裡的變數沒法從index.jsp傳遞到test.jsp。只要頁面跳轉了,它們就不見了。
request裡的變數可以跨越forward前後的兩頁。但是只要重新整理頁面,它們就重新計算了。
session和application裡的變數一直在累加,開始還看不出區別,只要關閉瀏覽器,再次重啟瀏覽器訪問這頁,session裡的變數就重新計算了。 來源
application裡的變數一直在累加,除非你重啟tomcat,否則它會一直變大。
而範圍規定的是變數的有效期間限。
如果把變數放到pageContext裡,就說明它的範圍是page,它的有效範圍只在當前jsp頁面裡。
從把變數放到pageContext開始,到jsp頁面結束,你都可以使用這個變數。
如果把變數放到request裡,就說明它的範圍是request,它的有效範圍是當前請求周期。
所謂請求周期,就是指從http請求發起,到伺服器處理結束,返迴響應的整個過程。在這個過程中可能使用forward的方式跳轉了多個jsp頁面,在這些頁面裡你都可以使用這個變數。
如果把變數放到session裡,就說明它的範圍是session,它的有效範圍是當前會話。
所謂當前會話,就是指從使用者開啟瀏覽器開始,到使用者關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要使用者不關瀏覽器,伺服器就有辦法知道這些請求是一個人發起的,整個過程被稱為一個會話(session),而放到會話中的變數,就可以在當前會話的所有請求裡使用。
如果把變數放到application裡,就說明它的範圍是application,它的有效範圍是整個應用。
整個應用是指從應用啟動,到應用結束。我們沒有說“從伺服器啟動,到伺服器關閉”,是因為一個伺服器可能部署多個應用,當然你關閉了伺服器,就會把上面所有的應用都關閉了。
application範圍裡的變數,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。
與上述三個不同的是,application裡的變數可以被所有使用者共用。如果使用者甲的操作修改了application中的變數,使用者乙訪問時得到的是修改後的值。這在其他scope中都是不會發生的,page, request,session都是完全隔離的,無論如何修改都不會影響其他人的資料。
我們使用public Object getAttribute(String name)獲得變數值,使用public void setAttribute(String name, Object value)將變數值儲存到對應範圍中。舉個pageContext的例子就是:
// page
Integer countPage = (Integer) pageContext.getAttribute("countPage");
if (countPage == null) {
pageContext.setAttribute("countPage", 1);
} else {
pageContext.setAttribute("countPage", countPage + 1);
}
這裡先從pageContext中取出名為countPage的整數,因為返回的都是java.lang.Object類型,所以需要強制轉換成我們需要的整形。這裡取得的變數如果不存在就會返回null,通過判斷countPage == null來辨別變數是否存在,如果不存在就設定為1,如果存在就進行累加,最後使用setAttribute()方法將修改後的變數值放入pageContext。
將其中的pageContext換成request, session, application就可以操作其他三個範圍中的變數。
HTTP協議與JSP
我們在瀏覽器中訪問的網頁,都是基於HTTP協議的。回顧我們的第一個JSP程式——Hello World,在瀏覽器輸入localhost:8080/Hello.jsp,我們就可以看到Hello world顯示在瀏覽器中。這背後是什麼起了作用?
使用瀏覽器從網站擷取HTML頁面時,用到的是我們十分耳熟的挺起來非常專業的協議——HTTP協議(超文字傳輸通訊協定 (HTTP)),參加博文HTTP協議概述。
HTTP協議規定了資訊在internet上的傳輸方法,特別是規定了瀏覽器與伺服器的互動方法和傳遞資訊方式。常用的方法有GET、POST等。HTTP協議中一個非常重要的內容是HTTP報文,報文是在HTTP 應用程式之間發送的資料區塊,是傳遞資訊的載體。詳細內容參見:http報文詳解
我們開啟一個網頁的過程,簡單的說包括請求和響應兩個階段。
首先瀏覽器想目標主機發出開啟一個串連;並對相應的資源發出請求報文。伺服器收到請求後向用戶端發出響應報文,向所以HTTP協議的核心是請求和響應。
現在回到JSP的內容上,上篇博文JSP基本文法,本文為大家介紹JSP的內建對象。在JSP頁面中有些對象不用什麼就可以在java程式片和運算式部分使用,這就是JSP的內建對象。
jsp包含9種內建對象:request、response、out、page、session等。其中request、response分別代表請求和響應對象,是較為重要的的兩個。這兩個對象提供了伺服器和瀏覽器通訊方法的控制。如果有HTTP協議的基礎,你一看字面意思就能明白這兩個對象的作用,以及一些常用的方法,快速掌握JSP也是很簡單的。HTTP協議的知識在web編程中非常重要。
1.request:請求對象
該對象封裝了使用者提交的資訊,通過調用該對象想相應的方法可以擷取封裝的資訊。其主要方法如下:
request.getParameterNames(); //Enumeration<String>
request.getParameter(String name);//String
request.getHeader(Sring name); //String
request.getHeadersNames(); //Enumeration<String>
request.getRequestDispatcher("/somePage.jsp").forward(request, response);
//請求轉寄
擷取要求標頭
Enumeration<String> headernames =request.getHeaderNames();
while(headernames.hasMoreElements()){
String headername=headernames.nextElement();
System.out.print(headername+": ");
System.out.println(request.getHeader(headername));
}
擷取post資料,request.getParameter(String s)將失效
StringBuffer sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(
request.getInputStream()));
String s = "";
while ((s = br.readLine()) != null) {
sb.append(s);
}
System.out.println(sb.toString());
解決中文亂碼
//post方式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding( "utf-8" );
//get方式
String string = request.getParamers("");
String = new String(string.getBytes("ISO8859-1","utf-8"));
2.response:響應對象
該對象對客戶的請求作出響應,向用戶端發送資料。
response.sendRedirect("index.jsp"); //重新導向
response.setContenType(String s);
response.addHeader(String name,String value);
response.addCookie(Cookie c);
一個典型的response的HTTP響應報文頭
HTTP/1.0 200OK
Date: Mon,31Dec200104:25:57GMT
Server: Apache/1.3.14(Unix)
Content-type: text/html
Last-modified: Tue,17Apr200106:46:28GMT
Content-length: 39725426
3.session:會話對象
Tomcat伺服器可以使用session記錄有關串連的資訊。這個session對象有一個String類型的ID,當用戶端請求伺服器時,伺服器會將這個ID號發送給用戶端,存放在用戶端的Cookie中。
生命週期:用戶端向伺服器發送第一個請求,伺服器建立一個Session對象,到關閉瀏覽器銷毀(近似這麼理解)。
session.getID(); //String
session.setAttribute(String key,Object obj);
session.getAttribute(String key); //Object
session.isNew();
4.application :應用程式物件
伺服器啟動後就產生了這個application對象,所有使用者共用這個application對象。直到伺服器關閉。
application.setAttribute(String key,Object obj);
application.getAttribute(String key); //Object
5.cookie:用戶端對象
cookie是web網站儲存在使用者硬碟上的一段文本,以“索引值對”的方式記錄。
向用戶端發送cookie
Cookie c=new Cookie("username","guang");
response.addCookie(c);
讀取儲存在用戶端的cookie
Cookie cookies[]=request.getCookies();
for(Cookie c:cookies){
if("username".equals(c.getName())){
out.println(C.getValue());
}
}
設定cookie的有效時間
Cookie c=new Cookie("username","tom");
c.setMaxAge(3600);//3600秒
6.out:輸出對象
out.println();
out.newLine();
out.close();
7.config:設定物件
8.page:頁面對象
9.pageContext:頁面上下文