黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Servlet教程

Servlet context對象

ServletContext是一個全局的儲存信息的空間,服務器開始就存在,服務器關閉才釋放。為了方便大家理解,我們將ServletContext和Cookie、Session做一個簡單對比,如下圖:

我們可以把ServletContext當成一個公用的空間,可以被所有的客戶訪問,如上圖,A、B、C三個客戶端都可以訪問。

WEB容器在啟動時,它會為每個Web應用程序都創建一個對應的ServletContext,它代表當前Web應用,并且它被所有客戶端共享。

由于一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之為context域對象。公共聊天室就會用到它。

當web應用關閉、Tomcat關閉或者Web應用reload的時候,ServletContext對象會被銷毀。

ServletContext使用方法

1、ServletContext對象如何得到

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

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

名字(String)

值(Object)

   
   

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

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

刪除屬性:removeAttribute(String name)

3、生命周期

ServletContext中的屬性的生命周期從創建開始,到服務器關閉結束。

一個快速入門的案例:

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

Servlet1的doGet方法為:

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

    ServletContext servletContext = this.getServletContext();
    // 第二種方法
    // ServletContext servletContext2 = this.getServletConfig().getServletContext();
    servletContext.setAttribute("name", "小明");
    out.println("將 name=小明  寫入了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的某個屬性
    //1.首先獲取到ServletContext
    ServletContext servletContext = this.getServletContext();
    //2.取出屬性
    String name = (String)servletContext.getAttribute("name");
    out.println("name="+name);
}

以此訪問Servlet1和Servlet2,我們可以分別看到輸出如下:

 

粗看之下,這個運行結果和Session,Cookie的應用似乎沒什么區別,但事實上則完全不一樣的。只要不關閉Tomcat或者reload該應用,當我們關閉當前的瀏覽器,或者是換一個瀏覽器,比如從360瀏覽器換到了IE瀏覽器再次訪問Servlet2,我們依然可以看到這個結果!這就是和和Session,Cookie最大的不同了。之所以會造成這種不同,是因為ServletContext存在于服務器內存中的一個公共空間,它可以供所有的用戶客戶端訪問。

ServletContext應用

1、多個Servlet可以通過ServletContext對象來實現數據間的共享

類似于Session,通過ServletContext對象我們也可以實現數據共享,但值得注意的是,Session是只能在一個客戶端中共享數據,而ServletContext中的數據是在所有客戶端中都可以實現數據共享的。

2、實現Servlet的請求轉發

之前我們學過的請求轉發是通過request對象的:

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

這里要說明的是,ServletContext也可以實現請求轉發:

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

這兩個轉發效果是一樣的。

3、獲取Web應用的初始化參數

我們可以用<init-param>標簽為servlet配置初始化參數,然后使用ServletConfig對象獲取這些參數,假如有如下的MyServlet,它的配置為:

<servlet>  
    <servlet-name>MyServlet</servlet-name>  
    <servlet-class>com.gavin.servlet.MyServlet</servlet-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>utf-8</param-value>  
    </init-param>  
</servlet>  

可以看到它配置了一個初始化參數:encoding=utf-8,那么我們在MyServlet的源代碼中需要這樣去得到這個參數:

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

注意,上述的參數配置方法只針對一個特定的Servlet有效,我們可以通過ServletContext來獲取全局的、整個Web應用的初始化參數,全局的初始化參數是這樣配置在web.xml文件中的:

<!-- 如果希望所有的Servlet都可以使用該配置,則必須這么做 -->
<context-param>
    <param-name>name</param-name>
    <param-value>gavin</param-value>
</context-param>

然后我們可以在任意一個Servlet中使用ServletContext獲取這個參數:

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

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

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

⑴ 文件在WebRoot文件夾下,即Web應用的根目錄。這時候我們可以使用ServletContext來讀取該資源文件。

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

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

⑵ 如果這個文件放在了src目錄下,這時就不能用ServletContext來讀取了,必須要使用類加載器去讀取。

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

如果這個文件此時還沒有直接在src目錄下,而是在src目錄下的某個包下,比如在com.gavin包下,此時類加載器要加上包的路徑,如下:

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

補充一點,ServletContext只有在讀取的文件在web應用的根目錄下時,才能獲取文件的全路徑。比如我們在WebRoot文件夾下有一個images文件夾,images文件夾下有一個Servlet.jpg圖片,為了得到這個圖片的全路徑,如下:

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

在網站開發中,有很多功能要使用ServletContext,比如

• 網站計數器

• 網站的在線用戶顯示

• 簡單的聊天系統

總之,如果是涉及到不同用戶共享數據,而這些數據量不大,同時又不希望寫入數據庫中,我們就可以考慮使用ServletContext實現。

ServletContext使用建議

因為存在ServletContext中的數據在服務器中會長時間,這樣就會占用很多內存,因此在使用ServletContext時,建議不要往里面添加過大的數據!

全部教程
主站蜘蛛池模板: 久久影院一区二区三区 | 国产成人爱片免费观看视频 | 黄色免费看网站 | 欧美黑人巨大xxxxxxxx | 欧美一区二区三区视频在线 | 亚洲午夜剧场 | 午夜在线观看网站 | 一个人在线观看的免费视频www | 99视频免费在线 | 免费一级国产生活片 | a毛片免费全部在线播放毛 a毛片免费全部播放毛 | 最近新韩国日本免费看 | 粉嫩在线视频 | 色偷偷人人澡久久天天 | 久久不卡免费视频 | 偷亚洲偷国产欧美高清 | 很污的视频网站 | 国产成社区在线视频观看 | 成人欲涩漫h漫免费动漫 | 国产黄色毛片 | 草视频在线观看 | 午夜影皖普通区 | 最新日韩中文字幕 | 亚洲va韩国va欧美va天堂 | 欧美一区二三区 | 国产成人久久综合热 | 日本精品一二三区 | 在线看免费毛片 | 亚洲另类图 | 在线免费看黄色 | 欧美激情a∨在线视频播放 欧美激情二区 | 怡红院视频在线观看最新 | 九九免费观看全部免费视频 | 免费无毒片在线观看 | 人人干天天干 | 欧美性猛交xxxx乱大交中文 | 黄色网址在线视频 | 中国一级特黄真人毛片 | 国产成人免费网站 | 国产福利在线网址成人 | 男女啪啪的网站 |