ServletContext物件

SecondDream_1017發表於2018-08-15

1.Context是上下文的意思,就是環境的意思,相當於腔體。
2.ServletContext的意思是這個大腔體裡面有一系列的Servlet,就是web應用了。
3.web應用是由無數的servlet構成,service和dao都是servlet後續的元件,他們都執行在servlet的內部,只是分離出去的模組。本質上,一個web應用,只是一堆servlet。所以,servletContext就是一個web應用,是一個大腔體,裡面有很多個servlet存活。

===========================================================================

原出處:https://www.cnblogs.com/HigginCui/p/5970186.html

【簡介】

ServletContext即Servlet上下文物件,該物件表示當前的web應用環境資訊,一個Web應用只會建立一個ServletContext物件。

Web容器啟動的時候,它會為每個Web應用程式都建立一個對應的ServletContext物件,它代表當前的web應用。

[注意]

由於一個Web應用中的所有Servlet共享一個ServletContext物件,所以多個Servlet通過ServletContext物件實現資料共享,

ServletContext物件通常稱為Context物件。
 

【ServletContext建立時機】

ServletContext物件是在TomCat伺服器載入完當前Web應用後建立出來的。

ServletContext物件是作為ServletConfig物件成員變數傳入Servlet中。

通過ServletConfig的getServletContext()方法就可以得到ServletContext物件。

看下ServletConfig中相關的ServletContext程式碼:

 

class ServletConfig{      //ServletConfig物件中維護了ServletContext物件的應用
    ServletContext context;
    getInitParameter();
    getInitParameterNames();
    public ServletContext getServletContext(){     //返回一個ServletContext物件
      return contex;
    }
}              

 

在Servet中的init的方法例項化一個ServletConfig

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);
}

[ 注意 ]

this.ServletConfig.getServletContext():通過ServletConfig物件來獲取ServletContext物件。

ServletContext物件:啟動時建立

ServletConfig物件:呼叫init方法之前建立的,在ServletContext物件之前。

 

【在Servlet中得到ServletContext的兩種方式】

 

 

 

【ServletContext的5大作用】

1.獲取web的上下文路徑

  String getContextPath();

2.獲取全域性的引數

  String getInitParameter(String name);

  Enumeration getInitParameterNames();

3.和域物件相關的

  void setAttribute(String name,Onject object);

  Object getAttribute(String name);

  void removeAttribute(String name);

  域物件(域物件就是在不同資源之前來共享資料,儲存資料,獲取資料)

  ServletContext是我們學習的第一個域物件(Servlet共有三個域物件ServletContext、HttpServletRequest、HttpSession)

4. 請求轉發的

  RequestDispatcher getRequestDispatcher(String path);

  在Servlet跳轉頁面:

  4.1請求重定向(你找我借錢,我沒有,你自己去找他借錢)

    1.位址列會改變,變成重定向到的地址

    2.可以跳轉到專案內的資源,也可以跳轉專案外的資源

    3.瀏覽器向伺服器發出兩次請求,那麼不能使用請求來作為域物件來共享資料。

  4.2請求轉發(你找我借錢,我沒有,我幫你去向他借錢)

    1.位址列不會改變

    2.只能跳轉到專案內的資源,不能跳轉專案外的資源。

    3.瀏覽器向伺服器發出一次請求,那麼可以使用請求作為域物件共享資料。

5.讀取web專案的資原始檔

  String getRealPath(String path);

  InputStream getResourceAsStream(String path);

  URL getResource(String path);

 

【利用ServletContext物件來收發資料(Servlet3.0新特性)】

利用ServletContext實現SendServlet和ReceiveServlet之間的資料共享

【SendServlet.java 發資料】

package com.Higgin.context;

import java.io.IOException;
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("/SendServlet")
public class SendServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data="Higgin";
        this.getServletContext().setAttribute("data", data);
        System.out.println("SendServlet傳送的資料為:"+data);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    }

}

 

【ReceiveServlet.java 收資料】

package com.Higgin.context;

import java.io.IOException;
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("/ReceiveServlet")
public class ReceiveServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data=(String) this.getServletContext().getAttribute("data");
        System.out.println("ReceiveServlet接收到的資料:"+data);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 

[ 傳送和接收資料(使用不同的瀏覽器,應用場景:聊天室) ]

 

 

【通過ServletContext讀取資原始檔db.properties】

【工程截圖】

[ db.properties ]

url=jdbc:mysql://localhost:3306/test
username=root
password=123456

[ ServletDemo00.java ]

 

package com.Higgin.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

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("/ServletDemo00")
public class ServletDemo00 extends HttpServlet {
       
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        
        InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties props=new Properties();  
        props.load(in);

        String url=props.getProperty("url");
        String username=props.getProperty("username");
        String password=props.getProperty("password");
        
        System.out.println("url=="+url);
        System.out.println("username=="+username);
        System.out.println("password=="+password);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

}

[ 執行結果 ]

相關文章