比較page、request、session、application的使用範圍

(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卻有效。

相關文章
相關標籤/搜索