文章目錄
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中的數據就可以共享。