萬事開頭難(二):Servlet

目錄

 

1. Servlet概念相關

2. Servlet的體系結構

3. Servlet快速入門

4. Servlet執行原理

5. Servlet生命週期

6. Servlet3.0,基於註解配置Servlet

7. ServletContext


1. Servlet概念相關

Servlet也就是server applet: 運行在服務器端的小程序
        * Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。
        * 將來我們自定義一個類,實現Servlet接口,複寫方法。這樣,瀏覽器纔可以操作到這個程序

2. Servlet的體系結構

Servlet -- 接口
            |
        GenericServlet -- 抽象類
            |
        HttpServlet  -- 抽象類

        * GenericServlet:將Servlet接口中其他的方法做了默認空實現,只將service()方法作爲抽象
            * 將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可

        * HttpServlet:對http協議的一種封裝,簡化操作
            1. 定義類繼承HttpServlet
            2. 複寫doGet/doPost方法

3. Servlet快速入門

1. 創建一個類實現Servlet接口,並且在web.xml中進行配置

實現javax.servlet.Servlet接口(前面寫過了)

         public class ServletDemo1 implements Servlet

          在web.xml中配置:
            <!--配置Servlet -->
            <servlet>
                <servlet-name>demo1</servlet-name>
                <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>(必須是全類名)
            </servlet>
        
            <servlet-mapping>
                <servlet-name>demo1</servlet-name>
                <url-pattern>/demo1</url-pattern>
            </servlet-mapping>

2. 繼承javax.servet.GenericServlet類(適配器模式)

       

3. 繼承javax.servlet.http.HttpServlet類(模板方法設計模式)

4. Servlet執行原理

  • Servlet作用處理請求
  • 當瀏覽器訪問一個http://localhost:8080/hello/hello 路徑,就向tomcat發送一個請求
  • 執行原理:執行過程
            1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
            2. 查找web.xml文件,是否有對應的<url-pattern>標籤體內容。
            3. 如果有,則在找到對應的<servlet-class>全類名(看到全類名就要想到反射)
            4. tomcat會將字節碼文件加載進內存,並且創建其對象(tomcat將全類名的字節碼加載進內存class.forname---》字節碼類創建對象cls.newInstence---》新建的實例調用方法service---》)
            5. 調用其方法

5. Servlet生命週期

 Servlet中的生命週期方法:
        1. 被創建:執行init方法,只執行一次
            * Servlet什麼時候被創建?
                * 默認情況下,第一次被訪問時,Servlet被創建
                * 可以配置執行Servlet的創建時機。
                    * 在<servlet>標籤下配置
                        1. 第一次被訪問時,創建
                            * <load-on-startup>的值爲負數(說明默認的就是-1)
                        2. 在服務器啓動時,創建
                            * <load-on-startup>的值爲0或正整數


            * Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
                * 多個用戶同時訪問時,可能存在線程安全問題。
                * 解決:儘量不要在Servlet中定義成員變量,可以定義局部變量。即使定義了成員變量,也不要對修改值

        2. 提供服務:執行service方法,執行多次
            * 每次訪問Servlet時,Service方法都會被調用一次。
                * service又可以進化爲doget和dopost
        3. 被銷燬:執行destroy方法,只執行一次
            * Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
            * 只有服務器正常關閉時,纔會執行destroy方法。
            * destroy方法在Servlet被銷燬之前執行,一般用於釋放資源,(注意是釋放資源),init是用來加載資源的

6. Servlet3.0,基於註解配置Servlet

* 好處:
            * 支持註解配置。可以不需要web.xml了。

        * 步驟:
            1. 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml
            2. 定義一個類,實現Servlet接口
            3. 複寫方法
            4. 在類上使用@WebServlet註解,進行配置
                * @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 "";
                }

7. ServletContext

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章