day11-Servlet01

Servlet01

官方api文檔://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html

image-20221106172747310

Servlet和Tomcat的關係:一句話,Tomcat支持Servlet

Servlet是跟Tomcat關聯在一起的,換而言之,Tomcat是哪個版本,就對應哪個版本的Servlet

1.為什麼需要Servlet?

需求:請用你現有的html,css,javascript,開發網站,比如可以讓用戶留言/購物/支付,你能搞定嗎?

這就需要引入我們的動態網頁(能和用戶交互)技術===>Servlet

我們對之前的JavaWeb技術體系圖進一步地細化:

image-20221106180943642

Tomcat的web服務拿到一個請求後:

  1. 如果web服務發現是該請求是和java相關的,或者說是一個Servlet(動態請求,比如說可能會去操作數據庫),那麼Tomcat會去尋找Servlet,Servlet又去調用java程序,進行數據庫操作

  2. 如果Tomcat的web服務發現請求的是一個靜態資源,比如html,圖片等,就直接拿到該資源,然後返回,不會和java程序或者數據庫發生關係

  3. 因此我們說Tomcat其實是有兩個功能的:一是充當Servlet的容器;二是充當普通的web服務

  4. 只支撐靜態資源返回的還有apache,如果是一個靜態資源的網站,不需要和數據庫進行交互,其實完全可以使用Apache來作為web服務,或者只使用一個Nginx就可以了

2.什麼是Servlet?

  • 什麼是Servlet

    Servlet在開發動態WEB工程中得到了廣泛地應用,掌握好Servlet非常重要,Servlet是SpringMVC的基礎

  • Servlet(java服務器小程序),它的特點有:

    • 它是由服務器調用和執行的

      即由tomcat解析和執行的

    • 它是用java語言編寫的,本質就是Java類

    • 它是按照Servlet規範開發的(接口),Servlet本質就是一套接口規範

      除了Tomcat可以去解析Servlet,weblogic也可以支持 Servlet,即只要按照規範去開發接口,就可以支持Servlet,類似於jdbc的接口規範

    • 功能強大,幾乎完成所有的網站功能

3.Servlet基本使用

3.1Servlet開發方式說明

  1. Servlet3.0前使用web.xml,Servlet3.0版本以後(包括3.0)支持註解,同時支持web.xml配置
  2. 如何查看Servlet版本
  3. Servlet的講解只是為了知道Servlet的使用原理(原生的Servlet在項目中使用很少)
  4. 不管使用哪種方式,本質都一樣

3.2快速入門-手動開發Servlet

例子

需求說明:

  1. 開發一個HelloServlet
  2. 當瀏覽器訪問//localhost:8080/web應用名/helloServlet時,後台輸出「hi HelloServlet」

思路:

  • 編寫類HelloServlet去實現Servlet接口

  • 實現service方法,處理請求,並響應數據

  • 在web.xml中去配置Servlet程序的訪問地址


  1. 首先創建web工程,配置好Tomcat

    image-20221106190623954

  2. 添加servlet-api.jar(在你安裝的tomcat/lib下)到工程,因為servlet.jar不是jdk自帶的,要引入才可以使用

    image-20221106190903796

    在idea項目的web/WEB-INF下創建一個lib目錄,將servlet-api.jar拷貝進去,然後右擊jar包,點擊add as library,在彈出的窗口中點擊ok即可

    image-20221106191137595

  3. 在src包下面創建HelloServlet.java,並實現Servlet接口

    image-20221106193705262

    package com.li.servlet;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    /**
     * 1.開發一個servlet,需要實現Servlet接口
     * 2.實現Servlet接口的方法:一共有5個
     */
    public class HelloServlet implements Servlet {
    
        /**
         * 1.初始化 Servlet
         * 2.當創建HelloServlet實例時,會調用init方法
         * 3.該方法只會被調用一次
         *
         * @param servletConfig
         * @throws ServletException
         */
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("init() 被調用");
        }
    
        /**
         * 返回ServletConfig對象 也就是返回Servlet的配置
         *
         * @return
         */
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        /**
         * 1.service方法處理瀏覽器的請求(包括get/post)
         * 2.當瀏覽器每次請求Servlet時,就會調用一次server方法
         * 3.當Tomcat調用該方法時,會把http請求的數據封裝成 實現了ServletRequest接口 的request對象
         * 4.通過servletRequest對象,就可以得到用戶提交的數據
         * 5.servletResponse對象可以用於返回數據給Tomcat-->瀏覽器
         *
         * @param servletRequest
         * @param servletResponse
         * @throws ServletException
         * @throws IOException
         */
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("hi HelloServlet~");
        }
    
        /**
         * 返回servlet的信息,使用較少
         *
         * @return
         */
        @Override
        public String getServletInfo() {
            return null;
        }
    
        /**
         * 1.該方法是在servlet被銷毀時,被tomcat調用
         * 2.只會調用一次
         */
        @Override
        public void destroy() {
    
        }
    }
    
  4. 實現了接口之後,在web.xml配置HelloServlet,即給HelloServlet提供對外的訪問地址

    目的是為了告訴Tomcat服務器,HelloServlet在哪裡

    image-20221106193830386

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="//xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="//xmlns.jcp.org/xml/ns/javaee //xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <!--web.xml文件主要用來配置該web應用使用到的Servlet-->
        <!--配置HelloServlet-->
        <!--解讀:
                1.servlet-name:給Servlet取名(任意),該名字唯一
                2.servlet-class:Servlet的類的全路徑,Tomcat在反射生成該Servlet類實例時需要使用
                3.servlet-mapping里的servlet-name要和上面的servlet-name保持一致
                4.url-pattern:這個就是該Servlet訪問的url的配置(路徑)
                5.這時我們應該這樣訪問Servlet://localhost:8080/web應用名/helloServlet
                5.url-pattern的取名也是隨意的(注意加上斜杠)
        -->
        <servlet>
            <servlet-name>HelloServlet</servlet-name>
            <servlet-class>com.li.servlet.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>HelloServlet</servlet-name>
            <url-pattern>/helloServlet</url-pattern>
        </servlet-mapping>
    </web-app>
    

    設置 快捷鍵ctrl+/ 可以在當前位置注釋,而不是在行

    image-20221106194525686

  5. 訪問HelloServlet(記得要reploy或者restart)

    可以自己配置快捷鍵啟動

    image-20221106200232181

    瀏覽器訪問:

    image-20221106200859929

    後台輸出:可以看到init方法只調用了一次,而每次訪問都會調用server方法

    image-20221106200941586

4.瀏覽器調用Servlet流程分析

Tags: