JavaWeb學習(06)--Servlet學習筆記

1)Servlet 概念

概念:運行在服務器端的小程序

  • Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則;
  • 將來我們自定義一個類,實現Servlet接口,複寫方法
    在這裏插入圖片描述

2)Servlet 快速入門

  1. 創建JavaEE項目;
  2. 定義一個類,實現Servlet接口:public class ServletDemo1 implements Servlet
  3. 實現接口中的抽象方法;
package cn.itcast.web.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @ClassName ServletDemo1
 * @Description //Servlet入門
 * @Date: 2020/5/4
 * @Version 1.0
 */
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 Servlet");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

  1. 配置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_3_1.xsd"
         version="3.1">

    <!--配置servlet-->
    <servlet>
        <servlet-name>demo</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
    </servlet>
    <!--2、添加ServletMapping-->
    <servlet-mapping>
        <servlet-name>demo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
</web-app>

運行結果:
在這裏插入圖片描述

3)Servlet 執行原理

  1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑;
  2. 查找web.xml文件,是否有對應的標籤體內容;
  3. 如果有,則在找到對應的全類名;
  4. tomcat會將字節碼文件加載進內存,並且創建其對象;
  5. 調用其方法,步驟如下圖所示
    在這裏插入圖片描述

4)Servlet 生命週期方法

Servlet中的生命週期方法

  1. 初始化方法
被創建:執行init方法,只執行一次
		* Servlet什麼時候被創建?
			* 默認情況下,第一次被訪問時,Servlet被創建
			* 可以配置執行Servlet的創建時機。
				* 在<servlet>標籤下配置
    <!--配置servlet-->
    <servlet>
        <servlet-name>demo2</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class>
        <!--指定 servlet 的創建時機
            1.第一次被訪問時,創建,load-on-startup值爲負數
            2.在服務器啓動時,創建,load-on-startup值爲0或正整數
        -->
        <load-on-startup>5</load-on-startup>
    </servlet>

* Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
			* 多個用戶同時訪問時,可能存在線程安全問題。
			* 解決:儘量不要在Servlet中定義成員變量。即使定義了成員變量,也不要修改其值
  1. 提供服務方法
提供服務:執行service方法,執行多次
		* 每次訪問Servlet時,Service方法都會被調用一次。
  1. 被銷燬方法
被銷燬:執行destroy方法,只執行一次
		* Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
		* 只有服務器正常關閉時,纔會執行destroy方法。
		* destroy方法在Servlet被銷燬之前執行,一般用於釋放資源
  1. 代碼測試
package cn.itcast.web.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @ClassName ServletDemo1
 * @Description //Servlet入門
 * @Date: 2020/5/4
 * @Version 1.0
 */
public class ServletDemo2 implements Servlet {

/*
 * @Description //初始化方法,在Servlet被創建時執行,只會執行一次
 * @Date 14:50 2020/5/4
 * @Param
 * @return
 **/
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init 。。。。。。。。。。。。");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /*
     * @Description //提供服務的方法,在每一次Servlet被訪問時執行,執行多次
     * @Date 14:50 2020/5/4
     * @Param
     * @return
     **/
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service 。。。。。。。。。。。。");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    /*
     * @Description //銷燬服務的方法,在服務器正常關閉時執行,執行一次
     * @Date 14:50 2020/5/4
     * @Param
     * @return
     **/
    @Override
    public void destroy() {
        System.out.println("destroy 。。。。。。。。。。。。");
    }
}

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_3_1.xsd"
         version="3.1">
    <!--配置servlet-->
    <servlet>
        <servlet-name>demo2</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class>
        <!--指定 servlet 的創建時機
            1.第一次被訪問時,創建,load-on-startup值爲負數
            2.在服務器啓動時,創建,load-on-startup值爲0或正整數
        -->
        <load-on-startup>5</load-on-startup>
    </servlet>
    <!--2、添加ServletMapping-->
    <servlet-mapping>
        <servlet-name>demo2</servlet-name>
        <url-pattern>/demo2</url-pattern>
    </servlet-mapping>
</web-app>

輸出:【請求一次】—【init 和 service 方法均調用】
在這裏插入圖片描述
【請求兩次】—【service 方法調用】
在這裏插入圖片描述
【關閉服務】—【destroy 方法調用】
在這裏插入圖片描述

5)Servlet3.0 註解配置

  1. Servlet3.0優勢:支持註解配置;可以不再需要web.xml;
  2. 步驟:
    2.1 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml;
    2.2 定義一個類,實現Servlet接口;
    2.3 複寫方法;
    2.4 在類上使用@WebServlet註解,進行配置;【@WebServlet(“資源路徑”)】
    代碼如下:
package cn.itcast.web.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * @ClassName ServletDemo
 * @Description //註解方式替代Web.xml
 * @Date: 2020/5/4
 * @Version 1.0
 */
//@WebServlet(urlPatterns = "/demo")
@WebServlet("/demo")
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("Servlet 3.0 。。。。。。。。。。。。。。。。。。。。。");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

6)Servlet的體系結構

  1. 體系結構如下:
    Servlet – 接口
    |
    GenericServlet – 抽象類
    |
    HttpServlet – 抽象類
  2. GenericServlet
    GenericServlet:將Servlet接口中其他的方法做了默認空實現,只將service()方法作爲抽象
    將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可
  3. GenericServlet 代碼實現【一般不使用】
package cn.itcast.web.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * @ClassName ServletDemo
 * @Description 不繼承Servlet,擴展GenericServlet
 * @Date: 2020/5/4
 * @Version 1.0
 */
@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("GenericServlet 。。。。。。。。。。。。。。。。。。。。。");
    }

}
  1. HttpServlet 【使用多】
    HttpServlet:對http協議的一種封裝,簡化操作
    1. 定義類繼承HttpServlet
    2. 複寫doGet/doPost方法
    HttpServlet 將 下圖的步驟進行封裝:
    在這裏插入圖片描述
  2. HttpServlet 代碼實現【使用多,推薦】
package cn.itcast.web.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @ClassName ServletDemo
 * @Description 不繼承Servlet,HttpServlet
 * @Date: 2020/5/4
 * @Version 1.0
 */
@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 。。。。。。。。。。。。。。。。。。。。。");
    }
}

輸出:
在這裏插入圖片描述

7)Servlet的相關配置

  1. 一個Servlet可以定義多個訪問路徑
    例如:@WebServlet({"/demo4","/demo04","/demo004"})

  2. 路徑定義規則:
    2.1 /xxx:路徑匹配 — @WebServlet("/demo4")

    2.2 /xxx/xxx:多層路徑,目錄結構 — @WebServlet("/user/demo4") @WebServlet("/user/*")

    2.3 .do:擴展名匹配 — @WebServlet(“* .do”)

————————————————————————————————————————————
內容來源:《學習傳智播客的課程《JavaWeb+黑馬旅遊網》》

關注公衆號,回覆 【算法】,獲取高清算法書!
在這裏插入圖片描述

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