Servlet(Server Applet)是 Java Servlet 的簡稱,稱爲小服務程序或服務鏈接器,用 Java 編寫的服務器端程序,具備獨立於平臺和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態 Web 內容。java
狹義的 Servlet 是指 Java 語言實現的一個接口,廣義的 Servlet 是指任何實現了這個 Servlet 接口的類,通常狀況下,能夠將 Servlet 理解爲後者。Servlet 運行於支持 Java 的應用服務器中。web
從原理上講,Servlet 能夠響應任何類型的請求,但絕大多數狀況下 Servlet 只用來擴展基於 HTTP 協議的 Web 服務器。(內容摘自百度百科
)小程序
* 概念:運行在服務器端的小程序 * Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。 * 未來咱們自定義一個類,實現Servlet接口,複寫方法。
建立項目進行代碼演示:
/** * Created by RookieLi on 2019/4/22. */ 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() {} }
在 web.xml 中配置:
<servlet> <servlet-name>demo1</servlet-name> <servlet-class>com.rookie.web.ServletDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo</url-pattern> </servlet-mapping> 當在瀏覽器中輸入路徑:http://localhost:8080/demo 控制檯會輸出:hello,servlet
執行的原理:
A、當服務器接受到客戶端瀏覽器的請求後,會解析請求 URL 路徑,獲取訪問的 Servlet 的資源路徑。 B、查找 web.xml 文件,是否有對應的 <url-pattern> 標籤體內容。 C、若是有,則在找到對應的 <servlet-class> 全類名 D、tomcat會將字節碼文件加載進內存,而且建立其對象 E、調用其 service 方法
Servlet中的生命週期方法:
A、被建立:執行init方法,只執行一次 Servlet 什麼時候被建立? * 默認狀況下,第一次被訪問時,Servlet 被建立 * 能夠配置執行 Servlet 的建立時機。 * 在 <servlet> 標籤下配置 a. 第一次被訪問時,建立 * <load-on-startup>的值爲負數 b. 在服務器啓動時,建立 * <load-on-startup>的值爲0或正整數 * Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的。 * 多個用戶同時訪問時,可能存在線程安全問題。 * 解決:儘可能不要在Servlet中定義成員變量。即便定義了成員變量,也不要對修改值。 B、提供服務:執行service方法,執行屢次 * 每次訪問Servlet時,Service方法都會被調用一次。 C、被銷燬:執行destroy方法,只執行一次 * Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬。 * 只有服務器正常關閉時,纔會執行destroy方法。 * destroy方法在Servlet被銷燬以前執行,通常用於釋放資源。
Servlet 3.0 (重點)
優勢:支持註解配置。能夠不須要 web.xml 了。
代碼演示
@WebServlet("/demo666") public class ServletDemo2 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("servlet 3.0 給力 666"); } @Override public String getServletInfo() { return null; } @Override public void destroy() {} } 當在瀏覽器中輸入路徑:http://localhost:8080/demo666 控制檯會輸出:servlet 3.0 給力 666
@WebServlet 源碼剖析
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebServlet { String name() default ""; //至關於<Servlet-name> String[] value() default {}; //表明urlPatterns()屬性配置 String[] urlPatterns() default {}; //至關於<url-pattern> int loadOnStartup() default -1; //至關於<load-on-startup> WebInitParam[] initParams() default {}; boolean asyncSupported() default false; String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default ""; }
Servlet 的體系結構
Servlet -- 接口 | GenericServlet -- 抽象類 | HttpServlet -- 抽象類 A、GenericServlet:將 Servlet 接口中其餘的方法作了默認空實現,只將 service() 方法做爲抽象 * 未來定義 Servlet 類時,能夠繼承 GenericServlet ,實現 service() 方法便可 B、HttpServlet:對 http 協議的一種封裝,簡化操做 * 定義類繼承 HttpServlet * 複寫 doGet/doPost 方法 C、Servlet相關配置 * urlpartten:Servlet訪問路徑 * 一個Servlet能夠定義多個訪問路徑:@WebServlet({"/demo6","/demo66","/demo666"}) 在瀏覽器中輸入不一樣的請求路徑,均可以訪問到資源。 http://localhost:8080/demo6 http://localhost:8080/demo66 http://localhost:8080/demo666 B、路徑定義規則: 1. /xxx:路徑匹配 2. /xxx/xxx:多層路徑,目錄結構 3. *.do:擴展名匹配