天天看點

java web 學習筆記(15)ServletContext 對象

ServletContext 對象

參考教程:https://www.w3cschool.cn/servlet/servlet-3ceg2p0t.html

1.ServletContext 對象簡介

ServletContext是一個全局的儲存資訊的空間,伺服器開始就存在,伺服器關閉才釋放。為了友善大家了解,我們将ServletContext和Cookie、Session做一個簡單對比,如下圖:

java web 學習筆記(15)ServletContext 對象

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

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

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

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

2.使用ServletContext對象

(1)怎麼得到 ServletContext對象

this.getServletContext();
this.ServletConfig().getServletContext();
           

主要有以上兩種方法來擷取ServletContext對象。

(2)使用ServletContext對象

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

和其對應的value值,可以用來存儲資訊。

添加屬性:setAttribute(String name, Object obj);
得到值:getAttribute(String name),這個方法傳回Object
删除屬性:removeAttribute(String name)
           

3.執行個體

這個執行個體示範,一個Servlet向ServletContext對象寫入資訊。另一個Servlet讀取Servlet對象的資訊。(Context1寫入資訊,Context2讀取資訊)

Context1代碼如下:

package context;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Context1")
public class Context1 extends HttpServlet {
 private static final long serialVersionUID = 1L;
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  PrintWriter out = response.getWriter();
  ServletContext context = this.getServletContext();
  context.setAttribute("name", "qak");
  context.setAttribute("password", "20174044");
  out.println("Context1->Context Finished writing information!");
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}

           

通路結果:

java web 學習筆記(15)ServletContext 對象

Context2 代碼如下:

package context;

import java.io.IOException;
import java.io.PrintWriter;
//import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Context2")
public class Context2 extends HttpServlet {

 private static final long serialVersionUID = 1L;
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  PrintWriter out=response.getWriter();
  ServletContext context = this.getServletContext();
  //Enumeration<String> info= context.getAttributeNames();
  out.println("Context_information: <br /><br />");
  out.println("name : "+(String)context.getAttribute("name")+"<br />"+
     "password : "+(String)context.getAttribute("password"));
     
  //out.println("All Context information: <br /><br />");
  // 擷取Context所有對象的屬性和值
  /*
  while(info.hasMoreElements()) {
   String key=info.nextElement();
   out.println(key+" : "+context.getAttribute(key)+"<br />");
  }*/
 }
 
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}
           

通路結果:

java web 學習筆記(15)ServletContext 對象

4.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應用的初始化參數

我們可以用标簽為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檔案中的:

<context-param>
    <param-name>name</param-name>
    <param-value>gavin</param-value>
</context-param>
           

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

String name = this.getServletContext().getInitParameter(“name”);

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

  1. 網站計數器
  2. 網站的線上使用者顯示
  3. 簡單的聊天系統

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

ServletContext使用建議

因為存在ServletContext中的資料在伺服器中會長時間,這樣就會占用很多記憶體,是以在使用ServletContext時,建議不要往裡面添加過大的資料!