什麼是 Servlet?
-
其實就是一個 Java 程序,運行在我們的 Web 服務器上,用於接收和響應客戶端的 HTTP 請求。
-
更多的是配合動態資源來做。 當然靜態資源也需要使用到 Servlet,只不過是Tomcat裏面已經定義好了一個 DefaultServlet。
Servlet 的執行過程
第一步:類的定義
package com.huang.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
*@author 黃遠志
*@date 2019年7月4日下午7:08:19
*@GitHub https://github.com/huangyuanzhi1997
*/
public class HelloServlet implements Servlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("HelloServlet");
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
}
}
第二步:Servlet 的配置
<!-- 向tomcat報告, 我這個應用裏面有這個servlet,名字叫做HelloServlet , 具體的路徑是com.huang.servlet.HelloServlet -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.huang.servlet.HelloServlet</servlet-class>
</servlet>
<!-- 註冊servlet的映射。 servletName : 找到上面註冊的具體servlet,url-pattern: 在地址欄上的path一定要以/打頭 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
執行過程:
- 找到 Tomcat 應用
- 找到項目
- 找 web.xml,然後在裏面找到 url-pattern,有沒有哪一個 patten 的內容是 /a
- 找到第二步 servlet-mapping 中的那個 servlet-name(HelloServlet)
- 找到第二步上面定義的 servlet 元素中的 servlet-name(HelloServlet)
- 找到第二步下面定義的 servlet-class,然後開始創建該類的實例
- 繼而執行該 servlet 中的 service 方法
Servlet 的通用寫法:
Servlet (接口)
|
|
GenericServlet
|
|
HttpServlet (用於處理http的請求)
定義一個類,繼承 HttpServlet 複寫 doGet 和 doPost
package com.huang.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*@author 黃遠志
*@date 2019年7月4日下午7:51:01
*@GitHub https://github.com/huangyuanzhi1997
*/
public class HelloServlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet02...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
System.out.println("get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
System.out.println("post...");
}
}
Servlet 的生命週期
生命週期
從創建到銷燬的一段時間。
生命週期方法
從創建到銷燬,所調用的方法。
- init 方法
在創建該 Servlet 的實例時,就執行該方法。一個 Servlet 只會初始化一次, init 方法只會執行一次。
默認情況下是 : 初次訪問該 Servlet,纔會創建實例。 - service 方法
只要客戶端來了一個請求,那麼就執行這個方法。該方法可以被執行很多次。 一次請求,對應一次 service 方法的調用。 - destroy 方法
servlet 銷燬的時候,就會執行該方法。
(1). 該項目從 Tomcat 的裏面移除。
(2). 正常關閉 Tomcat 就會執行 shutdown.bat。
doGet 和 doPost 不算生命週期方法,所謂的生命週期方法是指,從對象的創建到銷燬一定會執行的方法, 但是這兩個方法,不一定會執行。
讓 Servlet 創建實例的時機提前
- 默認情況下,只有在初次訪問 Servlet 的時候,纔會執行 init 方法。 有的時候,我們可能需要在這個方法裏面執行一些初始化工作,甚至是做一些比較耗時的邏輯。
- 那麼這個時候,初次訪問,可能會在 init 方法中逗留太久的時間。 那麼有沒有方法可以讓這個初始化的時機提前一點。
- 在配置的時候, 使用 load-on-startup 元素來指定, 給定的數字越小,啓動的時機就越早。 一般不寫負數, 從 2 開始即可。
<servlet>
<servlet-name>HelloServlet04</servlet-name>
<servlet-class>com.itheima.servlet.HelloServlet04</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
什麼是 ServletConfig
Servlet 的配置,通過這個對象,可以獲取 Servlet 在配置的時候一些信息
- 未來我們自己開發的一些應用,使用到了一些技術,或者一些代碼,我們不會。 但是有人寫出來了。它的代碼放置在了自己的 Servlet 類裏面。
- 剛好這個 Servlet 裏面需要一個數字或者叫做變量值。 但是這個值不能是固定了。 所以要求使用到這個 Servlet 的公司,在註冊 Servlet 的時候,必須要在 web.xml 裏面,聲明 init-params。