Servlet 基本介紹
文章目錄
1. 基本概念
Servlet 是由 server applet 兩個單詞拼接而成,指的是運行在服務器端的小程序,它本質上是一個接口,它定義了 Java 類被瀏覽器訪問到(被tomcat識別到)的規則。使用時需要我們自定義一個類來實現 Servlet 接口,並複寫其中的方法。
這裏提供幾個關於 Servlet 的學習資料或平臺:
2. 快速入門
我這裏演示的開發環境是 IDEA_2019.2.3 和 Tomcat_9.0.26,關於 IDEA 配置 Tomcat 的方法,推薦一篇博文 IDEA 配置 Tomcat ,講的相對詳細。
-
創建 JavaWeb 項目(Web Application)。
-
定義一個類,實現 Servlet 接口,複寫其中方法。
package servlet.demo1;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("項目啓動了!");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello servlet!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("項目關閉了!");
}
}
- 在 web.xml 中配置 Servlet 的資源路徑,後面會介紹註解配置,這裏作爲了解。
<!-- 在web.xml中配置 -->
<!-- 配置servlet-->
<servlet>
<!-- 這裏給模塊命名,與後面的mapping相對應 -->
<servlet-name>demo1</servlet-name>
<!-- 這裏寫全類名 -->
<servlet-class>com.base.servlet.ServletDemo1</servlet-class>
</servlet>
<!--配置路徑-->
<servlet-mapping>
<!-- 這裏的 name 屬性與上面對應 -->
<servlet-name>demo1</servlet-name>
<!-- 這裏是瀏覽器訪問資源的 資源路徑 -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
- 配置 Tomcat 的虛擬路徑
- 啓動Tomcat,到瀏覽器訪問鏈接:http://localhost:8080/Serv/demo1
- 查看看控制檯輸出
3. Servlet 執行原理
- 當服務器接收到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問 Servlet 的 資源路徑。
- 服務器根據獲取到的 資源路徑 去查找 web.xml 文件中的 <url-pattern> 標籤是否有對應的 資源路徑。
- 如果有,則找到對應的 <servlet-class> 全類名。
- Tomcat 將對應類的字節碼文件加載進內存,創建其對象,並調用 service() 方法。
4. Servlet 中的方法
方法名 | 描述 |
---|---|
init() | 初始化方法,在 Servlet 對象被創建時被調用,並且只會調用一次。 |
getServletConfig() | 獲取 ServletConfig 對象,這是 Servlet 的配置對象。 |
service() | 提供服務方法,每次 Servlet 被訪問時,都會被調用。 |
getServletInfo() | 獲取 Servlet 的一些信息,如:版本、作者等信息。 |
destroy() | 銷燬方法,在服務器正常關閉時被調用,並且只會執行一次。 |
關於init()方法:
- 默認情況下,Servlet 第一次被訪問時纔會去創建對象。
- 通過配置可以改變 Servlet 對象的創建時機。具體操作如下:
<!-- 在<servlet>標籤下配置 -->
<!-- 第一次被訪問時創建對象,則設置值爲任意的 負數 即可。 -->
<load-on-startup>-5</load-on-startup>
<!-- 在服務器啓動時創建對象,則設置值爲任意 正數 或 0 即可。-->
<load-on-startup>5</load-on-startup>
-->
5. Servlet 的生命週期
Servlet 中的 init()、service()、destroy() 三個方法可以代表 Servlet 的生命週期。
- 被創建:調用 init() 方法,對象被創建後會調用一次。
- 提供服務:執行service()方法,對象每次被訪問都會執行。
- 被銷燬:執行destroy()方法,服務器正常關閉前會被調用一次。
注意:
Servlet是單例的,多個用戶同時訪問時,可能存在安全問題,所以儘量不在 Servlet 中定義成員變量,可以定義常量用 final 修飾。
6. Servlet 的註解配置
Servlet3.0 後的新特性,可以通過註解的方式配置 Servlet ,不用在 web.xml 中配置。
配置方法:在類上使用@WebServlet("/資源路徑")註解,如下所示:
//@WebServlet(urlPatterns = "/demo2")
//value屬性可以省略屬性名
@WebServlet("/demo2")
public class ServletDemo implements Servlet {
//類方法......
}
注意:
- urlPatterns 是 Servlet 的資源訪問路徑。
- 一個 Servlet 可以有多個資源訪問路徑:@WebServlet({"/demo1","/demo2","/demo3"})。
- 路徑定義規則
- /XXX —— 一層路徑
- /XXX/XXX —— 多層路徑
- *.後綴名 —— *代表任意字符,只要訪問資源路徑的後綴名是提前設定的字符,就可以訪問成功。
7. IDEA 與 Tomcat 的相關細節
- IDEA 會爲每一個Tomcat 部署的項目單獨創建一份配置文件,存儲路徑會在啓動或關閉項目時輸出到控制檯上,如下圖所示。
- 工作空間項目 和 Tomcat部署的 web項目
- 工作空間:項目文件夾
- Tomcat部署的web項目:項目文件夾\out\artifacts\項目名\
- Tomcat真正訪問的是“Tomcat部署的web項目”
- “Tomcat部署的web項目”對應着“工作空間項目”的web目錄下的所有資源。
- WEB-INFO目錄下的資源不能被瀏覽器直接訪問。
8. Servlet 的體系結構
名稱 | 類型 | 描述 |
---|---|---|
Servlet | 接口 | 上面已經介紹過了。 |
GenericServlet | 抽象類 | 繼承Servlet,將Servlet接口中其他的方法做了默認空實現,只將Service做抽象。 |
HttpServlet | 抽象類 | 繼承GenericServlet,是對http協議的一種封裝,簡化操作。 |
注意:
- 用的較多的是 HttpServlet 接口。
- 其中具體的方法,這裏不做介紹了,具體查看文章開頭提供的 API 文檔。
- 實現 HTTPServlet 的類需要重寫 doGet() 和 doPost() 方法。
2019年11月1日19:43:11