概念
Servlet是基于Java技術(shù)的Web組件脂新,由容器管理并產(chǎn)生動態(tài)的內(nèi)容。Servlet引擎作為WEB服務(wù)器的擴展提供支持Servlet的功能。Servlet與客戶端通過Servlet容器實現(xiàn)的請求/響應(yīng)模型進行交互。
也就是運行在服務(wù)器端的小程序。
注意:Servlet不是從命令行啟動的奠伪,而是由包含Java虛擬機的Web服務(wù)器進行加載
執(zhí)行的原理
- 當(dāng)服務(wù)器接受到客戶端游覽器的請求后,會解析請求URL路徑首懈,獲取訪問的Servlet資源路徑绊率。
- 查找web.xml文件,是否有對應(yīng)的<url-parrern>標(biāo)簽體內(nèi)容
- 如果有究履,則在找到對應(yīng)的 <Servlet-class>全類名
- tomcat會將字節(jié)碼文件加載進內(nèi)存滤否,并且創(chuàng)建其對象
- 調(diào)用其方法
Servlet的生命周期
- 被創(chuàng)建時:執(zhí)行init方法,只執(zhí)行一次
- Servlet什么時候被創(chuàng)建最仑?
- 默認情況下藐俺,第一次被訪問時,Servlet被創(chuàng)建
- 可以配置執(zhí)行Servlet的創(chuàng)建時機
- 在<servlet>標(biāo)簽下創(chuàng)建
- 第一次被訪問時創(chuàng)建:<load-on-startup>的值為負數(shù)
- 在服務(wù)器啟動時創(chuàng)建:<load-on-startup>的值為0或者為正整數(shù)
- 在<servlet>標(biāo)簽下創(chuàng)建
- Servlet的init方法泥彤,只執(zhí)行一次欲芹,說明一個 Servlet在內(nèi)存中只存在一個對象, Servlet是單列的
- 多個用戶同時訪問時吟吝,可能存在線程安全問題
- 解決:盡量不要在 Servlet中定義成員變量菱父。即使定義了成員變量,也不要修改值
- 提供服務(wù):執(zhí)行Servlet方法剑逃,執(zhí)行多次
- 每次訪問 Servlet時浙宜, Servlet方法都會調(diào)用一次
- 被銷毀:執(zhí)行destory方法,執(zhí)行一次
Servlet被銷毀時執(zhí)行蛹磺,服務(wù)器關(guān)閉時粟瞬, Servlet被銷毀
只有服務(wù)器正常關(guān)閉時,才會執(zhí)行destory方法
-
destory方法在 Servlet被銷毀之前執(zhí)行萤捆,一般用于釋放資源
package cn.itcast.web.servlet; import javax.servlet.*; import java.io.IOException; public class ServletDemo2 implements Servlet { /** * 初始化方法 * 在Servlet被創(chuàng)建時裙品,執(zhí)行乓梨。執(zhí)行一次 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException{ System.out.println("init...."); } @Override public ServletConfig getServletConfig() { return null; } /** * 提供服務(wù)方法 * 每一次Servlet被訪問時,執(zhí)行清酥。執(zhí)行多次。 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("servlet...."); } @Override public String getServletInfo() { return null; } /** * 銷毀方法 * 在服務(wù)器正常關(guān)閉時蕴侣,執(zhí)行焰轻。執(zhí)行一次。 */ @Override public void destroy() { System.out.println("destroy..."); } }
Servlet體系結(jié)構(gòu)
Servlet -- 接口
GeneriServlet -- 抽象類
HttpServlet -- 抽象類
- GeneriServlet:將Servlet接口中其他方法做了默認空現(xiàn)實昆雀,只將Servlet()方法作為抽象
- 將來定義繼承Servlet類時辱志,可以繼承GeneriServlet,實現(xiàn)Servlet()訪問即可
- HttpServlet:對http協(xié)議的一種封裝狞膘,簡化操作
- 定義類繼承HttpServlet
- 復(fù)寫doGet/doPost方法