JAVA四大域對象總結:
根據(jù)屬性作用范圍由小到大(含有attribute這個對象):
page(jsp有效)------》page域指的是pageContext.
request(一次請求)—》request域request HttpServletContext
session(一次會話)—》session域session HttpSession
application(當前web應用)—》application域指的是application ServletContext;
之所以他們是域對象,原因是他們都內(nèi)置了map集合,都有setAttribute和getAttribute方法。
一、PageContext域
1.生命周期:當對JSP的請求開始,當相應結束時銷毀。
jsp頁面被執(zhí)行,聲明周期開始;
jsp頁面執(zhí)行完畢,聲明周期結束;
2.作用范圍:整個JSP頁面,是四大作用域中最小的一個。
3.作用:
(1)獲取其它八大隱式對象,可以認為是一個入口對象。
(2)獲取其所有域中的數(shù)據(jù)
pageContext 操作所有域中屬性的方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope)
pageContext 中代表域的常量 PageContext.APPLICATION_SCOPE PageContext.SESSION_SCOPE PageContext.REQUEST_SCOPE PageContext.PAGE_SCOPE
findAttribute方法,在四大域中搜尋屬性,搜尋的順序是page域、request域、session域、application域,從小域到大域開始搜索,如果搜索到就直接獲取該值,如果所有域中都找不到,返回一個null(與el表達式不同,此處返回null,對網(wǎng)頁是不友好的)
(3)跳轉到其他資源 其身上提供了forward和include方法,簡化重定向和轉發(fā)的操作
二、Request域
1.生命周期:
在Service方法調用前由服務器創(chuàng)建,傳入service方法。整個請求結束,request生命結束。
用戶發(fā)送一個請求,開始,服務器返回響應,請求結束,生命周期結束;
2.作用范圍:整個請求鏈(請求轉發(fā)也存在)
3.作用:在整個請求鏈中共享數(shù)據(jù),經(jīng)常用到:在servlet中處理好的數(shù)據(jù)交給JSP顯示,此時參數(shù)就可以放在Request域中。
request中參數(shù)(parameter)和屬性(Attribute)的區(qū)別(1) HttpServletRequest類既有getAttribute()方法,也由getParameter()方法HttpServletRequest類有setAttribute()方法,而沒有setParameter()方法
(2)當兩個Web組件之間為鏈接關系時,被鏈接的組件通過getParameter()方法來獲得請求參數(shù),例如假定welcome.jsp和authenticate.jsp之間為鏈接關系,welcome.jsp中有以下代碼: <a href="authenticate.jsp?username=weiqin">authenticate.jsp </a> 或者: <form name="form1" method="post" action="authenticate.jsp"> 請輸入用戶姓名:<input type="text" name="username"> <input type="submit" name="Submit" value="提交"> </form> 在authenticate.jsp中通過request.getParameter("username")方法來獲得請求參數(shù)username: <% String username=request.getParameter("username"); %> (3)當兩個Web組件之間為轉發(fā)關系時,轉發(fā)目標組件通過getAttribute()方法來和轉發(fā)源組件共享request范圍內(nèi)的數(shù)據(jù)。假定authenticate.jsp和hello.jsp之間為轉發(fā)關系。authenticate.jsp希望向hello.jsp傳遞當前的用戶名字,如何傳遞這一數(shù)據(jù)呢?1 首先,此時parametere無法再不同的組件間傳遞數(shù)據(jù)。所以,在這種情況下,要先把parameter的值傳遞給當前request的attribute,如下所示先在authenticate.jsp中調用setAttribute()方法: <% String username=request.getParameter("username"); request.setAttribute("username",username); %> <jsp:forward page="hello.jsp" /> 最后,在hello.jsp中通過getAttribute()方法獲得用戶名字: <% String username=(String)request.getAttribute("username"); %> Hello: <%=username %> (4)從更深的層次考慮,request.getParameter()方法傳遞的數(shù)據(jù),會從Web客戶端傳到Web服務器端,代表HTTP請求數(shù)據(jù)。request.getParameter()方法返回String類型的數(shù)據(jù)。 request.setAttribute()和getAttribute()方法傳遞的數(shù)據(jù)只會存在于Web容器內(nèi)部,在具有轉發(fā)關系的Web組件之間共享。這兩個方法能夠設置Object類型的共享數(shù)據(jù)。 ——getParameter得到的都是String類型的。或者是http://a.jsp?id=123中的123,或者是某個表單提交過去的數(shù)據(jù)。 ——getAttribute則可以是對象。 ——getParameter()是獲取POST/GET傳遞的參數(shù)值; ——getAttribute()是獲取對象容器中的數(shù)據(jù)值;
parameter的傳遞過程
attribute的傳遞過程
請求的轉發(fā)和重定向:
轉發(fā)時如上所說:request屬性中的信息不回丟失
重定向由于是多次request所以,其屬性中的信息會丟失,如果想要傳遞相關信息,可用session和serveleContext這兩個域對象,例如授權經(jīng)常使用的是session對象
一、調用方式 我們知道,在servlet中調用轉發(fā)、重定向的語句如下:
request.getRequestDispatcher("new.jsp").forward(request, response);//轉發(fā)到new.jsp
response.sendRedirect("new.jsp");//重定向到new.jsp在jsp頁面中你也會看到通過下面的方式實現(xiàn)轉發(fā):
<jsp:forward page="apage.jsp" />當然也可以在jsp頁面中實現(xiàn)重定向:
<%response.sendRedirect("new.jsp");//重定向到new.jsp%>二、本質區(qū)別
解釋一 一句話,轉發(fā)是服務器行為,重定向是客戶端行為。為什么這樣說呢,這就要看兩個動作的工作流程:轉發(fā)過程:客戶瀏覽器發(fā)送http請求----》web服務器接受此請求--》調用內(nèi)部的一個方法在容器內(nèi)部完成請求處理和轉發(fā)動作----》將目標資源發(fā)送給客戶;在這里,轉發(fā)的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內(nèi)的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發(fā)的。轉發(fā)行為是瀏覽器只做了一次訪問請求。重定向過程:客戶瀏覽器發(fā)送http請求----》web服務器接受后發(fā)送302狀態(tài)碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發(fā)現(xiàn)是302響應,則自動再發(fā)送一個新的http請求,請求url是新的location地址----》服務器根據(jù)此請求尋找資源并發(fā)送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發(fā)出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。解釋二
重定向,其實是兩次request,
第一次,客戶端request A,服務器響應,并response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸?shù)男畔粊G失。例子:請求轉發(fā)是服務器內(nèi)部把對一個request/response的處理權,移交給另外一個
對于客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。 傳輸?shù)男畔⒉粫G失。例子: 解釋三
假設你去辦理某個執(zhí)照, 重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然后,你就從A退了出來,自己乘車去了B局。 轉發(fā):你先去了A局,A局看了以后,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到后面辦公室聯(lián)系了B的人,讓他們辦好后,送了過來。
三、HttpSession 域
1.生命周期:
在第一次調用request.getSession()方法時,服務器會檢查是否已經(jīng)有對應的session,如果沒有就在內(nèi)存中創(chuàng)建一個session并返回。
(1)當一段時間內(nèi)session沒有被使用(默認為30分鐘),則服務器會銷毀該session。
(2)如果服務器非正常關閉,沒有到期的session也會跟著銷毀。
(3)如果調用session提供的invalidate(),可以立即銷毀session。
用戶打開瀏覽器訪問,創(chuàng)建session(開始),session超時或者被聲明失效,該對象生命周期結束;
2.作用范圍:一次會話。
HttpSession 在服務器中,為瀏覽器創(chuàng)建獨一無二的內(nèi)存空間,在其中保存會話相關的信息
注意:服務器正常關閉,再啟動,Session對象會進行鈍化和活化操作。同時如果服務器鈍化的時間在session 默認銷毀時間之內(nèi), 則活化后session還是存在的。否則Session不存在。 如果JavaBean 數(shù)據(jù)在session鈍化時,沒有實現(xiàn)Serializable 則當Session活化時,會消失。
四、ServletContext
1.生命周期:
當WEB應用被加載進容器創(chuàng)建代表整個WEB應用的ServletContext對象;
當服務器關閉或WEB應用被移除時,ServletContext對象跟著被銷毀。
2.作用范圍:整個WEB應用。
3、作用:
a)在不同Servlet 之間轉發(fā)
this.getServletContext().getRequestDispatcher("/servlet/Demo10Servlet").forward(request,response);
方法執(zhí)行結束,service就會返回到服務器,再有服務器去調用目標servlet,其中request會重新創(chuàng)建,并將之前的request的數(shù)據(jù)拷貝進去。
b)讀取資源文件。
1、由于相對路徑默認相對的是java虛擬機啟動的目錄,所以我們直接寫相對路徑將會是相對于tomcat/bin目錄,所以是拿不到資源的。如果寫成絕對路徑,當項目發(fā)布到其他環(huán)境時,絕對路徑就錯了。
為了解決這個問題ServletContext提供了:
this.getServletContext().getRealPath("/1.properties"),給進一個資源的虛擬路徑,將會返回該資源在當前環(huán)境下的真實路徑?! ?br /> this.getServletContext().getResourceAsStream("/1.properties"),給一個資源的虛擬路徑返回到該資源真實路徑的流。
2、當在非servlet下獲取資源文件時,就沒有ServletContext對象用了,此時只能用類加載器
classLoader.getResourceAsStream("…/…/1.properties"),此方法利用類加載器直接將資源加載到內(nèi)存中,有更新延遲的問題,以及如果文件太大,占用內(nèi)存過大。
classLoader.getResource("…/1.properties").getPath(),直接返回資源的真實路徑,沒有更新延遲的問題。
總結
以上是生活随笔為你收集整理的查漏补缺2--java中的四大域对象,八大隐含对象已经attribute和parameter的区别整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。