1. 程式人生 > 實用技巧 >JavaWeb基礎知識筆記

JavaWeb基礎知識筆記

1.基本概念

前言
  • web開發
    • web,網頁如:www.baidu.com
    • 靜態web:html,css
      • 提供給所有人看的,資料始終不會變化
    • 動態web:
      • 千人千面,淘寶
      • 技術棧:Servlet/JSP,ASP,PHP
    • 在java中,動態web資源開發的技術統稱為javaweb
  • 網路通訊三要素
    • IP:電子裝置在計算機網路中唯一的識別符號
    • 埠:應用程式在計算機中唯一的標識 0~65536
    • 傳輸協議:規定了資料的傳輸規則
      • tcp udp
web應用程式
  • web應用程式:可以提供瀏覽器訪問的程式;
    • a.html,b.html... ...多個web資源可以被外界訪問,對外界通過服務
    • 任何一個資源或者頁面都存在於某一臺計算機上
    • URL-統一資源定位符
    • 統一的web資源會被放在同一個資料夾下,web應用程式--->通過Tomcat:伺服器,啟動
    • 一個web應用又多個部分組成:(靜態web,動態web)
      • html,css,js
      • jsp,servlet
      • java程式
      • jar包
      • 配置檔案(properties)
    • web應用程式編寫完畢後,提供給外界訪問需要一個伺服器來統一管理;
靜態web
  • *.htm *.html為網頁字尾,通過網路進行讀取

    客戶端---->伺服器---->.html

  • 靜態web的缺點

    • web頁面無法動態更新
    • 無法和資料庫互動(資料無法持久化,使用者無法互動)
動態web
  • 頁面動態展示:千人千面

    客戶端---->webserver plugin---->webserver---->file system

    ​ | |

    ​ 動態web資源jsp/servlet----->資料庫

  • 缺點

    • 動態web資源出現錯誤,需要重新編寫後臺程式,重新發布
  • 優點

    • 動態更新,與資料庫互動,資料持久化

2.web伺服器

  • web伺服器
    • 伺服器:安裝了伺服器軟體的計算機

    • 伺服器軟體:接受使用者請求,處理請求,作出響應

    • web伺服器:可以部署web專案,處理請求,做出響應

    • 伺服器是一種被動操作,用來處理使用者的一些請求和給使用者一些響應;

  • 技術流派:
    • ASP 微軟:
      • 最早流行的,在html中嵌入yeweudaima入了vb指令碼,ASP+COM
      • 在ASP中,業務程式碼繁多,維護困難
      • 使用C#語言
      • iis伺服器
    • PHP
      • 開發速度快,功能強大,跨平臺,程式碼簡單
      • 無法承載大訪問情況(侷限性)
    • JSP/Servlet
      • sun公司主推的B/S架構
      • 基於java語言
      • 可以承載三高問題帶來的影響

TOMcat

  • 配置

    • 部署專案的方式

      • 直接將專案放到webapps目錄下即可

        • /name:專案的訪問路徑---->虛擬目錄name
        • 簡化部署:將專案打包成一個war包,將war包放置到webapps目錄下
          • war包會自動解壓縮
      • 配置conf/server.xml檔案

        • <Host>標籤體中配置

          <Context docBase="專案路徑" path="虛擬目錄">

      • 在conf\Catalina\localhost建立任意名稱的xml檔案,在檔案中編寫

        <Context docBase="專案路徑">

        • 建立的xml檔名稱就是虛擬目錄
    • 靜態專案和動態專案

      • 目錄結構

        • java動態專案的目錄結構

          • 專案根目錄

            • WEB-INF目錄

              • web.xml:web專案的或許配置檔案
              • classes目錄:放置位元組碼檔案
              • lib目錄:放置專案依賴的jar包

Servlet:server applet

  • 概念:執行在伺服器端的小程式
    • servlet就是一個介面,定義了java類被瀏覽器訪問到(tomcat識別的規則)

  • 定義一個型別實現Servlet方法

  • 快速入門:

    • 定義一個類實現Servlet介面

    • 實現介面中的方法

    • 配置Servlet

      • web.xml檔案新增對映

        <servlet>
        	<servlet-name>demo01</servlet-name>
        	<servlet-class>com.km.Servletstudy01.ServletDemo01</servlet-class>
        </servlet>
        <servlet-mapping>
        	<servlet-name>demo01</servlet-name>
        	<url-pattern>/test</url-pattern>
        </servlet-mapping>
        
    • 執行原理:

      • 當伺服器接收到客戶端瀏覽器的請求之後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑

      • 查詢web.xml檔案,是否有對應的<url-pattern>標籤體內容

      • 如果有,則找對應的<servlet-class>全類名

      • tomcat會將位元組碼檔案載入進記憶體,並建立其物件

      • 呼叫其方法

  • Servlet中的方法

    • 被建立:執行init方法,只會執行一次

      • 預設情況時,第一次被訪問時,Servlet被建立

      • 指定Servlet的建立時機

      • Servlet的init的方法只執行一次,說明其在記憶體中只有一個物件,是單例的,存線上程安全問題,對於定義在Servlet中的成員變數避免修改其值

        <load-on-startup>num</load-on-startup>
        <!--第一次被訪問的時候建立num為負整數-->
        
      
      
    • 提供服務:執行service

    • 被銷燬:只有正常關閉才會執行destory方法

          /**
           * 初始化方法
           * 在Servlet建立時執行,只會執行一次,第一次訪問的時候執行
           * @param servletConfig
           * @throws ServletException
           */
          @Override
          public void init(ServletConfig servletConfig) throws ServletException {
      
          }
      
          /**
           * 獲取ServletConfig物件
           * ServletConfig:Servlet的配置物件
           * @return
           */
          @Override
          public ServletConfig getServletConfig() {
              return null;
          }
      
          /**
           * 提供服務
           * 每次servlet被訪問時,執行,執行多次
           * @param servletRequest
           * @param servletResponse
           * @throws ServletException
           * @throws IOException
           */
          @Override
          public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
              System.out.println("hello");
          }
      
          /**
           * 獲取Servlet的一些資訊,版本,作者
           * @return
           */
          @Override
          public String getServletInfo() {
              return null;
          }
      
          /**
           * 伺服器被正常關閉的時候執行,只會執行一次
           */
          @Override
          public void destroy() {
      
        }
      
    • 在Servlet3.0以上版本中,可以免去配置web.xml檔案通過@WebServlet()進行配置

      String name() default ""; 
      String[] value() default {};
      String[] urlPatterns() default {};//虛擬目錄
      @WebServlet({"/test","/test2"})//一個註解配置的例項
      
    • 在idea中為每一個專案配置了一份單獨的tomcat的配置檔案,在啟動記錄可以檢視,工作空間中的web專案使用第二種部署模式<Context docBase="專案路徑">

    • 在工作空間專案和tomcat部署的web專案中,tomcat真正訪問的是tomcat部署的web專案

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

  • Servlet的體系結構

    • Servlet----介面

      ​ |

    • GenericServlet----抽象類:將Servlet介面中除service()的其他方法做了預設空實現,定義Servlet時通過繼承GenericServlet | 秩序實現Servlet()方法即可

    • HttpServlet----抽象類:對http協議進行了封裝、簡化,通過繼承HttpServlet複寫doGET/doPOST方法

  • Servlet相關配置

    • urlPartten:Servlet訪問路徑
      • 一個Servlet可以定義多個訪問路徑:@webServlet({"/url1","/url2","/url3"})
      • 路徑的定義規則
        • /XXX
        • /XXX/XXX:多層路徑,目錄結構
        • *.do

HTTP

  • 概念:Hyper Text Transfer Protocal、超文字傳輸協議

    • 定義了客戶端和伺服器端通訊時,傳送資料的格式
  • 特點:

    • 基於TCP/IP的高階協議
    • 預設埠號:80
    • 基於請求/響應模型:一次請求對應於一次響應
    • 無狀態的:每次請求之間相互獨立的,不能互動資料
  • 歷史版本:

    • 1.0版本:每一請求都會建立一個新的連線
    • 1.1版本:複用連線
  • 請求訊息的資料格式:

    • 請求行

      • 請求方式 請求url 請求協議/版本

        GET /java_02_Servlet_war_exploded/ HTTP/1.1

      • 請求方式:

        • HTTP協議有七種,常見的有兩種
          • GET:
            • 請求引數在請求行中
            • 請求的url長度有限制
          • POST:
            • 請求引數在請求體中
            • 請求的url長度長度沒有限制
            • 相對安全
    • 請求頭:客戶端告訴瀏覽器的一些資訊

      Host: localhost:8080
      Connection: keep-alive
      Cache-Control: max-age=0
      DNT: 1
      Upgrade-Insecure-Requests: 1
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.51
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
      Referer: http://localhost:8080/java_02_Servlet_war_exploded/
      Accept-Encoding: gzip, deflate, br
      Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
      Cookie: JSESSIONID=C07083980CC487F745690FAD6B70DA9F; Idea-501a323b=997da08b-cdc4-4b00-b142-bfaff8717b82
      
      • 格式:請求頭名稱:請求頭值
      • 常見的請求頭:
        • User-Agent:告知伺服器使用的瀏覽器版本,伺服器可以獲取該頭訊息,解決瀏覽器相容性問題
        • Accept-Encoding:可接受的壓縮包格式
        • Accept-Language:可接受的語言
        • Connection: keep-alive:可以複用連線
        • Referer:告知伺服器連結的來源
          • 防止盜鏈
          • 統計工作
    • 請求空行

      • 空行,用於分隔POST請求的請求行於請求體
    • 請求體(正文)

      • 封裝POST請求訊息的請求引數

Request

  • Request和Response物件的原理

    • Request和Response物件由伺服器來建立
    • Request物件用於獲取請求訊息
    • Respond物件用於設定響應訊息
  • Request:獲取請求訊息

    • Request物件的繼承體系結構

      Servlet----介面

      ​ |

      HttpServletRequest----介面

      ​ |

      RequestFacade----由Tomct實現的類

  • Request功能

    • 獲取請求訊息資料

      • 獲取請求行資料

        http://localhost:8080/java_study/user/demo1?name=Carl+Jones
        
        • String getMethod():獲取請求資料---->GET/POST
        • (*)String getContextPath:獲取虛擬目錄---->/java_study
        • String getServletPath():獲取Servlet路徑---->/user/demo1
        • String QueryString():獲取get方式的請求引數---->name=Carl+Jones
        • (*)String getRequestURI():獲取請求URI---->/java_study/user/demo1
        • String getRequestURI():獲取請求URL---->http://localhost:8080/java_study/user/demo1
          • URL:統一資源定位符---->中華人民共和國
          • URI:統一資源識別符號---->共和國(Uniform Resource Identifier)
        • String getProtocal():獲取協議及版本
        • String getRemoteAddr():獲取客戶端IP
      • 獲取請求頭資料

        • (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值
        • Enumeration getHeaderNames():獲取所有的請求頭名稱
      • 獲取請求體資料

        • 請求體只有POST請求方式才會有請求頭,請求體中封裝了POST請求的請求引數
        • 步驟:
          • 獲取流物件
            • BufferedReader getReader():獲取字元輸入流,只能操作字元資料
            • ServletInputStream getInputStream():獲取位元組輸入流,可以操作所有型別的資料
          • 再從流中獲取資料
      • 其他功能:

        • 獲取請求引數通用方式:POST,GET都可以使用

          • String getParameter(String name):根據引數獲取請求引數值

          • String[] getParameterValues(String name):根據引數獲取請求引數值的陣列---->用於複選框

          • Enumeration getParameterNames():獲取所有請求引數的名稱

          • Map<String,String> getParameterMap():獲取所有引數的map集合

          • 中文亂碼問題:

            • get方式:tomcat 8將get方式的亂碼問題解決了

            • post方式:會亂碼、解決方式設定request的編碼

              request.setCharacterEncoding("utf-8")
              
        • 請求轉發:一種在伺服器內部的資源跳轉方式

          • 步驟
            • 通過request物件獲取請求轉發器物件:RequestDispatcher getRequestDispatcher(String path)
            • 使用RequestDispatcher物件來進行轉發:forward(ServletRequest request,ServletRespons respons)
          • 特點
            • 瀏覽器路徑欄路徑不會發生改變
            • 只能轉發到伺服器內部的資源
            • 多個資源間使用同一個請求
        • 共享資料

          • 域物件:一個有作用範圍的物件,可以在範圍內共享資料
          • request域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享資料
            • 方法:
              • void setAttribute(String name,Object obj):儲存資料
              • Object getAttribute(String name):通過鍵獲取值
              • void removeAttribute(String name):移除資料
        • 獲取ServletContext

          • ServletContext getServletContext()
        • BeanUtils工具類,簡化資料封裝

          • JavaBean:標準的Java類

            • 類必須被public修飾
            • 必須提供空參的構造器
            • 成員變數必須使用private修飾
            • 提供公共的getter和setter方法
            • 功能:封裝資料
          • 概念:

            • 屬性:getter和setter方法擷取之後的產物
              • 例如:getUsername()---->Username---->username
          • 方法:

            • setProperty():操作屬性
            • getProperty():操作屬性
            • populate(Object obj,Map map):將map集合中的鍵值對資訊,封裝到對應的JavaBean物件中,鍵當作屬性的名稱,值當作屬性對應的值

Response

  • 響應訊息的資料格式

    • 響應行

      • 組成:協議/版本 響應狀態碼 狀態碼描述
      • 響應狀態碼:伺服器告知的客戶端瀏覽器本次請求和響應的一次狀態
        • 狀態碼為三位數字
        • 分類:
          • 1xx,伺服器接收客戶端訊息但沒有接收完全,等待一段時間後傳送1xx狀態碼確認客戶端
          • 2xx,成功
          • 3xx,重定向 302重定向 304訪問快取
          • 4xx,客戶端錯誤,404客戶端請求的資源錯誤沒有對應的資源,405請求方式沒有對應的方法... ...
          • 5xx,伺服器端錯誤 500伺服器內部出現異常
    • 響應頭

      • 格式:頭名稱:值
      • Content-Type:告知客戶端本次響應體的格式
      • content-disposition:告知客戶端開啟響應體資料的格式
        • inline,預設值,在當前頁面開啟
        • attachment,filename=xxx,以附件形式開啟響應體,檔案下載
    • 響應空行

    • 響應體

      HTTP/1.1 200
      Content-Type: text/html;charset=utf-8
      Content-Length: 15
      Date: Wed, 28 Oct 2020 02:25:31 GMT
      Keep-Alive: timeout=20
      Connection: keep-alive
      
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>登陸介面</title>
          <style>
              div{
                  margin: auto;
              }
          </style>
      </head>
      <body>
          <div>
              <form action="/java_study/login" method="post">
                  <label for="username">使用者名稱</label><input type="text" name="username" id="username" placeholder="請輸入使用者名稱"><br>
                  <label for="password">密碼:</label><input type="password" name="password" placeholder="請輸入密碼" id="password"><br>
                  <input type="submit" value="登入">
              </form>
          </div>
      </body>
      </html>
      
  • 功能:設定響應訊息

    • 設定響應行
      • 格式:HTTP/1.1 200 OK
      • 設定狀態碼:setStatus(int sc)
    • 設定響應頭:
      • setHeader(String name,String value)
    • 設定響應體
      • 1.獲取輸出流
        • 字元流:PrintWriter getWriter()
        • 位元組輸出流:ServletOutputStream getOutputStream()
      • 2.使用輸出流,將資料輸出到客戶端
  • 重定向:資源轉發的一種方式

    方法一:

    resp.setStatus(302); //設定響應狀態
    resp.setHeader("location","/java_study/response01"); //設定響應頭,重定向訪問路徑
    

    方法二:

    resp.sendRedirect("/java_study/response01"); //簡單的重定向方法
    
  • 與轉發的比較:

    • 轉發:
      • 轉發位址列路徑不變
      • 轉發只能訪問當前伺服器下的資源
      • 轉發是一次請求
      • 可以使用request域共享資料
    • 重定向:
      • 轉發位址列路徑變化
      • 可以訪問其他伺服器資源
      • 轉發是兩次請求
      • 不能共享資料
  • 路徑的寫法:

    • 路徑的分類:
      • 相對路徑:通過相對路徑不可以確定唯一資源
        • 如./index.html,以.開頭./父目錄 ../爺目錄
      • 絕對路徑:通過絕對路徑可以確定唯一的資源
        • 如/java_study/response01,以/開頭
        • 客戶端發出:需要加虛擬目錄,重定向也是客戶端路徑
        • 伺服器端發出:不需要加虛擬目錄(如:轉發)
  • 設定響應體

    • 獲取流物件之前,設定流的預設編碼:IOS-8859-1(無法顯示中文),設定為其他編碼如"utf-8"

    • 通知客戶端,伺服器傳送的響應體資料的編碼

      resp.setContentType("text/html;charset=utf-8");