- 什么是Servlet?
- 如何使用Servler瘸羡?
- Servlet生命周期
- Servlet方法體系
- Servlet3.0 注解
1. 什么是Servlet漩仙?
- Servlet是JavaEE的一個組件,也是JavaEE的一個規(guī)范
- Servlet程序類必須遵循Servlet的規(guī)范必須實現(xiàn)javax.servlet-Servlet接口
2. 如何使用Servler犹赖?
Servlet 本身不能獨立運行队他,需要在一個web應(yīng)用中運行的,而一個web應(yīng)用是部署在tomcat中的峻村。
所以開發(fā)一個servlet需要如下幾個步驟:
- 創(chuàng)建普通的java類并繼承HTTPServlet
- 覆寫service方法
- 在service方法中書寫邏輯代碼
- 在webapp下的WEB-INF文件夾下的web麸折。xml文件中配置servlet
示例代碼 (前三步)
package servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@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() {
}
}
示例代碼(配置xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
運行項目地址
控制臺打印輸出結(jié)果
解釋:
- 服務(wù)器地址:端口號/webapp下的資源名稱/請求名
- url : http://localhost:8080/虛擬主機(jī)/資源名
-
<servlet>
:要添加的Servlet節(jié)點-
<servlet-name>demo</servlet-name>
:Servlet請求名稱 -
<servlet-class>servlet.ServletDemo</servlet-class>
:請求需要調(diào)用類名(全限定名,就是包名+類名)
-
-
<servlet-mapping>
:Servlet映射-
<servlet-name>demo</servlet-name>
:需要映射的請求名 -
<url-pattern>/demo</url-pattern>
:請求地址
-
3.Servlet 生命周期
- 加載Servlet類粘昨。
- 創(chuàng)建Servlet實例垢啼。調(diào)用Servlet類的
init()
方法。 - 調(diào)用Servlet類的
service()
方法张肾。 - 調(diào)用Servlet類的
destroy()
方法
Servlet 生命周期流程圖
如上圖所顯示芭析,servlet有三種狀態(tài)模式:新建、就緒吞瞪、結(jié)束
- 創(chuàng)建新的Servlet的時候處于新建狀態(tài)馁启。
- 調(diào)用Servlet類的
init()
方法后,Servlet處于就緒狀態(tài)芍秆,在就緒狀態(tài)下Servlet執(zhí)行任務(wù)进统。 - 當(dāng)web容器調(diào)用Servlet類的
destroy()
方法后,Servlet處于結(jié)束狀態(tài)浪听。
分步驟解釋生命周期
3.1 加載Servlet類
- 類加載器負(fù)責(zé)加載servlet類螟碎。
- 默認(rèn)當(dāng)Web容器接收到servlet的第一個請求時,將加載servlet類迹栓。
訪問方式 |
<load-on-startup> 值 |
---|---|
第一次被訪問時創(chuàng)建 | 負(fù)數(shù) |
在服務(wù)器啟動時創(chuàng)建 | 0或正整數(shù) |
3.2 創(chuàng)建Servlet實例
- Web容器在加載servlet類之后創(chuàng)建一個servlet的實例掉分。
- servlet實例在servlet生命周期中只創(chuàng)建一次
3.3 調(diào)用init方法
- Web容器在創(chuàng)建servlet實例后調(diào)用init方法一次。
- init方法用于初始化servlet克伊。
- Servlet的
init()
方法酥郭,只執(zhí)行一次
它是javax.servlet.Servlet接口的生命周期方法。init方法的語法如下:
public void init(ServletConfig config) throws ServletException
3.4 調(diào)用service方法
- 每當(dāng)接收到servlet的請求時愿吹,Web容器都會調(diào)用
service()
方法不从。 - 如果servlet未初始化,則遵循上述前三個步驟犁跪,然后調(diào)用
service()
方法 - 如果servlet被初始化椿息,它調(diào)用
service()
方法歹袁。 - 每次訪問Servlet時,Service方法都會被調(diào)用一次
Servlet接口的service方法的語法如下:
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException
3.5 調(diào)用destroy方法
- 從服務(wù)中刪除servlet實例之前寝优,Web容器調(diào)用
destroy()
方法条舔。 - 它使servlet有機(jī)會清理所有資源,例如內(nèi)存乏矾,線程等孟抗。
Servlet接口的destroy方法的語法如下:
public void destroy()
- servlet僅初始化一次
- Servlet的init方法,只執(zhí)行一次钻心,說明一個Servlet在內(nèi)存中只存在一個對象凄硼,Servlet是單例的
多個用戶同時訪問時,可能存在線程安全問題捷沸。
解決:盡量不要在Servlet中定義成員變量摊沉。即使定義了成員變量,也不要對修改值
4.Servlet體系介紹
- GenericServlet:將Servlet接口中其他的方法做了默認(rèn)空實現(xiàn)亿胸,只將service()方法作為抽象。將來定義Servlet類時预皇,可以繼承GenericServlet侈玄,實現(xiàn)service()方法即可
-
HttpServlet:對http協(xié)議的一種封裝,簡化操作(只使用這個類)
- 定義類繼承HttpServlet
- 復(fù)寫doGet/doPost方法
5.Servlet3.0 注解
- 好處:支持注解配置吟温⌒蛳桑可以不需要web.xml了。
- 操作步驟:
- 創(chuàng)建JavaEE項目鲁豪,選擇Servlet的版本3.0以上潘悼,可以不創(chuàng)建web.xml
- 定義一個類,實現(xiàn)Servlet接口
- 復(fù)寫方法
-
在類上使用@WebServlet注解爬橡,進(jìn)行配置 @WebServlet("資源路徑")