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