day01-Tomcat框架分析

2022-11-16 06:00:20

引入課程和Maven

1.Maven

maven中央倉庫:Maven Repository: Search/Browse/Explore (mvnrepository.com)

maven倉庫是國外的一個網站,由於網路問題,我們也常使用maven倉庫的映象

maven的原理和java程式運算元據庫,然後資料庫返回相關資料類似。

  • 預設建立的專案結構如下:

    新增新映象如下:

     <mirror>
          <id>alimaven</id>
          <name>aliyun</name>
          <url>https://maven.aliyun.com/nexus/content/groups/public</url>
          <mirrorOf>central</mirrorOf>
        </mirror>
    
  • 返回idea的視窗中,選擇剛才設定的xml檔案和要儲存下載的jar包的目錄,點選override,點選ok

    這樣就完成了maven的映象設定

    image-20221115183053123
  • 在專案的pom.xml檔案中新增設定

    在dependency元素中新增設定如下:

    <!--引入Servlet.jar-->
     <!--1.為了開發servlet,需要引入其jar包
    	 2.dependency 表示引入一個包
         3.groupId 表示包的開發公司/組織/個人 的資訊 javax.servlet
         4.artifactId 表示包的專案名稱 javax.servlet-api
             補充:groupId+artifactId是以目錄形式體現
         5.version 表示該包當前的版本
         6.scope 表示引入的包的作用範圍
         7.provided 表示 這裡你引入的jar包,在編譯,測試有效,但是在打包釋出的時候,不要帶上這個jar包
                     (因為Tomcat本身有jar包)
         8.下載的包在你指定的目錄中
         9.可以去修改我們要下載的目錄位置
         10.可以去指定maven倉庫,即設定maven映象
         -->
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <version>3.1.0</version>
             <scope>provided</scope>
         </dependency>
    
  • 點選右邊的Maven,點選迴圈按鈕,開始下載依賴

    image-20221115185040582
  • 下載完畢後,可以在設定的下載目錄中看到該依賴:

    下一次如果要使用依賴,就會先到下載目錄下去找該依賴。

    image-20221115185334672
  • 2.測試小案例

    編寫如下的測試案例

    image-20221115190809188

    建立java目錄,存放原始檔

    image-20221115191037149

    建立Servlet(如果選項中沒有Servlet,點選右邊的maven,重新導一下包)

    image-20221115191206217

    在web.xml檔案中設定Servlet(使用註解也可以)

    <servlet>
        <servlet-name>CalServlet</servlet-name>
        <servlet-class>com.li.servlet.CalServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CalServlet</servlet-name>
        <url-pattern>/calServlet</url-pattern>
    </servlet-mapping>
    

    編寫程式

    WebUtils:

    package com.li.utils;
    
    public class WebUtils {
        /**
         * 將一個字串數位轉成int,如果轉換失敗,就返回傳入的defaultVal
         *
         * @param strNum
         * @param defaultVal
         * @return
         */
        public static int parseInt(String strNum, int defaultVal) {
            try {
                return Integer.parseInt(strNum);
            } catch (NumberFormatException e) {
                System.out.println(strNum + "輸入的格式錯誤");
            }
            return defaultVal;
        }
    }
    

    CalServlet:

    package com.li.servlet;
    
    import com.li.utils.WebUtils;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class CalServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //接收提交的資料進行計算
            String strNum1 = request.getParameter("num1");
            String strNum2 = request.getParameter("num2");
    
            //把strNum1和strNum2轉成int型別
            int num1 = WebUtils.parseInt(strNum1, 0);
            int num2 = WebUtils.parseInt(strNum2, 0);
            int result = num1 + num2;
    
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.print("<h1>" + num1 + "+" + num2 + "=" + result + "</h1>");
            writer.flush();
            writer.close();
        }
    }
    

    cal.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>計算器</title>
    </head>
    <body>
    <h1>計算器</h1>
    <!--這裡的路徑是瀏覽器要解析的,因此如果寫成/calServlet的話,就會解析成http://主機名/calServlet
        想要這樣設定的話,tomcat的路徑就不要寫專案名了-->
    <form action="/calServlet" method="post">
        num1:<input type="text" name="num1"/><br/>
        num2:<input type="text" name="num2"/><br/>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

    設定Tomcat(注意application context的設定)

    image-20221115194241633

    點選執行tomcat,在瀏覽器位址列中輸入:http://localhost:8080/cal.html,顯示頁面如下:

    image-20221115194627533

    輸入資料,點選提交:

    image-20221115194717837 image-20221115194730259

    2.Tomcat整體專案架構分析

    我們建立web專案,都要依賴於Tomcat等web服務以及實現繼承Servlet介面。

    可以看出對Tomcat的底層機制和呼叫到Servlet的流程的理解是十分重要的。

    現在我們來模擬Tomcat底層實現,並能呼叫我們自己設計的Servlet,完成相同的功能。

    說明:Tomcat有三種執行模式(BIO,NIO,APR),因為核心講解的是Tomcat如何接受使用者端請求,解析請求,呼叫Servlet,並返回結果的流程機制,因此採用BIO執行緒模型來模擬。

    整個流程如下:

    1. 瀏覽器在位址列輸入請求的URL,傳送http請求
    2. http請求到達Tomcat後,底層的socket網路程式設計會接收這個請求,建立一個執行緒(每一個請求對應一個執行緒)
    3. 被建立的執行緒就會去解析這個URL是什麼請求,如果是請求Servlet資源,就去呼叫Servlet(底層會用反射範例化);如果呼叫的是靜態資源,就直接返回