目錄
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....");
}
}
本文爲博主原創文章,轉載請註明出處!
若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!
祝君升職加薪,鵬程萬里!