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)?,所有訪問(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)境,專門(mé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ì)象的常用方法,如下所示:
方法名 | 描述 |
String getAttribute(String name) | 根據(jù)屬性名稱獲取屬性值。 |
Enumeration getAttributeNames() | 獲取所有的屬性名稱。 |
void setAttribute(String name, Object object) | 設(shè)置屬性,指定屬性名稱和屬性值。 |
void removeAttribute(String name) | 根據(jù)屬性名稱刪除對(duì)應(yīng)的屬性。 |
ServletContext getContext(String uripath) | 獲取指定URL的ServletContext對(duì)象。 |
String getContextPath() | 獲取當(dāng)前Web應(yīng)用程序的根目錄。 |
String getInitParameter(String name) | 根據(jù)初始化參數(shù)名稱,獲取初始化參數(shù)值。 |
int getMajorVersion() | 獲取Servlet API的主版本號(hào)。 |
int getMinorVersion() | 獲取Servlet API的次版本號(hào)。 |
String getMimeType(String file) | 獲取指定文件的MIME 類型。 |
String getServletInfo() | 獲取當(dāng)前Web服務(wù)器的版本信息。 |
String getServletContextName() | 獲取當(dāng)前Web應(yīng)用程序的名稱。 |
void log(String message) | 將信息寫(xiě)入日志文件中。 |
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ù)值。
(2) 如何設(shè)置系統(tǒng)范圍內(nèi)的初始化參數(shù)
在web.xml文件中,可利用context-param元素來(lái)設(shè)置系統(tǒng)范圍內(nèi)的初始化參數(shù)。context-param元素應(yīng)該包含param-name、param-value以及可選的description子元素,如下所示:
<context-param>
<param-name>support-email</param-name>
<param-value>blackhole@mycompany.com</param-value>
</context-param>
web.xml文件的示例:
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app version=”2.4″
xmlns=”http://java.sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee
http://java.sun.com/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.sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee
http://java.sun.com/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)建,用戶離開(kāi)該網(wǎng)站 (不一定要關(guān)閉瀏覽器) 消亡。
application對(duì)象的生命周期:?jiǎn)?dòng)Web服務(wù)器創(chuàng)建,關(guān)閉Web服務(wù)器銷毀。
聯(lián)系客服