一 Servlet簡介
Servlet是JavaWeb三大組件之一 運行在服務器上的小程序
Servlet是一個接口 定義了Java類被服務器(Tomcat等等)識別的規則
二 新建一個Servlet
2. 自定義一個類 實現Servlet接口
/** * Servlet快速入門 * Created by Hy on 2020/6/29. */ public class ServletDemo1 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 world"); } @Override public String getServletInfo() { return null; } @Override public void destroy() {} }
3. 配置Servlet web.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> <servlet-name>demo1</servlet-name> <servlet-class>com.hy.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping> </web-app>
啟動項目 訪問 http://localhost:8080/demo1
三 Servlet執行原理
瀏覽器輸入地址 -> 找到對應主機對應端口對應項目對應資源名稱 -> 服務器檢索web.xml -> 根據servlet-mapping匹配servlet -> 服務器將全類名對應的字節碼文件加載進內存 創建實例 調用service()
四 Servlet生命周期
/** * Servlet生命周期 * Created by Hy on 2020/6/29. */ public class ServletDemo2 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { // 生命周期方法 創建 // 在Servlet被創建時執行 只會執行一次 System.out.println("init()"); } @Override public ServletConfig getServletConfig() { // 獲取Servlet的配置對象 return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { // 生命周期方法 提供服務 // 每一次Servlet被訪問時執行 執行多次 System.out.println("service()"); } @Override public String getServletInfo() { // 獲取Servlet的一些信息 比如版本 作者等等 return null; } @Override public void destroy() { // 生命周期方法 銷毀 // 在服務器正常關閉時執行 只會執行一次 System.out.println("destroy()"); } }
1. 被創建 執行init() 只會執行一次
Servlet在內存中只存在一個實例 Servlet是單例的
當多個用戶同時訪問時 可能存在線程安全問題 所以盡量不要在Servlet中定義需要修改的成員變量
Servlet默認情況下 第一次被訪問時創建 可以配置Servlet創建時機 web.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>demo2</servlet-name> <servlet-class>com.hy.servlet.ServletDemo2</servlet-class> <!-- 配置Servlet創建時機 1. 第一次被訪問時創建 值為負數 2. 在服務器啟動時創建 值為0或正數 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>demo2</servlet-name> <url-pattern>/demo2</url-pattern> </servlet-mapping> </web-app>
2. 提供服務 執行service() 執行多次
每次訪問Servlet時 service()都會被調用一次
3. 被銷毀 執行destroy() 只會執行一次
Servlet被銷毀前執行 服務器正常關閉時 Servlet被銷毀
五 Servlet3.0注解
使用注解代替web.xml配置
/** * Servlet3.0注解 路徑定義規則 * 1. /xxx 路徑匹配 * 2. /xxx/xxx 多層路徑 目錄結構 * 3. *.do 擴展名匹配 * 注意: *是匹配所有 但是優先級最低 * Created by Hy on 2020/6/29. */ //@WebServlet("/demo3") //路徑匹配 //@WebServlet(urlPatterns = "/demo3", loadOnStartup = 1) //路徑匹配 配置Servlet創建時機 //@WebServlet({"/demo3", "/d3"}) //一個Servlet可以定義多個訪問路徑 @WebServlet({"/demo3", "/d3", "/user/d", "/abc/*", "*.do"}) public class ServletDemo3 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init..."); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service..."); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("destroy..."); } }
六 Servlet體系結構