Servlet學習(1)
servlet是什麼?
>其實就是一個java程式,執行在我們的web伺服器上,用於接收和響應客戶端的http請求
>更多的是配合動態資源來做,當然靜態資源也需要使用到servlet,只不過是Tomcat裡面已經定義好了一個DefaultServlet
HelloServelt
1)得寫一個Web工程,要有一個伺服器。
2)測試執行Web工程
>新建一個資料夾,實現一個Servlet介面
>配置Servlet,用意:告訴伺服器,我們這裡有這些servlet
在webContent/WEB-INF/web.xml裡面寫上以下內容
<!-- 向tomcat報告, 我這個應用裡面有這個servlet, 名字叫做HelloServlet , 具體的路徑是com.itheima.servlet.HelloServlet --> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.itheima.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>
>在位址列上輸入http://localhost:8080/專案名稱/a
Servlet執行過程
1)找到tomcat應用
2)找到專案
3)找web.xml,然後在裡面的找到url-pattern,有沒有哪一個pattern的內容是/a
4)找到servlet-mapping中的那個servlet-name中的【HelloServlet】
5)找到上面定義的servlet元素中的servlet-name中的【HelloServlet】
6)找到下面定義的servlet-class然後開始建立該類的例項
7)繼而執行servlet中的service方法
Servlet的通用寫法
Servlet(介面)----------GenericServlet-----------HttpServlet(用於處理http的請求)
定義一個類,繼承HttpServlet複寫doGet和doPost
Servlet的生命週期
生命週期:從建立到銷燬的一段時間
生命週期方法:從建立到銷燬,所呼叫的那些方法
init方法:在建立該servlet的例項時,就執行該方法。一個servlet只會初始化一次,init方法只會執行一次
預設情況下是:初次訪問該servlet,才會建立例項。
service方法:只要客戶端來了一個請求,就會執行該方法。
該方法可以被執行很多次,一次請求,對應一次service方法的呼叫
destroy方法:selvlet銷燬的時候,就會執行該方法
>該專案從tomcat的裡面移除
>正常關閉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在配置的時候的一些資訊
//1. 得到servlet配置物件 專門用於在配置servlet的資訊
ServletConfig config = getServletConfig();
//獲取到的是配置servlet裡面servlet-name 的文字內容
String servletName = config.getServletName();
System.out.println("servletName="+servletName);
//2、。 可以獲取具體的某一個引數。
String address = config.getInitParameter("address");
System.out.println("address="+address);
//3.獲取所有的引數名稱
Enumeration<String> names = config.getInitParameterNames();
//遍歷取出所有的引數名稱
while (names.hasMoreElements()) {
String key = (String) names.nextElement();
String value = config.getInitParameter(key);
System.out.println("key==="+key + " value="+value);
}
為什麼需要有這個ServletConfig?
1)未來我們自己開發的一些應用,使用到了一些技術,或者一些程式碼,我們不會,但有人寫出來了,他的程式碼放置在了自己的servlet類裡面
2)剛好這個servlet裡面需要一個數字或者叫做變數值,但是這個值不能固定的,所以要求上使用到這個servlet的公司,在註冊servlet的時候,必須要在web.xml裡面,宣告init-params