JavaWeb基礎(day15)( http + tomcat + servlet + 響應)

呆呆來啦發表於2020-07-16

HTTP+Tomcat+Servlet+響應

HTTP

  HTTP  超文字傳輸協議(Hyper Text  Transfer  Protocol  ),一種網路協議。

  • 協議的組成和過程

    • HTTP協議由http請求和http響應組成。在瀏覽器輸入一個請求,瀏覽器將你的請求封裝成一個http請求傳送給伺服器,伺服器收到請求組響應資料封裝成一個http響應,返回給客戶端。
  • 抓包分析

    使用chrome自帶的工具,可以看到資料相互傳送的具體過程。

 

    • http請求

 

      get請求

       請求行:請求的方法為get請求

       本地的地址:host:localhost:8080

       connection:keep-alive   連線方式:長連線

       瀏覽器通知伺服器,當前請求來自何處。如果是直接訪問,則不會有這個頭。
       常用於:防盜鏈
       Referer: http://localhost:8080/BigData/a.html

      post請求

 

 

  • Http響應

    常用響應狀態碼

         200    請求成功
      302    重定向
      304    讀取本地快取檔案
      404    請求的頁面不存在
      500    服務端程式錯誤

Tomcat

  • 伺服器

    • 伺服器是一個管理資源併為使用者要提供服務的計算機軟體,伺服器的本質就是普通的電腦中安裝了相關的服務軟體。tomcat就是一個web應用伺服器
  • web2資源

    • 在web應用伺服器內部,能夠讓外界進行訪問的資源都叫web資源。圖片,js,css,視訊等。
  • web應用伺服器

    • tomcat:是apache開源組織下的開源免費的中小型web伺服器,支援Javaee中的servlet和jsp規範
    • tomcat 的實際作用就是通過HTTP協議規範讓使用者訪問存在與伺服器內部的資源。
  • Tomcat目錄結構

    • bin中放的都是可執行的指令碼程式 啟動指令碼 startup.bat  停止指令碼 shutdown.bat
    • conf存放的是配置資訊檔案  server.xml核心配置檔案:可以設定Tomcat埠,編碼格式,web應用的釋出資訊
    • tomcat­users.xml使用者許可權配置檔案:用於設定使用者的分組和使用者的密碼
    • web.xml web專案預設配置檔案,可以配置預設路徑,配置tomcat預設servlet
    • lib 依賴庫,tomcat和web專案中需要使用的jar包,如jsp-api.jar 和 servlet-api.jar
    • logs日誌資料夾,如 catalina.2017-07-11.log 檢視tomcat日誌
    • temp:臨時檔案目錄,其中內容可以任意刪除
    • webapps:存放釋出的web應用的目錄
    • work:tomcat解析jsp檔案的工作目錄,會將jsp解析成的servlet就存在於這個目錄
  • Tomcat啟動

    • 需要jdk的支援,並且需要配置環境變數JAVA_HOME
    • 本機地址127.0.0.1或者localhost
    • 埠配置,預設tomcat是8080埠
    • 80埠:http協議預設的埠,我們可以通過修改
    • servler.xml設定埠
       
    • 配置使用者名稱管理tomcat下所有的web應用,修改 tomcat­-users.xml
  • 常見問題

    • 啟動閃退
      • 系統沒有配置環境,JAVA_HOME
    • java.net.BindException: Address already inuse: JVM_Bind <null>:8080
      • 8080埠被佔。開源通過server.xml修改埠,也可以通過程式殺死佔用程式。
        • 1.命令列輸入   netstat  -ano 查詢8080埠被那個程式佔用
        • 2.開啟工作管理員根據pid找到對應程式關閉。

Servlet

  servlet執行在服務端的Java小程式。由sun公司提供的一套規範介面,用來處理客戶端的請求,響應給瀏覽器的動態資源。但是servlet的實質就是Java程式碼,通過Java的API動態向客戶端輸出內容。

  • Servlet的內部實現原理

    • servlet規範:包含三個技術點。servlet技術,filter(過濾器)技術,listener(監聽器)技術。
    • 當客戶端傳送請求時,tomcat會先解析請求的路徑,在web.xml的配置檔案中去找到對應匹配的路徑,如果找到,就會通過配置檔案中servlet-name找到對應的類,然後去建立對應類的物件,此時因為介面規範中規定了,init方法,所以tomcat會去呼叫相應物件的init方法,然後再去呼叫service方法,由我們service方法去處理響應的請求
  • Servlet生命週期

    • init方法:servlet建立的時候執行
    • servlet方法:每次傳送請求的時候執行
      • servletRequest 代表請求  servletRequest內部封裝的是http請求的資訊。
      • servletResponse代表響應 要封裝的是響應的資訊。
    • destory方法:伺服器關閉的時候執行
  • Servlet的配置  

    • <servlet> 中的 <servlet-name> 中的名字可以任意起,但是需要和 <servlet-mapping> 中的 <servlet-name> 相同
    • <servlet> 中的 <servlet-class> 指定是對應servlet
      的類的全名
    • <servlet-mapping> 中 <url-pattern> 指的是當瀏覽器中輸入什麼路徑的時候去匹配我們對應的servlet

<servlet>
  <servlet-name>myServlet</servlet-name>
  <servlet-class>com.web.servlet.MyServlet</servlet-class>
</servlet>
  <servlet-mapping>
  <servlet-name>myServlet</servlet-name>
  <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

  

  • url­pattern的配置方式  

    • 完全匹配如 /myServlet
    • 目錄匹配如 /a/b/c/*
    • 副檔名匹配 *.do
    • 預設配置如 / 當你訪問資源地址所有的servlet都不匹配時,預設的servlet負責處理其實,web應用中所有的資源的響應都是servlet負責,包括靜態資源,對於靜態資源其實是由tomcat的預設servlet進行處理的
    • /和/*區別/不會處理字尾名是.jsp的資源
    • /*會處理字尾名是.jsp的資源
    • 啟動伺服器的時候建立servlet配置 <load-on-startup>1</load-on-startup> 只要不是負數都會隨著伺服器的啟動而建立,值越小優先順序越高

HttpServlet

  在實際的開發過程中,我們不會去建立一個類實現Servlet介面,我們會直接建立一個類去繼承HttpServlet,這個是Tomcat提供的一個類,並且實現了Servlet介面。

ServletContext物件

 ServletContext代表是一個web應用的環境物件,ServletContext物件 內部封裝是該web應用的資訊一個web應用只有一個ServletContext物件

  • ServletContext的生命週期

    • 建立:當前的web應用建立的時候,一般web應用會隨著伺服器的啟動而建立的(或者釋出的時候)
    • 銷燬:web應用被解除安裝(伺服器關閉,刪除當前的web應用)
  • 如何得到ServletContext物件

    • 在doGet或者doPost方法中呼叫 this.getServletContext();
    • 注意在當前web應用中所有的servlet中呼叫此方法獲取的servletContext物件是全域性唯一的
  • ServletContext作用

    • ServletContext物件隨著伺服器的啟動而啟動,所以可以通過ServletContext獲得web應用全域性的初始化引數,在日後學習的spring中,就是將Spring檔案的路徑配置在初始化引數中.
    • ServletContext是一個域物件,因為它隨著伺服器的啟動而建立,伺服器的關閉而銷燬,所以存放在ServletContext中的資料是整個web應用所共享的.
      • 向ServletContext域中放入資料 setAtrribute(String name,Object obj);
      • 從ServletContext域中獲取資料 getAttribute(String name);
      • 從ServletContext域中刪除資料 removeAttribute(String name);

HttpServletResponse

  service方法中的response的型別是ServletResponse,而doGet/doPost方法的response的型別是HttpServletResponse,HttpServletResponse是ServletResponse的子介面
  • response執行流程

    • tomcat核心傳送一個空內容的response物件,供我們去將需要的內容放入
  • response設定響應行

    • 使用response設定了狀態碼,那麼tomcat就不會再去設定狀態碼了
    • response.setStatus(302);
  • response設定響應頭

    • 設定不同的頭,客戶端收到訊息後會做響應的操作
    • response.setHeader("Location", "/WebTest/index.html");

response重定向

  重定向相當於客戶端傳送第二次請求

  response.sendRedirect("/WebTest/index.html");

response定時重定向

  response.setHeader("refresh", "2;url=/Day18/index.html");
  • 重定向特點

    • 重定向過程是客戶端收到訊息後,再做的請求,所以瀏覽器的地址會發生改變
    • 伺服器收到的請求是兩次請求
  • response設定響應體

    • 通過response可以將客戶端需要的資料放入響應體中,其過程是先將返回的資訊放在response的緩衝區中,然後由tomcat讀取緩衝區的內容,封裝成http的響應內容傳送給客戶端。

解決亂碼問題

  response.setCharacterEncoding("UTF-8");

  response.setHeader("Content-Type","text/html;charset=UTF-8");

  (使用httpservlet時寫上就對了,標準。)

 

相關文章