(1)直接在web contain中進行對象的實例化。html
內置對象java |
類型web |
做用域數據庫 |
pageContext瀏覽器 |
javax.servlet.jsp.pageContexttomcat |
page安全 |
request服務器 |
javax.servlet.http.HttpServletRequestcookie |
requestsession |
response |
javax.servlet.http.HttpServletResponse |
page |
session |
javax.servlet.http.HttpSession |
session |
application |
javax.servlet.ServletContext |
application |
config |
javax.servlet.ServletConfig |
page |
out |
Java.servlet.jsp.JspWriter |
page |
page |
java.lang.Object |
page |
exception |
java.lang.Throwable |
page |
(2)jsp內置對象分類
與servlet有關的隱含對象:page,config
與input/output有關的隱含對象:out,request,response
與jsp執行時有關的context的隱含對象:session,application,pageContext
與error有關的隱含對象:exception
(3)屬性的設置和取得
設置屬性:public void setAttribute(String name,Object.value)
取得屬性:public void getAttribute(String name)
(4)四種屬性保存範圍
在一個頁面範圍內:page
在一次服務器請求範圍內:request
在一次會話範圍內:session
在一個應用服務器範圍內:application
(5)page範圍
Page範圍經過PageContext對象來設置,將屬性保存在一次請求範圍以內,必須使用服務器端跳轉<jsp:forward/>
(6)session範圍
只保留一個用戶的信息
(7)application範圍
全部的用戶均可以取得此信息,此信息在整個服務器上被保留。Application屬性範圍值,只要設置一次,則全部的網頁窗口均可以取得數據。
Application,session,request都須要跨多個頁,屬性保存時內存開銷大。若是能使用request就不適用session,能使用session的就不要使用application。
(8)pageContext默認狀況下表示一個頁面的保存範圍
public void setAttribute(String name,Object value,int scope) public static final int APPLICATION_SCOPE:application範圍 public static final int SESSION_SCOPE:session範圍 public static final int REQUEST_SCOPE:request範圍 public static final int PAGE_SCOPE:page範圍
四種屬性範圍都是依靠pageContext展開的,可是在開發中,每每使用session,request範圍
session對象
(1)session功能
Session對象主要用於保存用戶的各類信息,直到它的生命週期超過或被人爲釋放掉爲止,能夠經過session對象來判斷此用戶是不是合法用戶。
Session對象是javax.Servlet.http.HttpSession接口的實例化對象,session屬於http協議範疇以內的對象,因此只有惟一http包下有此接口,沒有任何繼承關係,用戶只要一鏈接到服務器,則馬上分配一個session給用戶。
(2)主要方法
session.getID():服務器上經過session來分別不一樣的用戶,sessionID:任何連接到服務器上的用戶,服務器都會爲之分配惟一的一個不會重複的sessionID。由服務器統一管理,人爲不能控制。
session.getId().length():id的長度爲32位
session.isNew():判斷是不是新的用戶
session.invalidate():使session失效
session.getCreationTime():獲得session的建立時間,返回long類型,經過Date獲得時間
session.getLastAccessedTime():獲得最後一次操做時間,返回long類型
實例:
<%@page contentType="text/html;charset=gb2312"%> <%@page import="java.util.*"%> <% long l = session.getCreationTime() ; long l2 = session.getLastAccessedTime() ; %> <h1>session CREATE : <%=new Date(l)%></h1> <h1>session last access: <%=new Date(l2)%></h1> <h1><%=(l2-l)/1000%></h1>
假如須要求出用戶在線時間,使用如下公式:最後操做時間—建立的時間
(3)session屬性的設置
session.setAttribute(String name,Object value)
session.getAttribute(String name)
session.removeAttribute(String name)
(4)兩種寫法的區別
if(name.equals("mldn")&&pass.equals("password")):假如其中的name和pass沒有被初始化,那麼在執行此句子的時候會出現nullpointexception。
if("mldn".equals(name)&&"password".equals(pass)):若是使用該寫法則不會出現錯誤。
(5)session用法:驗證用戶是否登錄。
(6)session與cookie
Session和cookie用於跨網頁共享數據。Session記錄獨有的我的信息,在不一樣頁面中傳遞,使用setAttribute,getAttribute方法;Cookie保存於客戶端,供瀏覽器與web服務器互通數據用的純文字文件,當ie執行的時候會在計算機中產生一個cookie。Session比cookie更安全,session比cookie更佔用資源,session使用了cookie的機制,若是cookie被禁用,則session也沒法使用。
application與config對象
(1)application簡介
Application對象主要的做用就是保存公共信息,屬於javax。Servlet。ServletContext,此工做目錄的路徑不是固定的,有可能此工做目錄在c盤上或是在d盤獲得的工做目錄的真實路徑。Application是在整個服務器中保持的只有一個實例的對象。
(2)屬性操做: setAttribute(),getAttribute(),removeAttribute()
(3)真實路徑: application.getRealPath(String path),其中String path是"/"。在實際使用中用getServletContext()方法代替application。格式以下:
getServletContext().getRealPath("/")
this.getServletContext.getRealPath("/")
(4)Jsp安全性Config對象
(a) 在j2ee中安全性體如今工做目錄的WEB-INF文件夾,頁面保存在此文件夾下,外面沒法發現此文件夾內的文件,若是要使此文件夾內的文件能被用戶訪問,則修改WEB-INF文件夾下存在的web.xml文件,web.xml文件屬於整個web站點的配置文件。
<……mapping start> <servlet> <servlet-name></servlet-name> <jsp-file></jsp-file> <init-param> <param-name></param-name> <param-value></param-value> </init-param> </servlet> <servlet-mapping> <servlet-name></servlet-name> <url-pattern>/瀏覽器中輸入的地址</url-pattern> </servlet-mapping> <……mapping end>
修改web.xml以後重啓服務器。
(b)config對象
Config對象通常用來取得服務器的初始化配置參數,若要使用此對象應在WEB-INF/web.xml之中配置。Config對象在javax.Servlet.servletConfig中取得初始化參數的方法:
public string getInitParameter(String name)
經過此種功能,能夠將數據庫連接的一些信息寫在配置文件之中,下面兩種方法相似,是取得所有配置參數的:
public Enumeration getInitParameterNames()
request.getParameterNames()
另外附上一篇文章:
1.簡單說 page指當前頁面。在一個jsp頁面裏有效
2.request 指從http請求到服務器處理結束,返回響應的整個過程。在這個過程當中使用forward方式跳轉多個jsp。在這些頁面裏你均可以使用這個變量。
3.Session 有效範圍當前會話,從瀏覽器打開到瀏覽器關閉這個過程。
4.application它的有效範圍是整個應用。
做用域裏的變量,它們的存活時間是最長的,若是不進行手工刪除,它們就一直可使用
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都是徹底隔離的,不管如何修改都不會影響其餘人的數據。
問題:page、request、session、application的做用範圍?
書中解答,此處只摘錄重要語句:
page:用戶請求的當前頁面;
Request:用戶請求訪問的當前組件,以及和當前web組件共享同一用戶請求的web組件。如:被請求的jsp頁面和該頁面用<include>指令包含的頁面以及<forward>標記包含的其它jsp頁面;
Session:同一個http會話中的web組件共享它;
Application:整個web應用的所用web組件共享它。
此處我舉個例子說明
一個網站MyWebSite,其包含7個jsp頁面,分別爲master.jsp、top.jsp、main.jsp、foot.jsp、login.jsp、success.jsp和news.jsp。master.jsp頁面經過<include>指令包含top.jsp、main.jsp、foot.jsp三個頁面,當用戶經過login.jsp登陸成功後,進入success.jsp頁面而後經過此頁面的<forward>標籤跳轉到master.jsp頁面中。
咱們在success.jsp頁面中加入以下代碼(此處用到jstl標籤)
<c:set value="aaa" var="test1" scope=」page」 /> <c:set value="aaa" var="test2" scope=」request」 /> <c:set value="aaa" var="test3" scope=」session」 /> <c:set value="aaa" var="test4" scope=」application」 />
<jsp:forward page=」master.jsp」/ >這裏一一說明
1.變量 test1 只在success.jsp內有效;
2.變量 test2 在success.jsp、master.jsp、top.jsp、main.jsp、foot.jsp中有效;
3.變量 test3 在7個頁面中都有效(包括login.jsp和news.jsp);
4.變量 test4 在整個網站,當前也就是7個頁面中都有效(包括login.jsp和news.jsp)。
Test3和test4有效範圍同樣,有什麼區別呢?
其實區別蠻大的,我只說明一點,假如此時又有另外一個用戶訪問master.jsp頁面,那麼test3相對於這個用戶來講就無效,而test4倒是有效的。或者當第一個登陸的用戶關閉瀏覽器後,再從新訪問master.jsp時,test3就無效,而test4卻有效。