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