java四大域总结
最近學(xué)完了web部分,發(fā)現(xiàn)有些地方總是單個容易理解,可是把所有的放在一起來大雜燴,總是有那么幾個知識點容易混淆。其實網(wǎng)上的資料已經(jīng)夠多了,雖然也不乏辛勞的搬運工。可是最終的目的不就是要我們自身理解嗎?自己理解了的東西才正真是我們的。作為額外的獎勵,我們先來關(guān)注一下JSP的九大隱式對象。
可以看看下圖中關(guān)于JSP的九大隱式對象,它們可總是被老師們說是重點重點哦。
?
?
作用域------顧名思義,起作用的大小范圍也!如果是你自己去學(xué)習(xí)一個知識點,你要達(dá)到哪些目標(biāo)才算是對一個知識點稱得上是懂得,理解,掌握呢?從扁神醫(yī)的望聞問切,到數(shù)據(jù)庫的增刪改查,所有的事物開始也不外乎:是什么?有什么用?怎么用?為什么可以這么用?故而,我覺得咱們應(yīng)該把握以下問題,帶著這些問題去學(xué)習(xí),發(fā)現(xiàn)自己的不足,才是學(xué)習(xí)的上策。
1)作用域的實際大小。(是什么?)
2)? 作用域的作用。(有什么用?)
3)怎么使用這些作用域。(怎么用?)
4)它這樣使用實現(xiàn)的原理。(為什么可以這么用?)
?
下面開始逐一分析:
(一)servletcontext域(application域)
1)作用域的實際大小。(是什么?)
servletcontext域起作用的范圍是:整個web應(yīng)用程序。
數(shù)據(jù)產(chǎn)生之后,不僅等會還要用 ,還要給別人用,則請使用servletcontext。
它是四個域中范圍最大的域。
2)? 作用域的作用。(有什么用?)
由于一個web應(yīng)用中的所有servlet共享同一個servletcontext對象,所以多個servlet通過servletcontext對象實現(xiàn)了數(shù)據(jù)在不同servlet之間的共享。
3)怎么使用這些作用域。(怎么用?)
a)可以通過編程的方式綁定,也可以作為web應(yīng)用的全局變量被所有Servlet和JSPs訪問
設(shè)置Context屬性:ServletContext application=this.getServletContext();application.setAttribute("person1",new Person("Jim"));application.setAttribute("person2",new Person("Green"));獲取Context屬性:ServletContext application=this.getServletContext();Enumberation persons=application.getAttributeNames();while(persons.hasMoreElements()){String name=(String)persons.nextElement();Person p=(Person)persons.getAttribute(name);application.removeAttribute(name);}?
b)為整個web應(yīng)用配置context域:
修改web.xml配置文件,加入以下內(nèi)容
<context -param>
<param-name>data</param-name>
<param-value>Hello world !</param-value>
</context - param>
從Servlet中訪問這些初始化參數(shù):
????????????? ServletContext application=this.getServletContext();
????????????? out.println(application.getInitParameter("data"));
?
c)讀取資源文件
?? 使用ServletContext接口可以直接訪問web應(yīng)用中的靜態(tài)內(nèi)容文檔結(jié)構(gòu).包括HTML,GIF和JPEG文件。如以下方法:
???????? .getResource()
???????? .getResourceAsStream()
?? 這兩個方法的參數(shù)都是以"/"開頭的字符串,表示資源相對于context根的相對路徑.文檔結(jié)構(gòu)可以存在于服務(wù)器文件系統(tǒng),或是war包中,或是在遠(yuǎn)程服務(wù)器上,抑或其他位置。不可以用來獲得動態(tài)資源,比如,getResource("/index.jsp"),這個方法將返回該jsp文件的源碼,而不是動態(tài)頁面.可以用 "Dispatching Requests" 獲得動態(tài)內(nèi)容.列出web應(yīng)用中可被訪問的資源,可以使用getResourcePaths(String path)方法。
?????????????
4)它這樣使用實現(xiàn)的原理或優(yōu)缺點。(為什么可以這么用?)
servlet并不適合做數(shù)據(jù)輸出,故需要將數(shù)據(jù)轉(zhuǎn)發(fā)給JSP文件進(jìn)行美化再輸出給客戶端。
JSP中可嵌入java代碼,這使得它接收java數(shù)據(jù)變得可能。同時,由于servletcontext域可使整個web應(yīng)用共享該數(shù)據(jù),因此而帶來“線程安全”問題同樣影響對轉(zhuǎn)發(fā)的數(shù)據(jù),故而需要使用request域。
?
(二)Httpsession域(session域)
1)作用域的實際大小。(是什么?)
Httpsession的作用域是:一次會話。
數(shù)據(jù)產(chǎn)生之后顯示給用戶了,等會還要使用的情況下使用Httpsession域。
它是四個域中范圍第二大的域。
2)? 作用域的作用。(有什么用?)
(會話范圍)在第一次調(diào)用request.getSession()方法時,服務(wù)器會檢查是否已經(jīng)有對應(yīng)的session。如果沒有,就在內(nèi)存中創(chuàng)建一個session并返回。當(dāng)一短時間內(nèi)(默認(rèn)30分鐘)session沒有被使用,則服務(wù)器會銷毀該session。若服務(wù)器非正常關(guān)閉,未到期的session也會跟著銷毀。若調(diào)用session提供的invalidate()方法,可以立即銷毀session。
3)怎么使用這些作用域。(怎么用?)
a) jsp中操作session(String)request.getSession().getAttribute("username"); // 獲取request.getSession().setAttribute("username", "xxx"); // 設(shè)置b) java中操作session//servlet中request.getSession();session.getAttribute("username");session.setAttribute("username", "xxx");session.setMaxInactiveInterval(30*60);session.invalidate();//struts中方法1ServletActionContext.getRequest().getSession().setAttribute("username", "xxx");ServletActionContext.getRequest().getSession().getAttribute("username");ServletActionContext.getRequest().getSession().setMaxInactiveInterval(30*60);ServletActionContext.getRequest().getSession().invalidate();//struts中方法2ActionContext.getContext().getSession().put("username", "xxx");ActionContext.getContext().getSession().get("username");ActionContext.getContext().getSession().clear();c) web.xml中操作session<session-config> <session-timeout>30</session-timeout> </session-config>d) tomcat-->conf-->conf/web.xml<session-config><session-timeout>30</session-timeout></session-config>?
4)它這樣使用實現(xiàn)的原理。(為什么可以這么用?)
HttpSession在服務(wù)器中,為瀏覽器創(chuàng)建獨一無二的內(nèi)存空間,在其中保存了會話相關(guān)的信息。服務(wù)器創(chuàng)建session出來后,會把session的id號,以cookie的形式回寫給客戶機,這樣,只要客戶機的瀏覽器不關(guān),再去訪問服務(wù)器時,都 會帶著session的id號去,服務(wù)器發(fā)現(xiàn)客戶機瀏覽器帶session id過來了,就會使用內(nèi)存中與之對應(yīng)的session為之服務(wù)。如果要問我為什么,我也不知道啊!
?
(三)ServletRequest域(request域)
1)作用域的實際大小。(是什么?)
ServletRequset域是:整個請求鏈(請求轉(zhuǎn)發(fā)也存在)。
數(shù)據(jù)產(chǎn)生之后,只需要使用一次,這種情況下請使用ServletRequset域。
它是四個域中范圍排第三的域。
2)? 作用域的作用。(有什么用?)
在整個請求鏈中共享數(shù)據(jù)。
最常用到:在servlet中處理好的數(shù)據(jù)交給JSP顯示,此時參數(shù)就可以放置在ServletRequset域中帶過去。
3)怎么使用這些作用域。(怎么用?)
a) 獲得客戶機信息的方法
??? getRequestURL方法返回客戶端發(fā)出請求時的完整URL。
??? getRequestURI方法返回請求行中的資源名部分。
??? getQueryString 方法返回請求行中的參數(shù)部分。
??? getRemoteAddr方法返回發(fā)出請求的客戶機的IP地址
??? getRemoteHost方法返回發(fā)出請求的客戶機的完整主機名
??? getRemotePort方法返回客戶機所使用的網(wǎng)絡(luò)端口號
??? getLocalAddr方法返回WEB服務(wù)器的IP地址。
??? getLocalName方法返回WEB服務(wù)器的主機名
??? getMethod得到客戶機請求方式
?b) 獲得客戶機請求頭
??? getHeader(string name)方法
??? getHeaders(String name)方法
??? getHeaderNames方法?
?c) 獲得客戶機請求參數(shù)(客戶端提交的數(shù)據(jù))
??? getParameter(name)方法
??? getParameterValues(String name)方法
??? getParameterNames方法
??? getParameterMap方法
4)它這樣使用實現(xiàn)的原理。(為什么可以這么用?)
在service方法調(diào)用前由服務(wù)器創(chuàng)建,傳入service方法。整個請求結(jié)束,request生命結(jié)束。
?
(四)PageContext域(page域)
1)作用域的實際大小。(是什么?)
PageContext域的作用范圍是:整個JSP頁面。
它是四個域中范圍最小的一個域。
2)? 作用域的作用。(有什么用?)
a) 它可以獲取其它八大隱式對象,可以認(rèn)為它是一個入口對象。
b) 獲取其它所有域中的數(shù)據(jù)。
c) 跳轉(zhuǎn)到其它資源。其身上提供了forword和sendRedirect方法,簡化了轉(zhuǎn)發(fā)和重定向的操作。
3)怎么使用這些作用域。(怎么用?)
以下以一個簡單的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"> <html><head><title>pageContext對象_例1</title></head> <body><br> <% //使用pageContext設(shè)置屬性,該屬性默認(rèn)在page范圍內(nèi) pageContext.setAttribute("name","地球"); request.setAttribute("name","太陽系"); session.setAttribute("name","銀河系"); //session.putValue("name","麥哲倫系"); application.setAttribute("name","宇宙"); %> page設(shè)定的值:<%=pageContext.getAttribute("name")%><br> request設(shè)定的值:<%=pageContext.getRequest().getAttribute("name")%><br> session設(shè)定的值:<%=pageContext.getSession().getAttribute("name")%><br> application設(shè)定的值:<%=pageContext.getServletContext().getAttribute("name")%><br> 范圍1內(nèi)的值:<%=pageContext.getAttribute("name",1)%><br> 范圍2內(nèi)的值:<%=pageContext.getAttribute("name",2)%><br> 范圍3內(nèi)的值:<%=pageContext.getAttribute("name",3)%><br> 范圍4內(nèi)的值:<%=pageContext.getAttribute("name",4)%><br> <!--從最小的范圍page開始,然后是reques、session以及application--> <%pageContext.removeAttribute("name",3);%> pageContext修改后的session設(shè)定的值:<%=session.getValue("name")%><br> <%pageContext.setAttribute("name","宇宙",4);%> pageContext修改后的application設(shè)定的值:<%=pageContext.getServletContext().getAttribute("name")%><br> 值的查找:<%=pageContext.findAttribute("name")%><br> 屬性name的范圍:<%=pageContext.getAttributesScope("name")%><br> </body></html>顯示結(jié)果:
page設(shè)定的值:地球 request設(shè)定的值:太陽系 session設(shè)定的值:銀河系 application設(shè)定的值:宇宙 范圍1內(nèi)的值:地球 范圍2內(nèi)的值:太陽系 范圍3內(nèi)的值:銀河系 范圍4內(nèi)的值:宇宙 pageContext修改后的session設(shè)定的值:null pageContext修改后的application設(shè)定的值:宇宙 值的查找:地球 屬性name的范圍:14)它這樣使用實現(xiàn)的原理。(為什么可以這么用?)
? pageContext對象,這個對象代表頁面上下文,該對象主要用于訪問JSP之間的共享數(shù)據(jù)。當(dāng)對JSP的請求時開始,當(dāng)響應(yīng)結(jié)束時銷毀。
總結(jié)
- 上一篇: springMVC笔记系列——Reque
- 下一篇: Web三个域对象的区别