1. 程式人生 > >JSP中的9大內置對象四大域與servlet裏的三大域

JSP中的9大內置對象四大域與servlet裏的三大域

cep 強制轉換 進行 ont jsp頁面 顯示 tar get ext.get

九大內置對象

隱式對象

說明

out

轉譯後對應JspWriter對象,其內部關聯一個PringWriter對象

request

轉譯後對應HttpServletRequest/ServletRequest對象

response

轉譯後對應HttpServletRespons/ServletResponse對象

config

轉譯後對應ServletConfig對象

application

轉譯後對應ServletContext對象

session

轉譯後對應HttpSession對象

pageContext

轉譯後對應PageContext對象,它提供了JSP頁面資源的封裝,並可設置頁面範圍屬性

exception

轉譯後對應Throwable對象,代表由其他JSP頁面拋出的異常對象,只會出現於JSP錯誤頁面(isErrorPage設置為true的JSP頁面)

page

轉譯後對應this

JSP九種內置對象:

一 request對象:

該對象封裝了用戶提交的信息,通過調用該對象相應的方法可以獲取封裝的信息, 即使用該對象可以獲取用戶提交信息。

二 response對象:

對客戶的請求做出動態的響應,向客戶端發送數據。

三 session對象

1.什麽是session:session對象是一個JSP內置對象,它在第一個JSP頁面被裝載時自動創建,完成會話期管理。
從一個客戶打開瀏覽器並連接到服務器開始,到客戶關閉瀏覽器離開這個服務器結束,被稱為一個會話。當一個客戶訪問一個服務器時,可能會在這個服務器的幾個頁面之間反復連接,反復刷新一個頁面,服務器應當通過某種辦法知道這是同一個客戶,這就需要session對象。
2.session對象的ID:當一個客戶首次訪問服務器上的一個JSP頁面時,JSP引擎產生一個session對象,同時分配一個String類型的ID號,JSP引擎同時將這個ID號發送到客戶端,存放在Cookie中,這樣session對象和客戶之間就建立了一一對應的關系。當客戶再訪問連接該服務器的其他頁面時,不再分配給客戶新的session對象,直到客戶關閉瀏覽器後,服務器端該客戶的session對象才取消,並且和客戶的會話對應關系消失。當客戶重新打開瀏覽器再連接到該服務器時,服務器為該客戶再創建一個新的session對象。

四 aplication對象

1.什麽是application:
服務器啟動後就產生了這個application對象,當客戶在所訪問的網站的各個頁面之間瀏覽時,這個application對象都是同一個,直到服務器關閉。但是與session不同的是,所有客戶的application對象都是同一個,即所有客戶共享這個內置的application對象。
2.application對象常用方法:
(1)public void setAttribute(String key,Object obj): 將參數Object指定的對象obj添加到application對象中,並為添加的對象指定一個索引關鍵字。
(2)public Object getAttribute(String key): 獲取application對象中含有關鍵字的對象。

五 out對象

out對象是一個輸出流,用來向客戶端輸出數據。out對象用於各種數據的輸出。

六 page java.lang.Object

對應this關鍵字。JSP網頁本身
page對象是當前頁面轉換後的Servlet類的實例。從轉換後的Servlet類的代碼中,可以看到這種關系:
Object page = this;
在JSP頁面中,很少使用page對象。

七 config

javax.servlet. ServletConfig 的實例,該實例代表該JSP 的配置信息。常用的方法有getInitPararneter(String paramNarne) 及getInitPararneternarnes() 等方法。事實上, JSP 頁面通常無須配置,也就不存在配置信息。因此,該對象更多地在Servlet 中有效。

八 exception java.lang.Throwable 的實例

該實例代表其他頁面中的異常和錯誤。只有當頁面是錯誤處理頁面,即編譯指令page 的isErrorPage 屬性為true 時,該對象才可以使用。常用的方法有getMessageO和printStackTraceO等。

九 pageContext

javax.servlet.jsp.PageContext 的實例,對象直譯時可以稱作“頁面上下文”對象,代表的是當前頁面運行的一些屬性,通過此對象可以拿到其他8大對象,使用該對象可以訪問頁面中的共享數據。常用的方法有getServletContextO和getServletConfigO等。

//使用pageContext 設置屬性,該屬性默認在page 範圍內
pageContext. setAttribute ("page" , "hello") ;

//使用request 設置屬性,該屬性默認在request 範圍內
request. setAttribute ("request" , "hello");

//使用pageContext將屬性設置在request 範圍中
pageContext.setAttribute("request2" , "hello" , pageContext.REQUEST_SCOPE);

// 使用session將屬性設置在session 範圍中
session.setAttribute("session" , "hello"l;

//使用pageContext將屬性設置在session範圍中
pageContext.setAttribute("session2" , "hello" , pageContext.SESSION_SCOPE);

//使用application將屬性設置在application範圍中
application. setAttribute ("app" , "hello") ;

//使用pageContext 將屬性設置在application 範圍中
pageContext.setAttribute("app2" , "hello" , pageContext.APPL 工CATION_SCOPE) ;

四個作用域:request域 session域 application域 page域

何為作用域

  先讓我們看看效果:

  大概流程是這樣的,我們訪問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就可以操作其他三個作用域中的變量。

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

JSP中的9大內置對象四大域與servlet裏的三大域