日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)Servlet教程:Servletcontext對(duì)象

Servletcontext是一個(gè)全局的儲(chǔ)存信息的空間,服務(wù)器開(kāi)始就存在,服務(wù)器關(guān)閉才釋放。為了方便大家理解,我們將ServletContext和Cookie、Session做一個(gè)簡(jiǎn)單對(duì)比,如下圖:

目前創(chuàng)新互聯(lián)公司已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、富陽(yáng)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

我們可以把ServletContext當(dāng)成一個(gè)公用的空間,可以被所有的客戶(hù)訪(fǎng)問(wèn),如上圖,A、B、C三個(gè)客戶(hù)端都可以訪(fǎng)問(wèn)。

WEB容器在啟動(dòng)時(shí),它會(huì)為每個(gè)Web應(yīng)用程序都創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext,它代表當(dāng)前Web應(yīng)用,并且它被所有客戶(hù)端共享。

由于一個(gè)WEB應(yīng)用中的所有Servlet共享同一個(gè)Servletcontext對(duì)象,因此Servlet對(duì)象之間可以通過(guò)ServletContext對(duì)象來(lái)實(shí)現(xiàn)通訊。ServletContext對(duì)象通常也被稱(chēng)之為context域?qū)ο?。公共聊天室就?huì)用到它。

當(dāng)web應(yīng)用關(guān)閉、Tomcat關(guān)閉或者Web應(yīng)用reload的時(shí)候,ServletContext對(duì)象會(huì)被銷(xiāo)毀

ServletContext使用方法


1、ServletContext對(duì)象如何得到

this.getServletContext(); 
this.getServletConfig().getServletContext();

2、你可以把它想象成一張表,這個(gè)和Session非常相似:每一行就是一個(gè)屬性,如下:

名字(String) 值(Object)

添加屬性:setAttribute(String name, Object obj);

得到值:getAttribute(String name),這個(gè)方法返回Object

刪除屬性:removeAttribute(String name)

3、生命周期 

ServletContext中的屬性的生命周期從創(chuàng)建開(kāi)始,到服務(wù)器關(guān)閉結(jié)束。

一個(gè)快速入門(mén)的案例: 

我們創(chuàng)建Servlet1和Servlet2,分別用于在ServletContext中創(chuàng)建和讀取屬性: 

Servlet1的doGet方法為:

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    // 獲取ServletContext對(duì)象的引用
    // 第一種方法

    ServletContext servletContext = this.getServletContext();
    // 第二種方法
    // ServletContext servletContext2 = this.getServletConfig().getServletContext();
    servletContext.setAttribute("name", "小明");
    out.println("將 name=小明  寫(xiě)入了ServletContext");
}

Servlet2的doGet方法為:

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    // 取出ServletContext的某個(gè)屬性
    //1.首先獲取到ServletContext
    ServletContext servletContext = this.getServletContext();
    //2.取出屬性
    String name = (String)servletContext.getAttribute("name");
    out.println("name="+name);
}

以此訪(fǎng)問(wèn)Servlet1和Servlet2,我們可以分別看到輸出如下:

粗看之下,這個(gè)運(yùn)行結(jié)果和Session,Cookie的應(yīng)用似乎沒(méi)什么區(qū)別,但事實(shí)上則完全不一樣的。只要不關(guān)閉Tomcat或者reload該應(yīng)用,當(dāng)我們關(guān)閉當(dāng)前的瀏覽器,或者是換一個(gè)瀏覽器,比如從360瀏覽器換到了IE瀏覽器再次訪(fǎng)問(wèn)Servlet2,我們依然可以看到這個(gè)結(jié)果!這就是和和Session,Cookie最大的不同了。之所以會(huì)造成這種不同,是因?yàn)镾ervletContext存在于服務(wù)器內(nèi)存中的一個(gè)公共空間,它可以供所有的用戶(hù)客戶(hù)端訪(fǎng)問(wèn)。

ServletContext應(yīng)用


1、多個(gè)Servlet可以通過(guò)ServletContext對(duì)象來(lái)實(shí)現(xiàn)數(shù)據(jù)間的共享

類(lèi)似于Session,通過(guò)ServletContext對(duì)象我們也可以實(shí)現(xiàn)數(shù)據(jù)共享,但值得注意的是,Session是只能在一個(gè)客戶(hù)端中共享數(shù)據(jù),而ServletContext中的數(shù)據(jù)是在所有客戶(hù)端中都可以實(shí)現(xiàn)數(shù)據(jù)共享的。

2、實(shí)現(xiàn)Servlet的請(qǐng)求轉(zhuǎn)發(fā)

之前我們學(xué)過(guò)的請(qǐng)求轉(zhuǎn)發(fā)是通過(guò)request對(duì)象的: 

request.getRequestDispatcher("/url").forward(request, response);

這里要說(shuō)明的是,ServletContext也可以實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā): 

this.getServletContext().getRequestDispatcher("/url").forward(request, response); 

這兩個(gè)轉(zhuǎn)發(fā)效果是一樣的。

3、獲取Web應(yīng)用的初始化參數(shù)

我們可以用標(biāo)簽為servlet配置初始化參數(shù),然后使用ServletConfig對(duì)象獲取這些參數(shù),假如有如下的MyServlet,它的配置為:

  
    MyServlet  
    com.gavin.servlet.MyServlet  
      
        encoding  
        utf-8  
      
  

可以看到它配置了一個(gè)初始化參數(shù):encoding=utf-8,那么我們?cè)贛yServlet的源代碼中需要這樣去得到這個(gè)參數(shù):

String encoding = this.getServletConfig().getInitParameter("encoding");

注意,上述的參數(shù)配置方法只針對(duì)一個(gè)特定的Servlet有效,我們可以通過(guò)ServletContext來(lái)獲取全局的、整個(gè)Web應(yīng)用的初始化參數(shù),全局的初始化參數(shù)是這樣配置在web.xml文件中的:



    name
    gavin

然后我們可以在任意一個(gè)Servlet中使用ServletContext獲取這個(gè)參數(shù):

String name = this.getServletContext().getInitParameter("name");


4、利用ServletContext對(duì)象讀取資源文件(比如properties文件) 

讀取資源文件要根據(jù)資源文件所在的位置來(lái)決定,一般分為以下兩種情況:

4.1:文件在WebRoot文件夾下,即Web應(yīng)用的根目錄。這時(shí)候我們可以使用ServletContext來(lái)讀取該資源文件。

假設(shè)我們Web根目錄下有一個(gè)配置數(shù)據(jù)庫(kù)信息的dbinfo.properties文件,里面配置了name和password屬性,這時(shí)候可以通過(guò)ServletContext去讀取這個(gè)文件:

// 這種方法的默認(rèn)讀取路徑就是Web應(yīng)用的根目錄
InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");
// 創(chuàng)建屬性對(duì)象
Properties properties = new Properties();
properties.load(stream);
String name = properties.getProperty("name");
String password = properties.getProperty("password");
out.println("name="+name+";password="+password);

4.2:如果這個(gè)文件放在了src目錄下,這時(shí)就不能用ServletContext來(lái)讀取了,必須要使用類(lèi)加載器去讀取。

// 類(lèi)加載器的默認(rèn)讀取路徑是src根目錄
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("dbinfo.properties")

如果這個(gè)文件此時(shí)還沒(méi)有直接在src目錄下,而是在src目錄下的某個(gè)包下,比如在com.gavin包下,此時(shí)類(lèi)加載器要加上包的路徑,如下:

InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("com/gavin/dbinfo.properties")

補(bǔ)充一點(diǎn),ServletContext只有在讀取的文件在web應(yīng)用的根目錄下時(shí),才能獲取文件的全路徑。比如我們?cè)赪ebRoot文件夾下有一個(gè)images文件夾,images文件夾下有一個(gè)Servlet.jpg圖片,為了得到這個(gè)圖片的全路徑,如下:

// 如何讀取到一個(gè)文件的全路徑,這里會(huì)得到在Tomcat的全路徑
String path = this.getServletContext().getRealPath("/images/Servlet.jpg");

在網(wǎng)站開(kāi)發(fā)中,有很多功能要使用ServletContext,比如 

1. 網(wǎng)站計(jì)數(shù)器 

2. 網(wǎng)站的在線(xiàn)用戶(hù)顯示 

3. 簡(jiǎn)單的聊天系統(tǒng)

總之,如果是涉及到不同用戶(hù)共享數(shù)據(jù),而這些數(shù)據(jù)量不大,同時(shí)又不希望寫(xiě)入數(shù)據(jù)庫(kù)中,我們就可以考慮使用ServletContext實(shí)現(xiàn)。

ServletContext使用建議

因?yàn)榇嬖赟ervletContext中的數(shù)據(jù)在服務(wù)器中會(huì)長(zhǎng)時(shí)間,這樣就會(huì)占用很多內(nèi)存,因此在使用ServletContext時(shí),建議不要往里面添加過(guò)大的數(shù)據(jù)!

相關(guān)閱讀:

Servlet教程

Servlet API官方文檔


文章標(biāo)題:創(chuàng)新互聯(lián)Servlet教程:Servletcontext對(duì)象
標(biāo)題URL:http://www.dlmjj.cn/article/dpsjeci.html