最近學完了web部分,發現有些地方總是單個容易理解,可是把所有的放在一起來大雜燴,總是有那麼幾個知識點容易混淆。其實網上的資料已經夠多了,雖然也不乏辛勞的搬運工。可是最終的目的不就是要我們自身理解嗎?自己理解了的東西才正真是我們的。作為額外的獎勵,我們先來關注一下JSP的九大隱式對象。
可以看看下圖中關於JSP的九大隱式對象,它們可總是被老師們說是重點重點哦。
作用域------顧名思義,起作用的大小范圍也!如果是你自己去學習一個知識點,你要達到哪些目標才算是對一個知識點稱得上是懂得,理解,掌握呢?從扁神醫的望聞問切,到數據庫的增刪改查,所有的事物開始也不外乎:是什麼?有什麼用?怎麼用?為什麼可以這麼用?故而,我覺得咱們應該把握以下問題,帶著這些問題去學習,發現自己的不足,才是學習的上策。
1)作用域的實際大小。(是什麼?)
2) 作用域的作用。(有什麼用?)
3)怎麼使用這些作用域。(怎麼用?)
4)它這樣使用實現的原理。(為什麼可以這麼用?)
下面開始逐一分析:
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域。
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中方法1 ServletActionContext.getRequest().getSession().setAttribute("username", "xxx"); ServletActionContext.getRequest().getSession().getAttribute("username"); ServletActionContext.getRequest().getSession().setMaxInactiveInterval(30*60); ServletActionContext.getRequest().getSession().invalidate(); //struts中方法2 ActionContext.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為之服務。如果要問我為什麼,我也不知道啊!
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生命結束。
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的范圍:1
4)它這樣使用實現的原理。(為什麼可以這麼用?)
pageContext對象,這個對象代表頁面上下文,該對象主要用於訪問JSP之間的共享數據。當對JSP的請求時開始,當響應結束時銷毀。