JSP內建對象之四個範圍

來源:互聯網
上載者:User
一、JSP內建對象概述

定義:可以不加聲明就在JSP頁面指令碼(Java程式片和Java運算式)中使用的成員變數。在JSP技術內部,已經定義好了若干個JSP內部對象,應用這些內部對象,可以實現很多很重要的功能。

JSP共有以下9種基本內建群組件(可與ASP的6種內部組件相對應):

 

內建對象 代表內容 範圍
request 觸發服務調用的請求 request
response 對請求的應答 page
session 為請求的客戶建立的session對象 session
application 從 servlet 設定物件獲得的 servlet 上下文(如在getServletConfig() ,getContext()的調用中) application
out 向輸出資料流寫入內容的對象 page
pageContext 本 JSP 的頁面上下文 page
page 實現處理本頁當前請求的類的執行個體 page
config 本 JSP 的 ServletConfig page
exception 表示JSP頁面運行時產生的異常 Page

二、四個範圍

    從表格中的第三列都指明了每個對象的範圍,即範圍。首先要聲明一點,所謂“範圍”就是“資訊共用的範圍”,也就是說一個資訊能夠在多大的範圍內有效。4個JSP內建對象的範圍分別為:application、session、request、page 。JSP內建對象範圍表如下:

名稱

範圍

application

在所有應用程式中有效

session

在當前會話中有效

request

在當前請求中有效

page

在當前頁面有效

Web互動的最基本單位為HTTP請求。每個使用者從進入網站到離開網站這段過程稱為一個HTTP會話,一個伺服器的運行過程中會有多個使用者訪問,就是多個HTTP會話。範圍解釋如下。

  • application 範圍

         application範圍就是伺服器啟動到關閉的整段時間,在這個範圍內設定的資訊可以被所有應用程式使用。application範圍上的資訊傳遞是通過ServletContext實現的,它提供的主要方法如下所示:Object getAttribute(String name)  //從application中擷取資訊;void setAttribute(String name, Object value)  //向application範圍中設定資訊。
  • session範圍     session範圍比較容易理解,同一瀏覽器對伺服器進行多次訪問,在這多次訪問之間傳遞資訊,就是session範圍的體現。session是通過HttpSession介面實現的,它提供的主要方法如下所示。Object HttpSession.getAttribute(String name)//從session中擷取資訊。void HttpSession.setAttribute(String name, Object value)//向session中儲存資訊。HttpSession HttpServletRequest.getSessio()//擷取當前請求所在的session的對象。     session的開始時刻比較容易判斷,它從瀏覽器發出第一個HTTP請求即可認為會話開始。但結束時刻就不好判斷了,因為瀏覽器關閉時並不會通知伺服器,所以只能通過如下這種方法判斷:如果一定的時間內用戶端沒有反應,則認為會話結束。Tomcat的預設值為120分鐘,但這個值也可以通過HttpSession的setMaxInactiveInterval()方法來設定:void setMaxInactiveInterval(int interval)如果想主動讓會話結束,例如使用者單擊“登出”按鈕的時候,可以使用 HttpSession 的 invalidate()方法,用於強制結束當前session:void invalidate()


  • request範圍     一個HTTP請求的處理可能需要多個Servlet合作,而這幾個Servlet之間可以通過某種方式傳遞資訊,但這個資訊在請求結束後就無效了。Servlet之間的資訊共用是通過HttpServletRequest介面的兩個方法來實現的。void setAttribute(String name, Object value)//將對象value以name為名稱儲存到request範圍中。Object getAttribute(String name)//從request範圍中取得指定名字的資訊。     JSP中的doGet()、doPost()方法的第一個參數就是HttpServletRequest對象,使用這個對象的 setAttribute()方法即可傳遞資訊。那麼在設定好資訊之後,要通過何種方式將資訊傳給其他的Servlet呢?這就要用到RequestDispatcher介面的forward()方法,通過它將請求轉寄給其他Servlet。RequestDispatcher ServletContext.getRequestDispatcher(String path)//取得Dispatcher以便轉寄,path為轉寄的目的Servlet。 void RequestDispatcher.forward(ServletRequest request, ServletResponse response)//將request和response轉寄     因此,只需要在當前Servlet中先通過setAttribute()方法設定相應的屬性,然後使用forward()方法進行跳轉,最後在跳轉到的Servlet中通過使用getAttribute()方法即可實現資訊傳遞。     PHP的程式員可能不太好理解這一段,因為PHP中沒有轉寄的概念,一個請求只能由一個PHP檔案來處理,所以PHP中根本沒有request範圍的概念。而Servlet則不同,請求可以在應用程式中任意轉寄,所以用request範圍在不同Servlet之間傳遞資訊。需要注意兩點:1、轉寄不是重新導向,轉寄是在Web應用內部進行的。PHP支援重新導向但沒有轉寄。2、轉寄對瀏覽器是透明的,也就是說,無論在伺服器上如何轉寄,瀏覽器地址欄中顯示的仍然是最初那個Servlet的地址。


  • page範圍

    page對象的作用範圍僅限於使用者請求的當前頁面,對於page對象的引用將在響應返回給用戶端之後被釋放,或者在請求被轉寄到其他地方後被釋放。對page對象的引用通常儲存在pageContext對象中。以上介紹的作用範圍越來越小,request和page的生命週期都是短暫的,它們之間的區別:一個request可以包含多個page頁(include,forward及filter)。為了讓大家更容易理解application、session、request、page 4個對象的作用範圍,我們給出兩個程式來進行詳細說明。

【程式1】page01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"<br /> pageEncoding="UTF-8"%><br /><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><br /><jsp:useBean id="pagevar" scope="page" class="java.lang.StringBuffer"/><br /><jsp:useBean id="requestvar" scope="request" class="java.lang.StringBuffer"/><br /><jsp:useBean id="sessionvar" scope="session" class="java.lang.StringBuffer"/><br /> <jsp:useBean id="applicationvar" scope="application" class="java.lang.StringBuffer"/><br /><html><br /><head><br /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><br /><title>JSP內建對象範圍</title><br /></head><br /><body><br /> <%<br />pagevar.append("page01");<br />requestvar.append("page01");<br />sessionvar.append("page01");<br />applicationvar.append("page01");<br />%><br /><jsp:forward page="page02.jsp"/><br /></body><br /></html> 


【程式2】page02.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"<br /> pageEncoding="UTF-8"%><br /><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><br /><jsp:useBean id="pagevar" scope="page" class="java.lang.StringBuffer"/><br /><jsp:useBean id="requestvar" scope="request" class="java.lang.StringBuffer"/><br /><jsp:useBean id="sessionvar" scope="session" class="java.lang.StringBuffer"/><br /><jsp:useBean id="applicationvar" scope="application" class="java.lang.StringBuffer"/><br /><html><br /><head><br /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><br /><title>JSP內建對象範圍</title><br /></head><br /><body><br /><%<br />pagevar.append("page02");<br />requestvar.append("page02");<br />sessionvar.append("page02");<br />applicationvar.append("page02");<br />%><br />page = <%=pagevar.toString()%><br/><br />request = <%=requestvar.toString()%><br/><br />session = <%=sessionvar.toString()%><br/><br />application = <%=applicationvar.toString()%><br/><br /></body><br /></html> 

 

測試步驟以及結果分析:

1、直接運行程式1的結果為:(圖1)

我們看到,page的範圍的值為page02,說明確實只在當前的頁面起作用,即跳轉到的page2頁面;request的範圍在當前請求中有效,所以其值為程式1和跳轉到程式2之和;session的範圍為當前會話,所以其值也是程式1和跳轉到程式2之和;而application對所有應用有效,也就是只要在應用,都要疊加,即程式1中的值與程式2中的值的疊加;

 

2、不要關閉程式1啟動並執行瀏覽器,直接運行程式2,其結果為:(圖2)

對比圖1的結果,我們發現page範圍沒有變化,它的值只是程式2裡的值;request範圍僅在當前請求作用,故也以程式2的值為準,變成page02;session的範圍為當前會話,因為運行程式1的瀏覽器保持著,說明還處於同一會話中,所以要在之前的基礎上疊加上一個page02;而application對所有應用有效,也就是只要在應用,都要疊加,即在之前的基礎上疊加上一個程式2的page02;

 

3、將上兩步運行程式1和程式2的瀏覽器關閉,但不關閉伺服器,重新運行程式2,其結果如下:

對比之前的結果,我們發現page範圍依舊沒有變化,它的值只是程式2即所在頁面裡的值;request範圍僅在當前請求作用,故也以程式2的值為準,變成page02;session的範圍為當前會話,因為前兩步運行程式的瀏覽器關閉了,說明之前的會話都結束了,所以其值恢複成當前的程式2裡的值page02;而application對所有應用有效,也就是只要在應用即伺服器還沒重啟清空,都要疊加,即在之前的基礎上再疊加上一個程式2的page02;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.