日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSP四大作用域详解

發(fā)布時間:2023/12/31 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSP四大作用域详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先要聲明一點,所謂“作用域”就是“信息共享的范圍”,也就是說一個信息能夠在多大的范圍內有效。4個JSP內置對象的作用域分別為:application、session、request、page 。JSP內置對象作用域表如下:

名稱

作用域

application

在所有應用程序中有效

session

在當前會話中有效

request

在當前請求中有效

page

在當前頁面有效

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

application 作用域

?????如果把變量放到application里,就說明它的作用域是application,它的有效范圍是整個應用。?整個應用是指從應用啟動,到應用結束。我們沒有說“從服務器啟動,到服務器關閉”,是因為一個服務器可能部署多個應用,當然你關閉了服務器,就會把上面所有的應用都關閉了。 application作用域里的變量,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。

application作用域上的信息傳遞是通過ServletContext實現的,它提供的主要方法如下所示:

Object getAttribute(String name) ?//從application中獲取信息;

void setAttribute(String name, Object value) ?//向application作用域中設置信息。

?

session作用域

?? ?? ?session作用域比較容易理解,同一瀏覽器對服務器進行多次訪問,在這多次訪問之間傳遞信息,就是session作用域的體現。如果把變量放到session里,就說明它的作用域是session,它的有效范圍是當前會話。所謂當前會話,就是指從用戶打開瀏覽器開始,到用戶關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要用戶不關瀏覽器,服務器就有辦法知道這些請求是一個人發(fā)起的,整個過程被稱為一個會話(session),而放到會話中的變量,就可以在當前會話的所有請求里使用。?
?session是通過HttpSession接口實現的,它提供的主要方法如下所示:

Object HttpSession.getAttribute(String name) ??//從session中獲取信息。

void HttpSession.setAttribute(String name, Object value)//向session中保存信息。

HttpSession HttpServletRequest.getSessio() ?//獲取當前請求所在的session的對象。

?session的開始時刻比較容易判斷,它從瀏覽器發(fā)出第一個HTTP請求即可認為會話開始。但結束時刻就不好判斷了,因為瀏覽器關閉時并不會通知服務器,所以只能通過如下這種方法判斷:如果一定的時間內客戶端沒有反應,則認為會話結束。

Tomcat的默認值為120分鐘,但這個值也可以通過HttpSession的setMaxInactiveInterval()方法來設置:

void setMaxInactiveInterval(int interval)

如果想主動讓會話結束,例如用戶單擊“注銷”按鈕的時候,可以使用 HttpSession 的 invalidate()方法,用于強制結束當前session:void invalidate()

?

?

request作用域

?? ? 一個HTTP請求的處理可能需要多個Servlet合作,而這幾個Servlet之間可以通過某種方式傳遞信息,但這個信息在請求結束后就無效了。request里的變量可以跨越forward前后的兩頁。但是只要刷新頁面,它們就重新計算了。如果把變量放到request里,就說明它的作用域是request,它的有效范圍是當前請求周期。?所謂請求周期,就是指從http請求發(fā)起,到服務器處理結束,返回響應的整個過程。在這個過程中可能使用forward的方式跳轉了多個jsp頁面,在這些頁面里你都可以使用這個變量。

Servlet之間的信息共享是通過HttpServletRequest接口的兩個方法來實現的:

void setAttribute(String name, Object value) ??//將對象value以name為名稱保存到request作用域中。

Object getAttribute(String name) //從request作用域中取得指定名字的信息。

?? ? JSP中的doGet()、doPost()方法的第一個參數就是HttpServletRequest對象,使用這個對象的 setAttribute()方法即可傳遞信息。那么在設置好信息之后,要通過何種方式將信息傳給其他的Servlet呢?這就要用到RequestDispatcher接口的forward()方法,通過它將請求轉發(fā)給其他Servlet。

? ? ? RequestDispatcher ServletContext.getRequestDispatcher(String path)? ? ? ? ? ? ? ? ? ? ? ? ?//取得Dispatcher以便轉發(fā),path為轉發(fā)的目的Servlet。

? ? ? void RequestDispatcher.forward(ServletRequest request, ServletResponse response)//將request和response轉發(fā)

?? ? 因此,只需要在當前Servlet中先通過setAttribute()方法設置相應的屬性,然后使用forward()方法進行跳轉,最后在跳轉到的Servlet中通過使用getAttribute()方法即可實現信息傳遞。

??需要注意兩點:

1、轉發(fā)不是重定向,轉發(fā)是在Web應用內部進行的。

2、轉發(fā)對瀏覽器是透明的,也就是說,無論在服務器上如何轉發(fā),瀏覽器地址欄中顯示的仍然是最初那個Servlet的地址。

?

page作用域

page對象的作用范圍僅限于用戶請求的當前頁面,對于page對象的引用將在響應返回給客戶端之后被釋放,或者在請求被轉發(fā)到其他地方后被釋放。page里的變量只要頁面跳轉了,它們就不見了。如果把變量放到pageContext里,就說明它的作用域是page,它的有效范圍只在當前jsp頁面里。從把變量放到pageContext開始,到jsp頁面結束,你都可以使用這個變量。

以上介紹的作用范圍越來越小,request和page的生命周期都是短暫的,它們之間的區(qū)別:一個request可以包含多個page頁(include,forward及filter)。

?

為了讓大家更容易理解application、session、request、page 4個對象的作用范圍,我們給出兩個程序來進行詳細說明。

【程序1】page01.jsp

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

【程序2】page02.jsp

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

測試步驟以及結果分析:

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

?

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

2.不要關閉程序1運行的瀏覽器,直接運行程序2,其結果為:(圖2)

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

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

?

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

總結

以上是生活随笔為你收集整理的JSP四大作用域详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。