application對象 1 什么是application對象 ? (1) 當(dāng)Web服務(wù)器啟動時,Web服務(wù)器會自動創(chuàng)建一個application對象。application對象一旦創(chuàng)建,它將一直存在,直到Web服務(wù)器關(guān)閉。一個Web服務(wù)器通常有多個Web服務(wù)目錄 (網(wǎng)站),當(dāng)Web服務(wù)器啟動時,它自動為每個Web服務(wù)目錄都創(chuàng)建一個application對象,這些application對象各自獨立,而且和Web服務(wù)目錄一一對應(yīng)。訪問同一個網(wǎng)站的客戶都共享一個application對象,因此,application對象可以實現(xiàn)多客戶間的數(shù)據(jù)共享。訪問不同網(wǎng)站的客戶,對應(yīng)的application對象不同。 (2) application對象的生命周期:從Web服務(wù)器啟動,直到Web服務(wù)器關(guān)閉。 注意:一個Web應(yīng)用程序啟動后,將會自動創(chuàng)建一個application對象,而且在整個應(yīng)用程序的運行過程中只有一個application對象,也即所有訪問該網(wǎng)站的客戶都共享一個application對象。 (3) application對象的作用范圍:application對象是一個應(yīng)用程序級的對象,它作用于當(dāng)前Web應(yīng)用程序,也即作用于當(dāng)前網(wǎng)站,所有訪問當(dāng)前網(wǎng)站的客戶都共享一個application對象。具體來說:不管哪個客戶來訪問網(wǎng)站A,也不管客戶訪問網(wǎng)站A下哪個頁面文件,都可以對網(wǎng)站A的application對象進行操作,因為,所有訪問網(wǎng)站A的客戶都共用一個application對象。因此,當(dāng)在application對象中存儲數(shù)據(jù)后,所有訪問網(wǎng)站A的客戶都能夠?qū)ζ溥M行訪問,實現(xiàn)了多客戶之間的數(shù)據(jù)共享。 (4) application對象的基類是:javax.servlet.ServletContext類。 注意:有些Web服務(wù)器不直接支持使用application對象,必須用ServletContext類來聲明application對象,再調(diào)用getServletContext()方法來獲取當(dāng)前頁面的application對象。 (5) ServletContext類:用于表示應(yīng)用程序的上下文。一個ServletContext類的對象表示一個Web應(yīng)用程序的上下文。具體來說:在Web服務(wù)器中,提供了一個Web應(yīng)用程序的運行時環(huán)境,專門負責(zé)Web應(yīng)用程序的部署、編譯、運行以及生命周期的管理,通過ServletContext類,可以獲取Web應(yīng)用程序的運行時環(huán)境信息。 常識:JSP引擎、Servlet引擎、JSP容器和Servlet容器,都是指Web服務(wù)器,Web服務(wù)器用于管理所有Web應(yīng)用程序。 (6) application對象的常用方法,如下所示:
2 使用application對象存儲數(shù)據(jù) (1) 設(shè)置application對象的屬性和獲取application對象的屬性 測試代碼 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> 測試代碼 TestCommon.jsp 在TestCommon.jsp 頁面中,通過application對象獲取屬性,注意TestApplication.jsp和TestCommon.jsp這兩個頁面之間沒有任何關(guān)聯(lián),只要通過application對象設(shè)置了屬性,那么就可以在任何頁面,通過application對象獲取屬性或者刪除屬性。 <%@ 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對象的屬性 測試代碼 TestCommon.jsp 在TestCommon.jsp 頁面中,刪除application對象的屬性。 <%@ 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對象實現(xiàn)網(wǎng)站計數(shù)器 測試代碼: 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ǎng)站,您是第 <%= personCount %> 個訪問用戶! </body> </html> 4 使用application對象獲取初始化參數(shù) (1) 一 般來說,在web.xml文件中,設(shè)置初始化參數(shù)有如下兩種方式: n 設(shè)置系統(tǒng)范圍內(nèi)的初始化參數(shù) n 針對單個Servlet文件或JSP文件設(shè)置初始化參數(shù) 對于系統(tǒng)范圍內(nèi)的初始化參數(shù),可通過ServletContext 接口的getInitParameter(String name)方法,根據(jù)指定的參數(shù)名,獲取對應(yīng)的參數(shù)值。對于針對單個Servlet文件或JSP文件設(shè)置初始化參數(shù),可通過ServletConfig接口的 getInitParameter(String name)方法,根據(jù)指定的參數(shù)名,獲取對應(yīng)的參數(shù)值。 在web.xml文件中,可利用context-param元素來設(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> 測試代碼 TestApplication02.jsp <%@ page language=”java” contentType=”text/html; charset=GBK” %> <% request.setCharacterEncoding(“GBK”); %> <html> <body> <%–使用application對象獲取系統(tǒng)范圍內(nèi)的初始化參數(shù)–%> <font color=”Red”>使用application對象獲取初始化參數(shù):</font> <br> <% String appName = getServletContext().getInitParameter(“appName”); String appVersion = getServletContext().getInitParameter(“appVersion”); %> 應(yīng)用程序的名稱:<%=appName%><br> 應(yīng)用程序的版本:<%=appVersion%> </body> </html> 修改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> 5 使用application對象獲取Web應(yīng)用程序的環(huán)境信息 測試代碼: TestApplication03.jsp <%@ page language=”java” contentType=”text/html; charset=GBK” pageEncoding=”GBK”%> <% request.setCharacterEncoding(“GBK”); %> <html> <body> <h2>使用application對象獲取Web應(yīng)用程序的環(huán)境信息</h2> <p> <font color=”Red”>獲取當(dāng)前Web服務(wù)器的版本信息:</font><%= application.getServerInfo() %><br> <font color=”Red”>獲取Servlet API的主版本號:</font><%= application.getMajorVersion() %><br> <font color=”Red”>獲取Servlet API的次版本號:</font><%= application.getMinorVersion() %> <p> <font color=”Red”>獲得指定URL的ServletContext對象:</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對象和application對象的比較 (1) 兩者的作用范圍不同: session對象是用戶級的對象,而application對象是應(yīng)用程序級的對象。 一個用戶一個session對象,每個用戶的session對象不同,在用戶所訪問網(wǎng)站的多個頁面之間共享同一個session對象。 一個Web應(yīng)用程序一個application對象,每個Web應(yīng)用程序的application對象不同,但一個Web應(yīng)用程序的多個用戶之間共享同一個application對象。 在同一個網(wǎng)站下: n 每個用戶的session對象不同 n 所用用戶的application對象相同 在不同網(wǎng)站下: n 每個用戶的session對象不同 n 每個用戶的application對象不同 (2) 兩者的生命周期不同: session對象的生命周期:用戶首次訪問網(wǎng)站創(chuàng)建,用戶離開該網(wǎng)站 (不一定要關(guān)閉瀏覽器) 消亡。 application對象的生命周期:啟動Web服務(wù)器創(chuàng)建,關(guān)閉Web服務(wù)器銷毀。 |
|