JavaWeb——一文帶你入門Servlet(生命週期、註解配置方法、IDEA與tomcat的相關配置)

目錄

1、Servlet快速入門

2、Servlet中的生命週期

3、Servlet3.0註解配置

4、IDEA與tomcat的相關配置

5、Servlet的體系結構


Servlet在JavaWeb中非常重要,在JavaWeb的核心知識體系都是圍繞Servlet來轉的。

1、Servlet快速入門

Servlet:Server applet,是運行在服務器端的小程序,Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。需要我們自定義一個類,實現Servlet接口,覆寫方法。

快速入門步驟:

  • 1)創建JavaEE項目;
  • 2)定義一個類,實現Servlet的接口;
          public class ServletDemo1 implements Servlet
  • 3)覆寫接口中的抽象方法;
    //提供服務的方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet");
    }
  • 4)配置Servlet(web.xml中 根標籤內)
    <!--  配置Servlet  -->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>cn.test.web.servlet.ServletDemo1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

【實現效果】:運行程序,在瀏覽器中輸入:http://localhost:8080/demo1,在IDEA後臺可見輸出信息

補充下,如果我們的項目比較多時,爲了便於管理,最好是加上虛擬目錄,以項目名稱命名,在IEDA:RUN-》Edit Configurations中設置:

此時瀏覽器訪問爲:

以上就是Servlet的快速入門實踐,那麼Servlet的執行原理是怎樣的呢?

  • 1)當服務器接收到瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑;
  • 2)查找web.xml文件,是否有對應得<url-pattern>標籤體內容;
  • 3)若有,則在找到對應的<servlet-class>全類名;
  • 4)tomcat會將字節碼文件加載進內存,並且創建其對象;
  • 5)調用其方法。

2、Servlet中的生命週期

1)被創建:執行init方法,只執行一次

 Servlet什麼時候被創建?默認情況下,第一次被訪問時被創建,我們可以在web.xml文檔中<servlet>標籤下配置Servlet的創建時機:

  • 第一次被訪問時創建,<load-on-startup>值爲負數(默認爲-1)
  • 在服務器啓動時創建,<load-on-startup>值爲0或正整數

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

2)提供服務:執行service方法,執行多次

每次訪問Servlet時,service方法都會被調用一次。

3)被銷燬:執行destroy方法,只執行一次

服務器關閉時,Servlet被銷燬,注意,是需要服務器正常關閉時,纔會執行destroy方法,該方法在Servlet被銷燬之前之前,一般用於釋放資源。

3、Servlet3.0註解配置

上面我們都是使用web.xml進行Servlet的配置,若一個項目中有很多個Servlet,我們就要在web.xml中針對每一個進行配置,很繁瑣。那麼有沒有更好的配置方法呢?使用Servlet3.0,其好處是支持註解配置,可以不使用web.xml了。步驟:

  • 1)創建JavaEE項目,選擇Servlet的版本爲3.0以上,可以不創建web.xml;
  • 2)定義一個類,實現Servlet接口;
  • 3)覆寫方法;
  • 4)在類上使用@WebServlet註解,進行配置; 
        @WebServlet("/資源路徑")    

public @interface WebServlet {
    java.lang.String name() default "";

    java.lang.String[] value() default {};

    java.lang.String[] urlPatterns() default {};

    int loadOnStartup() default -1;

    javax.servlet.annotation.WebInitParam[] initParams() default {};

    boolean asyncSupported() default false;

    java.lang.String smallIcon() default "";

    java.lang.String largeIcon() default "";

    java.lang.String description() default "";

    java.lang.String displayName() default "";
}

【注意】urlparttrn定義Servlet的訪問路徑:

  • 一個Servlet可以定義多個訪問路徑:@WebServlet({"/d4","/demo4"})
  • 路徑定義規則:
           /xxx:
           /xxx/xxx:多層路徑,目錄結構,eg:@WebServlet("/user/demo4")、@WebServlet("/user/*")
           *.do:@WebServlet("*.do")

4、IDEA與tomcat的相關配置

1)IDEA會爲每一個tomcat部署的項目單獨建立一份配置文件;

查看控制檯的log:

Using CATALINA_BASE:   "C:\Users\think\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Tomcat_8_5_31_4_servlet"

2)工作空間項目和tomcat部署的web項目

  • tomcat真正訪問的是“tomcat部署的web項目”,“tomcat部署的web項目”對應着“工作空間項目”的web目錄下的所有資源;
  • WEB-INF目錄下的資源不能被瀏覽器直接訪問;
  • 斷電調試:使用“小蟲子”debug啓動。

5、Servlet的體系結構

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

以上就是Servlet的繼承結構,在前幾節中,我們都是實現Servlet接口,不得不覆寫Servlet接口的所有抽象方法,實際我們需要用的方法可能只有Service(),那麼如何才能簡化這種寫法呢?

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

@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("demo2....");
    }

}

2)HttpServlet:對http協議的封裝,可以簡化操作,使用步驟如下,我們一般處理http請求時都是使用此方法:

  •     定義類繼承HttpServlet;
  •     覆寫doGet或doPost方法;
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost....");

    }
}

 

本文爲博主原創文章,轉載請註明出處!

若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!

祝君升職加薪,鵬程萬里!

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