Servlet和ServletContext

1. 基本介紹

Servlet是JavaWeb三大組件之一(Servlet、Filter、Listener)

  • Servlet的功能:處理客戶端請求的動態資源
  • Servlet的任務: 獲取請求數據,處理請求,完成響應
  • Servlet的方法:
// 生命週期方法
void init(ServletConfig)  //服務器創建Servlet實例時,根據配置信息完成初始化操作(只執行一次,單例)
void service(ServletRequest,ServletResponse) // 根據請求完成相應(調用N次)
void destory() // 服務器關閉時,用於銷燬Servlet,一般爲空(調用一次)
// 非生命週期方法
ServletConfig getServletConfig() // 獲取ServletConfig對象,其封裝了對應的Servlet在web.xml中的配置信息,可用於初始化
String getServletInfo() // servlet的基本信息,一般不用

2. 實現Servlet

Servlet接口
– GenericServlet是Servlet的抽象實現類,唯一的抽象方法就是service()方法
---- HttpServlet是GenericServlet的子類,它專注HTTP請求

  • (1)實現javax.servlet.Servlet接口
  • (2)繼承javax.servlet.GenericServlet
    – 注意GenericServlet添加了init()方法,init()會被init(ServletConfig)方法調用。此時如果希望對Servlet進行初始化,那麼應該覆蓋init()方法,而不是init(ServletConfig)方法。
@Override
public void init(ServletConfig config) throws ServletException {
     this.config = config;
     this.init();
 }
 public void init() throws ServletException {
     // NOOP by default
 }
  • (3)繼承javax.servlet.http.HttpServlet類(最方便)
    在這裏插入圖片描述

上圖是源碼的原理,所以通過繼承HttpServlet類來自定義Sevlet的話,那麼:

  • 不要去覆蓋void service(ServletRequest,ServletResponse)
  • 不要去覆蓋void service(HttpServletRequest, HttpServletResponse)
  • 而應該去覆蓋doGet()或doPost()方法(未覆蓋顯示405錯誤)。當然必要的時候還包括其他一些方法。

3. Servlet細節

3.1 Servlet與線程安全

我們不應該在Servlet中創建成員變量,因爲可能會存在一個線程對這個成員變量進行寫操作,另一個線程對這個成員變量進行讀操作。
解決方法

  • 不要在Servlet中創建成員!創建局部變量即可!
  • 可以創建無狀態成員!
  • 可以創建有狀態的成員,但狀態必須爲只讀的!

3.2 讓服務器在啓動時就創建Servlet

<servlet>
	<servlet-name>hello1</servlet-name>
	<servlet-class>cn.itcast.servlet.Hello1Servlet</servlet-class>
	<load-on-startup>0</load-on-startup>  <!-- 創建的優先級,越小越優先 -->
</servlet>

3.3 <url-pattern>url路徑設置

可以在中使用通配符,星號“*”可以匹配任何URL路徑的0個或多個任意字符,例如:

<url-pattern>/servlet/*<url-patter>:/servlet/a、/servlet/b,都匹配/servlet/*;
<url-pattern>*.do</url-pattern>:/abc/def/ghi.do、/a.do,都匹配*.do;
<url-pattern>/*<url-pattern>:匹配所有URL;

注意:

  • 通配符不能出現在URL中間位置,也不能只有通配符。
  • 通配符是一種模糊匹配URL的方式,如果存在更具體的,那麼訪問路徑會去匹配具體的。

4. ServletContext

4.1 介紹

ServletContext是Servlet三大域對象之一,在服務器啓動時創建,在服務器關閉時銷燬,一個JavaWeb應用只創建一個ServletContext對象。作用是在整個Web應用的動態資源之間共享數據!

4.2 獲取ServletContext

  • ServletConfig#getServletContext();
  • GenericServlet#getServletContext();
  • HttpSession#getServletContext()
  • ServletContextEvent#getServletContext()

在HttpServlet中可以通過以下方法來獲取ServletContext對象

ServletContext sc = this.getServletContext()
ServletContext sc = this.getServletConfig().getServletContext()

4.3 存取數據

域對象內部有一個Map,用來保存數據。
常見方法:

void setAttribute(String name, Object value):用來添加或替換ServletContext域數據
Object getAttribute(String name):通過名稱來獲取域數據
void removeAttribute(String name):通過名稱移除域數據
Enumeration<String> getAttributeNames():獲取所有ServletContext域數據的名稱
String getInitParameter("paramName"):讀取web.xml中配置的公共應用初始化參數
String getRealPath(String path):獲取資源的真實名稱
InputStream getResourceAsStream(String path):獲取資源的輸入流
Set<String> getResourcePaths(String path):獲取指定目錄下的所有資源路徑

5.Servlet的三大域對象

  • HttpServletRequest:一個請求創建一個request對象,所以在同一個請求中可以共享request;
  • HttpSession:一個會話創建一個HttpSession對象,同一會話中的多個請求中可以共享session中的數據;
  • ServletContext:一個應用只創建一個ServletContext對象,所以在ServletContext中的數據可以在整個應用中共享,只要不啓動服務器,那麼ServletContext中的數據就可以共享。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章