application對(duì)象 1 什么是application對(duì)象 ? (1) 當(dāng)Web服務(wù)器啟動(dòng)時(shí),Web服務(wù)器會(huì)自動(dòng)創(chuàng)建一個(gè)application對(duì)象。application對(duì)象一旦創(chuàng)建,它將一直存在,直到Web服務(wù)器關(guān)閉。一個(gè)Web服務(wù)器通常有多個(gè)Web服務(wù)目錄 (網(wǎng)站),當(dāng)Web服務(wù)器啟動(dòng)時(shí),它自動(dòng)為每個(gè)Web服務(wù)目錄都創(chuàng)建一個(gè)application對(duì)象,這些application對(duì)象各自獨(dú)立,而且和Web服務(wù)目錄一一對(duì)應(yīng)。訪問(wèn)同一個(gè)網(wǎng)站的客戶都共享一個(gè)application對(duì)象,因此,application對(duì)象可以實(shí)現(xiàn)多客戶間的數(shù)據(jù)共享。訪問(wèn)不同網(wǎng)站的客戶,對(duì)應(yīng)的application對(duì)象不同。 (2) application對(duì)象的生命周期:從Web服務(wù)器啟動(dòng),直到Web服務(wù)器關(guān)閉。 注意:一個(gè)Web應(yīng)用程序啟動(dòng)后,將會(huì)自動(dòng)創(chuàng)建一個(gè)application對(duì)象,而且在整個(gè)應(yīng)用程序的運(yùn)行過(guò)程中只有一個(gè)application對(duì)象,也即所有訪問(wèn)該網(wǎng)站的客戶都共享一個(gè)application對(duì)象。 (3) application對(duì)象的作用范圍:application對(duì)象是一個(gè)應(yīng)用程序級(jí)的對(duì)象,它作用于當(dāng)前Web應(yīng)用程序,也即作用于當(dāng)前網(wǎng)站,所有訪問(wèn)當(dāng)前網(wǎng)站的客戶都共享一個(gè)application對(duì)象。具體來(lái)說(shuō):不管哪個(gè)客戶來(lái)訪問(wèn)網(wǎng)站A,也不管客戶訪問(wèn)網(wǎng)站A下哪個(gè)頁(yè)面文件,都可以對(duì)網(wǎng)站A的application對(duì)象進(jìn)行操作,因?yàn)椋性L問(wèn)網(wǎng)站A的客戶都共用一個(gè)application對(duì)象。因此,當(dāng)在application對(duì)象中存儲(chǔ)數(shù)據(jù)后,所有訪問(wèn)網(wǎng)站A的客戶都能夠?qū)ζ溥M(jìn)行訪問(wèn),實(shí)現(xiàn)了多客戶之間的數(shù)據(jù)共享。 (4) application對(duì)象的基類是:javax.servlet.ServletContext類。 注意:有些Web服務(wù)器不直接支持使用application對(duì)象,必須用ServletContext類來(lái)聲明application對(duì)象,再調(diào)用getServletContext()方法來(lái)獲取當(dāng)前頁(yè)面的application對(duì)象。 (5) ServletContext類:用于表示應(yīng)用程序的上下文。一個(gè)ServletContext類的對(duì)象表示一個(gè)Web應(yīng)用程序的上下文。具體來(lái)說(shuō):在Web服務(wù)器中,提供了一個(gè)Web應(yīng)用程序的運(yùn)行時(shí)環(huán)境,專門負(fù)責(zé)Web應(yīng)用程序的部署、編譯、運(yùn)行以及生命周期的管理,通過(guò)ServletContext類,可以獲取Web應(yīng)用程序的運(yùn)行時(shí)環(huán)境信息。 常識(shí):JSP引擎、Servlet引擎、JSP容器和Servlet容器,都是指Web服務(wù)器,Web服務(wù)器用于管理所有Web應(yīng)用程序。 (6) application對(duì)象的常用方法,如下所示:
2 使用application對(duì)象存儲(chǔ)數(shù)據(jù) (1) 設(shè)置application對(duì)象的屬性和獲取application對(duì)象的屬性 測(cè)試代碼 TestApplication.jsp <%@ page language=”java” contentType=”text/html; charset=GBK”%> <% request.setCharacterEncoding(“GBK”);%> <html> <body> <form name=”form1″ action=”" method=”post”> 用戶名: <input type=”text” name=”username” value=”"> <br> 密 碼: <input type=”password” name=”pwd” value=”"> <br> <input type=”submit” name=”btSubmit” value=”提交”> </form> <% application.setAttribute(“username”, request.getParameter(“username”)); application.setAttribute(“pwd”, request.getParameter(“pwd”)); %> </body> </html> 測(cè)試代碼 TestCommon.jsp 在TestCommon.jsp 頁(yè)面中,通過(guò)application對(duì)象獲取屬性,注意TestApplication.jsp和TestCommon.jsp這兩個(gè)頁(yè)面之間沒(méi)有任何關(guān)聯(lián),只要通過(guò)application對(duì)象設(shè)置了屬性,那么就可以在任何頁(yè)面,通過(guò)application對(duì)象獲取屬性或者刪除屬性。 <%@ page language=”java” contentType=”text/html; charset=GBK”%> <% request.setCharacterEncoding(“GBK”); %> <html> <body> 用戶名:<%=application.getAttribute(“username”) %><br> 密 碼:<%=application.getAttribute(“pwd”) %><br> </body> </html> (2) 刪除application對(duì)象的屬性 測(cè)試代碼 TestCommon.jsp 在TestCommon.jsp 頁(yè)面中,刪除application對(duì)象的屬性。 <%@ page language=”java” contentType=”text/html; charset=GBK”%> <% request.setCharacterEncoding(“GBK”); %> <html> <body> <%–刪除屬性–%> <% application.removeAttribute(“username”); application.removeAttribute(“pwd”); %> 用戶名:<%=application.getAttribute(“username”)%><br> 密 碼:<%=application.getAttribute(“pwd”)%><br> </body> </html> 3 使用application對(duì)象實(shí)現(xiàn)網(wǎng)站計(jì)數(shù)器 測(cè)試代碼: TestApplication01.jsp <%@ page language=”java” contentType=”text/html; charset=GBK”%> <%@ page import=”java.util.*”%> <% request.setCharacterEncoding(“GBK”);%> <html> <body> <%! ServletContext application; synchronized void countPeople() { application = getServletContext(); Integer number =(Integer)application.getAttribute(“number”); if (number == null) { number = new Integer(1); application.setAttribute(“number”, number); } else { number = new Integer(number.intValue() 1); application.setAttribute(“number”, number); } } %> <% if (session.isNew()) { countPeople(); } int personCount = ((Integer)application.getAttribute(“number”)).intValue(); %> <p>歡迎訪問(wèn)本網(wǎng)站,您是第 <%= personCount %> 個(gè)訪問(wèn)用戶! </body> </html> 4 使用application對(duì)象獲取初始化參數(shù) (1) 一 般來(lái)說(shuō),在web.xml文件中,設(shè)置初始化參數(shù)有如下兩種方式: n 設(shè)置系統(tǒng)范圍內(nèi)的初始化參數(shù) n 針對(duì)單個(gè)Servlet文件或JSP文件設(shè)置初始化參數(shù) 對(duì)于系統(tǒng)范圍內(nèi)的初始化參數(shù),可通過(guò)ServletContext 接口的getInitParameter(String name)方法,根據(jù)指定的參數(shù)名,獲取對(duì)應(yīng)的參數(shù)值。對(duì)于針對(duì)單個(gè)Servlet文件或JSP文件設(shè)置初始化參數(shù),可通過(guò)ServletConfig接口的 getInitParameter(String name)方法,根據(jù)指定的參數(shù)名,獲取對(duì)應(yīng)的參數(shù)值。 在web.xml文件中,可利用context-param元素來(lái)設(shè)置系統(tǒng)范圍內(nèi)的初始化參數(shù)。context-param元素應(yīng)該包含param-name、param-value以及可選的description子元素,如下所示: web.xml文件的示例: <?xml version=”1.0″ encoding=”UTF-8″?> <web-app version=”2.4″ xmlns=”http://java./xml/ns/j2ee” xmlns:xsi=”http://www./2001/XMLSchema-instance” xsi:schemaLocation=”http://java./xml/ns/j2ee http://java./xml/ns/j2ee/web-app_2_4.xsd”> <context-param> <param-name>appName</param-name> <param-value>MyWebTest</param-value> </context-param> <context-param> <param-name>appVersion</param-name> <param-value>Version 1.0</param-value> </context-param> <welcome-file-list> <welcome-file>MyTest01.jsp</welcome-file> </welcome-file-list> </web-app> 測(cè)試代碼 TestApplication02.jsp <%@ page language=”java” contentType=”text/html; charset=GBK” %> <% request.setCharacterEncoding(“GBK”); %> <html> <body> <%–使用application對(duì)象獲取系統(tǒng)范圍內(nèi)的初始化參數(shù)–%> <font color=”Red”>使用application對(duì)象獲取初始化參數(shù):</font> <br> <% String appName = getServletContext().getInitParameter(“appName”); String appVersion = getServletContext().getInitParameter(“appVersion”); %> 應(yīng)用程序的名稱:<%=appName%><br> 應(yīng)用程序的版本:<%=appVersion%> </body> </html> 修改web.xml文件,添加藍(lán)色字體部分: <?xml version=”1.0″ encoding=”UTF-8″?> <web-app version=”2.4″ xmlns=”http://java./xml/ns/j2ee” xmlns:xsi=”http://www./2001/XMLSchema-instance” xsi:schemaLocation=”http://java./xml/ns/j2ee http://java./xml/ns/j2ee/web-app_2_4.xsd”> <context-param> <param-name>appName</param-name> <param-value>MyWebTest</param-value> </context-param> <context-param> <param-name>appVersion</param-name> <param-value>Version 1.0</param-value> </context-param> <welcome-file-list> <welcome-file>MyTest01.jsp</welcome-file> </welcome-file-list> </web-app> 5 使用application對(duì)象獲取Web應(yīng)用程序的環(huán)境信息 測(cè)試代碼: TestApplication03.jsp <%@ page language=”java” contentType=”text/html; charset=GBK” pageEncoding=”GBK”%> <% request.setCharacterEncoding(“GBK”); %> <html> <body> <h2>使用application對(duì)象獲取Web應(yīng)用程序的環(huán)境信息</h2> <p> <font color=”Red”>獲取當(dāng)前Web服務(wù)器的版本信息:</font><%= application.getServerInfo() %><br> <font color=”Red”>獲取Servlet API的主版本號(hào):</font><%= application.getMajorVersion() %><br> <font color=”Red”>獲取Servlet API的次版本號(hào):</font><%= application.getMinorVersion() %> <p> <font color=”Red”>獲得指定URL的ServletContext對(duì)象:</font> <% ServletContext sc = application.getContext(“/ch3/TestApplication01.jsp”); out.println(sc.getServerInfo()); %> <p> <%–需要在web.xml設(shè)置 display-name 元素–%> <font color=”Red”>獲取當(dāng)前Web應(yīng)用程序的名稱:</font><%= application.getServletContextName() %> <p> <font color=”Red”>獲取當(dāng)前Web應(yīng)用程序的上下文路徑:</font><%= application.getContextPath() %> </body> </html> 6 session對(duì)象和application對(duì)象的比較 (1) 兩者的作用范圍不同: session對(duì)象是用戶級(jí)的對(duì)象,而application對(duì)象是應(yīng)用程序級(jí)的對(duì)象。 一個(gè)用戶一個(gè)session對(duì)象,每個(gè)用戶的session對(duì)象不同,在用戶所訪問(wèn)網(wǎng)站的多個(gè)頁(yè)面之間共享同一個(gè)session對(duì)象。 一個(gè)Web應(yīng)用程序一個(gè)application對(duì)象,每個(gè)Web應(yīng)用程序的application對(duì)象不同,但一個(gè)Web應(yīng)用程序的多個(gè)用戶之間共享同一個(gè)application對(duì)象。 在同一個(gè)網(wǎng)站下: n 每個(gè)用戶的session對(duì)象不同 n 所用用戶的application對(duì)象相同 在不同網(wǎng)站下: n 每個(gè)用戶的session對(duì)象不同 n 每個(gè)用戶的application對(duì)象不同 (2) 兩者的生命周期不同: session對(duì)象的生命周期:用戶首次訪問(wèn)網(wǎng)站創(chuàng)建,用戶離開該網(wǎng)站 (不一定要關(guān)閉瀏覽器) 消亡。 application對(duì)象的生命周期:?jiǎn)?dòng)Web服務(wù)器創(chuàng)建,關(guān)閉Web服務(wù)器銷毀。 |
|