一、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範圍中設定資訊。
【程式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;