初識tomcat與Servlet

web相關概念


  1. 軟件架構
    1. C/S:客戶端/服務器端
    2. B/S:瀏覽器/服務器端
  2. 資源分類
    1. 靜態資源:全部用戶訪問後,獲得的結果都是同樣的,稱爲靜態資源.靜態資源能夠直接被瀏覽器解析
      • 如: html,css,JavaScript
    2. 動態資源:每一個用戶訪問相同資源後,獲得的結果可能不同。稱爲動態資源。動態資源被訪問後,須要先轉換爲靜態資源,在返回給瀏覽器
      • 如:servlet/jsp,php,asp....

web服務器軟件:


  • 服務器:安裝了服務器軟件的計算機
  • 服務器軟件:接收用戶的請求,處理請求,作出響應
  • web服務器軟件:接收用戶的請求,處理請求,作出響應。
    • 在web服務器軟件中,能夠部署web項目,讓用戶經過瀏覽器來訪問這些項目
    • web容器
  • 常見的java相關的web服務器軟件:
    • webLogic:oracle公司,大型的JavaEE服務器,支持全部的JavaEE規範,收費的。
    • webSphere:IBM公司,大型的JavaEE服務器,支持全部的JavaEE規範,收費的。
    • JBOSS:JBOSS公司的,大型的JavaEE服務器,支持全部的JavaEE規範,收費的。
    • Tomcat:Apache基金組織,中小型的JavaEE服務器,僅僅支持少許的JavaEE規範servlet/jsp。開源的,免費的。
  • JavaEE:Java語言在企業級開發中使用的技術規範的總和,一共規定13項大的規範
  • Tomcat:web服務器軟件
    1. 下載:http://tomcat.apache.org/
    2. 安裝:解壓壓縮包便可。
      • 注意:安裝目錄建議不要有中文和空格
    3. 卸載:刪除目錄就好了
    4. 啓動:
      • bin/startup.bat ,雙擊運行該文件便可
      • 訪問:瀏覽器輸入:http://localhost:8080 回車訪問本身
        http://別人的ip:8080 訪問別人php

      • 可能遇到的問題:
        1. 黑窗口一閃而過:
          • 緣由: 沒有正確配置JAVA_HOME環境變量
          • 解決方案:正確配置JAVA_HOME環境變量
        2. 啓動報錯:
          1. 暴力:找到佔用的端口號,而且找到對應的進程,殺死該進程
            • netstat -ano
          2. 溫柔:修改自身的端口號
            • conf/server.xml
            <Connector port="8888" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8445" />
            • 通常會將tomcat的默認端口號修改成80。80端口號是http協議的默認端口號。
              • 好處:在訪問時,就不用輸入端口號
    5. 關閉:
      1. 正常關閉:
        • bin/shutdown.bat
        • ctrl+c
      2. 強制關閉:
        • 點擊啓動窗口的×
    6. 配置:
      • 部署項目的方式:
        1. 直接將項目放到webapps目錄下便可。
          • /hello:項目的訪問路徑-->虛擬目錄
          • 簡化部署:將項目打成一個war包,再將war包放置到webapps目錄下。
            • war包會自動解壓縮
        2. 配置conf/server.xml文件
        在<Host>標籤體中配置
            <Context docBase="D:\hello" path="/hehe" />
             <!-- docBase:項目存放的路徑 -->
             <!-- path:虛擬目錄 -->
        1. 在conf\Catalina\localhost建立任意名稱的xml文件。在文件中編寫(推薦)
        <Context docBase="D:\hello" />
            <!-- * 虛擬目錄:即爲xml文件的名稱 -->
      • 靜態項目和動態項目:
        • 目錄結構
          • java動態項目的目錄結構:
            -- 項目的根目錄
            -- WEB-INF目錄:
            -- web.xml:web項目的核心配置文件
            -- classes目錄:放置字節碼文件的目錄
            -- lib目錄:放置依賴的jar包
      • 將Tomcat集成到IDEA中,而且建立JavaEE的項目,部署項目。

Servlet: server applet


  • 概念:運行在服務器端的小程序
    • Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。css

    • 未來咱們自定義一個類,實現Servlet接口,複寫方法。
  • 快速入門:
    1. 建立JavaEE項目
    2. 定義一個類,實現Servlet接口
      • public class ServletDemo1 implements Servlet
    3. 實現接口中的抽象方法
    4. 配置Servlet
      在web.xml中配置:html

      <!--配置Servlet -->
      <servlet>
         <servlet-name>demo1</servlet-name>
         <servlet-class>cn.web.servlet.ServletDemo1</servlet-class>
      </servlet>
      
      <servlet-mapping>
         <servlet-name>demo1</servlet-name>
         <url-pattern>/demo1</url-pattern>
      </servlet-mapping>
  • 執行原理:
    1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
    2. 查找web.xml文件,是否有對應的url-pattern>標籤體內容。
    3. 若是有,則在找到對應的servlet-class>全類名
    4. tomcat會將字節碼文件加載進內存,而且建立其對象
    5. 調用其方法
  • Servlet中的生命週期方法:java

    1. 被建立:執行init方法,只執行一次
      • Servlet何時被建立?
        • 默認狀況下,第一次被訪問時,Servlet被建立
        • 能夠配置執行Servlet的建立時機。
          • 在servlet標籤下配置
            1. 第一次被訪問時,建立
              • 標籤load-on-startup>的值爲負數
            2. 在tomcat服務器啓動時,建立
              • 標籤load-on-startup>的值爲0或正整數
      • Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
        • 多個用戶同時訪問時,可能存在線程安全問題。
        • 解決:儘可能不要在Servlet中定義成員變量。即便定義了成員變量,也不要對修改值
    2. 提供服務:執行service方法,執行屢次
      • 每次訪問Servlet時,Service方法都會被調用一次。
    3. 被銷燬:執行destroy方法,只執行一次
      • Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
      • 只有服務器正常關閉時,纔會執行destroy方法。
      • destroy方法在Servlet被銷燬以前執行,通常用於釋放資源
  • Servlet3.0:
    • 好處:
      • 支持註解配置。能夠不須要web.xml了。
    • 步驟:
      1. 建立JavaEE項目,選擇Servlet的版本3.0以上,能夠不建立web.xml
      2. 定義一個類,實現Servlet接口
      3. 複寫方法
      4. 在類上使用@WebServlet註解,進行配置
        • @WebServlet("資源路徑"),urlPatterns()最重要須要配置
        //註解實現
        @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 "";
        }

servlet體系結構


  • 接口Servlet下有兩個實現抽象類( GenericServlet和HttpServlet)

GenericServlet類


  • 若繼承它,只須要重寫service方法(其餘已經返回空值)。但通常不使用

HttpServlet類


  • 對http協議的封裝,不須要複寫service方法,只須要複寫doGet()和doPost()等等方法
//源碼
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

Servlet相關配置


  1. urlpartten:是Servlet訪問路徑
    1. 一個Servlet能夠定義多個訪問路徑:@WebServlet({"/d","/d/dd","*.do"})
    2. 路徑定義規則(*爲通配符,優先級最低)
      1. /xxx
      2. /xxx/xxx:多層路徑(/xxx/*)
      3. *.xxx

IDEA與tomcat的相關配置


  1. IDEA會爲每個tomcat部署的項目單獨創建一份配置文件
    • 查看控制檯的log:Using CATALINA_BASE: "C:\Users\Administrator.IntelliJIdea2019.2\system\tomcat\Tomcat_8_5_39_javaWeb"
  2. 工做空間項目和tomcat部署的web項目
    • tomcat真正訪問的是「tomcat部署的web項目」,對應着"工做空間項目" 的web目錄下的全部資源web

    • WEB-INF目錄下的資源不能被瀏覽器直接訪問。apache

相關文章
相關標籤/搜索