Java基礎回顧Application(二)


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服務器銷毀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM