0、Servlet基本概念
Servlet是sun提供的一種動態(tài)web資源開發(fā)技術(shù)。本質(zhì)上就是一段java小程序,可以將Servlet加入到Servlet容器中運行。
- Servlet容器:能夠運行Servlet的環(huán)境就叫做Servlet容器. 比如——tomcat
- Web容器:能夠運行web應(yīng)用的環(huán)境就叫做web容器 比如——tomcat
Servlet的基本運行方式:
Servlet沒有main()方法。它們受控于另一個Java應(yīng)用(例如Tomcat),這個Java應(yīng)用稱為Sevlet容器,Tomcat就是這樣一個容器。通常我們把Tomcat也叫做Servlet容器。
圖示
Servlet是一個java小程序,需要放在Servlet容器(即 Tomcat中)中才能被正確運行?。?!
1、創(chuàng)建一個Servlet
第一步、繼承Servlet接口
如下為創(chuàng)建servlet的簡單步驟:

注意servlet是一個java接口,所以是寫在src資源文件夾下的:

注意這里在src文件下要先創(chuàng)建一個包
創(chuàng)建完包之后再創(chuàng)建一個java類,在創(chuàng)建頁面中選擇繼承自servlet接口,



- 其中service(···)是最關(guān)鍵的方法,在里面寫服務(wù)器要處理的邏輯
第二步、配置web.xml

在項目文件中找到web.xml的路徑,在里面進(jìn)行如下配置:
映射Servlet:
先映射Servlet
- 這一步就是相當(dāng)于把第一步繼承接口的類的信息告訴這個配置文件web.xml
綁定路徑:
綁定路徑
第三步、測試

注意這里最后是"/demo",即我們在綁定路徑的時候?qū)懙模?br>

然后每一次我們訪問這個地址,都會執(zhí)行一次我們繼承的service(···)方法
運行邏輯分析:
在背后的運行邏輯:進(jìn)入這個頁面之后,先去web.xml的綁定路徑配置中找有沒有"/demo"這個路徑,有,然后找跟綁定路徑中的servlet-name標(biāo)簽相同值的映射Servlet步驟中出現(xiàn)的servlet-name,然后再找到我們實現(xiàn)Servlet接口的類,然后再執(zhí)行service(···)方法。
這整個過程訪問的是servlet!!
2、Servlet背后原理分析

如上是我們訪問Servlet的結(jié)果
1、快速創(chuàng)建Servlet
我們可以在項目文件的src下直接創(chuàng)建繼承HttpServlet的Servlet
- Tip:
HttpServlet相當(dāng)于是實現(xiàn)了一些基本操作的Servlet的實現(xiàn)類,我們在它基礎(chǔ)上進(jìn)行開發(fā)更加方便


- 注意這里創(chuàng)建頁面2中他是可以直接對
url-mappings進(jìn)行配置的,免去了我們手動配置web.xml的麻煩

這里可以把繼承自父類的創(chuàng)建方法前面的勾去掉,這里最重要的兩個方法就是
doPost()和doGet(),這兩個方法實際調(diào)用的實際上也是Servlet的service()方法
- 前端向后臺發(fā)送請求,最重要的兩個方式就是Post和Get方法
這里創(chuàng)建成功之后,就會自動在WEB-INF下的web.xml中寫入配置信息(如果之前自己在web.xml中手動配置過,新的配置信息是不會覆蓋原來的配置信息系的)
2、Servlet接口與GenericServlet抽象類、HttpServlet抽象類之間的關(guān)系
Servlet接口介紹:
接口提供的5個抽象方法
生命周期:
-
init(···):在Servlet第一次執(zhí)行時(服務(wù)器被開啟不會執(zhí)行Servlet!只有訪問準(zhǔn)確路徑才會)會被服務(wù)器調(diào)用 -
service(···):在Servlet每一次執(zhí)行時都會被服務(wù)器調(diào)用 -
destroy(···):在服務(wù)器被正常關(guān)閉時或者項目被移除的時候被服務(wù)器調(diào)用 - 總結(jié):Servlet是單實例對象,多線程(每一次訪問都會新出一個線程(不是實例)然后執(zhí)行
service())
描述
如下是GenericServlet抽象類、HttpServlet抽象類與Servlet接口的簡單描述:

-
GenericServlet抽象類實現(xiàn)了Servlet接口,HttpServlet抽象類繼承自GenericServlet抽象類
關(guān)系
Tip:
關(guān)于url-pattern的配置
這里在url-pattern中的值使用通配符是為了支持更多的路徑,也就是說用戶在瀏覽器地址欄中輸入多種不同的路徑,只要滿足這個通配符格式,那么執(zhí)行的就是同一個Servlet程序
3、load-on-startup的配置
這個也是在web.xml中進(jìn)行配置,主要作用是在服務(wù)器啟動的時候就可以讓servlet啟動(正常情況是訪問對應(yīng)對應(yīng)路徑的時候才會啟動servlet)


這里給值為正整數(shù)時(數(shù)字越小,優(yōu)先級越高),當(dāng)服務(wù)器啟動的時候就會被自動啟動
-
關(guān)于路徑:在web項目中引用其他文件的時候(比如css文件),這個時候最好使用絕對路徑(這個絕對路徑不是說從C盤根目錄開始寫,而是從路徑
這個項目名day09的根目錄開始寫),這樣我們在移動這個寫代碼的文件的時候,不會因為改了路徑而找不到引用的文件。
4、ServletConfig
- 作用:作用
轉(zhuǎn)自:https://www.cnblogs.com/smyhvae/p/4140877.html
ServletConfig:代表當(dāng)前Servlet在web.xml中的配置信息
-
String getServletName():獲取當(dāng)前Servlet在web.xml中配置的名字 -
String getInitParameter(String name):獲取當(dāng)前Servlet指定名稱的初始化參數(shù)的值 -
Enumeration getInitParameterNames():獲取當(dāng)前Servlet所有初始化參數(shù)的名字組成的枚舉,是名字<param-name>,不是值<param-value> -
ServletContext getServletContext():獲取代表當(dāng)前web應(yīng)用的ServletContext對象
在Servlet的配置文件中,可以使用一個或多個<init-param>標(biāo)簽為servlet配置一些初始化參數(shù)。
當(dāng)servlet配置了初始化參數(shù)后,web容器在創(chuàng)建servlet實例對象時,會自動將這些初始化參數(shù)封裝到ServletConfig對象中,并在調(diào)用servlet的init()時,將ServletConfig對象傳遞給servlet。進(jìn)而,程序員通過ServletConfig對象就可以得到當(dāng)前servlet的初始化參數(shù)信息。
這樣做的好處是:可以將數(shù)據(jù)庫信息、編碼方式等配置信息放在web.xml中,如果以后數(shù)據(jù)庫的用戶名、密碼改變了,則直接很方便地修改web.xml就行了,避免了直接修改源代碼的麻煩(不用修改源碼的話,不需要重新編譯)。
- 代碼舉例:
新建一個名為ServletConfigTest的Servlet,然后在web.xml中的<servlet>標(biāo)簽下,通過<init-param>標(biāo)簽為這個servlet配置兩個初始化參數(shù)(注意,一個<init-param>標(biāo)簽代表一個參數(shù)):
<servlet>
<servlet-name>ServletConfigTest</servlet-name>
<servlet-class>com.vae.servlet.ServletConfigTest</servlet-class>
<init-param>
<param-name>name1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
然后在代碼中獲取上面的兩個參數(shù)。代碼實現(xiàn)如下:
public class ServletConfigTest extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletConfig config = this.getServletConfig(); //拿到init方法中的ServletConfig對象
// --獲取當(dāng)前Servlet 在web.xml中配置的名稱(用的不多)
String sName = config.getServletName();
System.out.println("當(dāng)前Servlet 在web.xml中配置的名稱:"+sName);
// --獲取當(dāng)前Servlet中配置的初始化參數(shù)(只能獲取一個)經(jīng)常用到
// String value = config.getInitParameter("name2");
// System.out.println(value);
// --獲取當(dāng)前Servlet中配置的初始化參數(shù)(全部獲取)經(jīng)常用到
Enumeration enumration = config.getInitParameterNames();
while(enumration.hasMoreElements()){
String name = (String) enumration.nextElement();
String value = config.getInitParameter(name);
System.out.println(name+":"+value);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
核心代碼是第17行,通過this.getServletConfig()方法拿到init方法中的ServletConfig對象,然后獲取配置信息。
運行程序,后臺打印日志如下:

5、ServletContext
講完ServletConfig,我們接著看ServletContext,ServletContext代表當(dāng)前web應(yīng)用。
WEB容器在啟動時,它會為每個WEB應(yīng)用程序都創(chuàng)建一個對應(yīng)的ServletContext對象,它代表當(dāng)前web應(yīng)用。
通過this.getServletContext();可以直接獲得ServletContext對象
- 一個WEB應(yīng)用中的所有Servlet共享同一個ServletContext對象
- ServletContext對象的作用:Servlet對象之間可以通過ServletContext對象來實現(xiàn)相互之間的通訊。
- ServletContext對象通常也被稱之為context域?qū)ο?/em>。
下面開始正式講ServletContext的應(yīng)用:
應(yīng)用一:在整個web應(yīng)用中共享數(shù)據(jù)
- 作用范圍:整個web應(yīng)用范圍內(nèi)共享數(shù)據(jù)
- 生命周期:當(dāng)服務(wù)器啟動web應(yīng)用加載后創(chuàng)建出ServletContext對象后,域產(chǎn)生。當(dāng)web應(yīng)用被移除出容器或服務(wù)器關(guān)閉,隨著web應(yīng)用的銷毀域銷毀。
代碼舉例 ServletTest01.java:
public class ServletTest01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.setAttribute("name", "smyhvae");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ServletTest02.java:
public class ServletTest02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
String myName = (String) context.getAttribute("name");
System.out.println(myName);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ServlryContext中常用的方法有:
void setAttribute(String,Object);Object getAttribute(String);void removeAttribute(String);
應(yīng)用二:獲取WEB應(yīng)用的初始化參數(shù)
我們使用<init-param>標(biāo)簽來給一個servlet設(shè)置初始化配置信息的時候,注意這個配置信息是只對這個servlet生效的(這個<init-param>標(biāo)簽也是被包在某一個<servlet>標(biāo)簽中的),這里的參數(shù)的獲取和ServletConfig的使用幾乎相同,代碼如下:
<servlet>
<servlet-name>ServletConfigTest</servlet-name>
<servlet-class>com.vae.servlet.ServletConfigTest</servlet-class>
<init-param>
<param-name>name1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
這時如果我們使用<context-param>標(biāo)簽(與Servlet標(biāo)簽并列)為整個Web應(yīng)用配置屬性的話,那所有的Servlet就都能訪問里面的參數(shù)了。
示例:在web.xml中加入初始化配置信息:

在代碼中獲?。?p>
public class ServletTest03 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext(); // 得到上下文對象
// 獲取單個的Context里面的初始化參數(shù)
String value1 = context.getInitParameter("username");
String value2 = context.getInitParameter("password");
System.out.println(value1 + ";" + value2);
System.out.println();
// 一次性獲取Context里所有的初始化參數(shù)
Enumeration enumeration = context.getInitParameterNames();
while (enumeration.hasMoreElements()) {
String name = (String) enumeration.nextElement();
String value = context.getInitParameter(name);
System.out.println(name + ";" + value);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
通過context.getInitParameter()方法獲得初始化參數(shù)。

- 請求參數(shù)
parameter--- 瀏覽器發(fā)送過來的請求中的參數(shù)信息 - 初始化參數(shù)
initparameter--- 在web.xml中為Servlet或ServletContext配置的初始化時帶有的基本參數(shù) - 域?qū)傩?
attribute--- 四大作用域中存取的鍵值對








