Servlet與HTTP介紹學習

来源:https://www.cnblogs.com/li-yan-long/archive/2019/04/13/10699419.html
-Advertisement-
Play Games

http介紹:http是一套規範,一種網路數據交互的標準協議,不同的語言,不同的數據想要實現合理的數據交互(例如:瀏覽器和伺服器數據交互),就得按照他所規定的協議來,這樣就會形成標準的(大家都認識的)數據交互。 http交互流程: 1.客戶端和伺服器建立起連接通道。 2.客戶端發送請求給伺服器。 3 ...


http介紹:http是一套規範,一種網路數據交互的標準協議,不同的語言,不同的數據想要實現合理的數據交互(例如:瀏覽器和伺服器數據交互),就得按照他所規定的協議來,這樣就會形成標準的(大家都認識的)數據交互。

http交互流程:

  1.客戶端和伺服器建立起連接通道。

  2.客戶端發送請求給伺服器。

  3.伺服器處理請求後將結果響應給客戶端。

  4.客戶端和伺服器的連接通道關閉。http1.1會等待一段時間如果沒有請求進來就會關閉。

特點:

  1.數據結構:他是以鍵值對的形式描述數據結構的。

  2.無連接:一次請求一次響應,當本次請求得到響應時即本次數據交互結束(客戶端和伺服器斷開連接)。在http1.1中請求處理完成響應後,客戶端和伺服器不會立即斷開連接而是在等待一定時間後再斷開,如果等待期間有請求過來那麼等待時間會重新開始(延長)。

  3.無狀態:第一次請求處理完成後,要發送第二次請求,但即使兩次請求用的是相同的數據,在http中也是沒有任何關係的,所以二次請求任然需要重覆第一次的流程,http他是沒有記憶功能的,所以哪怕兩次請求一模一樣,各自的請求還是要發送全部的請求數據,這就是無狀態。

  4.http是基於TCP協議發送數據的,所謂TCP大概意思為:即兩端連通以後再進行數據請求和數據響應。UDP:即連接和請求一起發送過去,不會等到雙方連接通暢之後再進行,所以UDP協議不會保證數據一定發送到另一端,但效率比TCP要快。

http請求格式:

  1.請求頭內容: 請求方式(get、post...)  請求地址(https://i.cnblogs.com/EditPosts.aspx?opt=1) http協議(1.0/1.1)

  2.請求行、消息報頭:這裡面規範了伺服器需要額外信息,一般瀏覽器會自動封裝,如:能解析的數據格式等,客戶端需要的Cookie數據。

  3.空行

  4.請求數據

在實際請求中瀏覽器為了方便展示觀看:會將上面請求格式中的內容給分開展示,像get請求會將請求數據帶到請求地址後面。

http響應格式:

  1.響應行:http版本 狀態碼 狀態消息

  2.響應頭:消息報頭:伺服器和瀏覽器之間的額外數據,例如:本次響應的消息類型...等等。

  3.空行

  4.響應實體:具體響應的數據。

額外解釋:

  1.消息報頭:消息報頭中的信息和請求頭響應頭中的信息,這些信息中主要說明本次數據交互所採的各個屬性:例如本次數據的格式:xml/json...這些數據都是伺服器和瀏覽器自動處理的不需要開發者關心,開發者只管將自己需要的數據添加進去即可:例如Cookie,伺服器中對這些常用配置已經做了處理,而瀏覽器的各個廠商也對瀏覽器做了處理,所以程式員只需要關心請求數據和響應數據即可。

上面對http的大概介紹就這麼多,下麵主要介紹Servlet:

客戶端向瀏覽器請求的流程:前端網頁源碼 -> 瀏覽器請求封裝(主要是消息報頭以及版本信息等) -> 伺服器處理 -> 根據請求的不同(get post...) -> 分配到後端相應的介面邏輯中

Servlet的請求流程: 網頁請求 -> 伺服器收到請求後尋找對應的Servlet -> 然後將請求信息以及要響應的信息封裝成request response對象傳入響應的Servlet對象的Service方法中去調用此方法。

好了,說了這麼多,開始上代碼:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
     <!--配置Servlet  -->
         <!--配置servlet類路徑  -->
         <servlet>
             <servlet-name>my</servlet-name>
             <servlet-class>cn.mr.li.MyServlet</servlet-class>
         </servlet>
         <!--配置訪問方式  -->
         <servlet-mapping>
             <servlet-name>my</servlet-name>
             <url-pattern>/my</url-pattern>
         </servlet-mapping>
</web-app>

servlet:

1.request作用域:一次請求一個數據作用域僅限本次請求所用到邏輯範圍,但通過請求轉發的方式可實現多個Servlet之間數據共用,一次請求,一次響應。

2.Cookie:客戶端數據存儲技術,並用於請求自動攜帶,至於帶什麼,請求哪些路徑時帶,生命周期等都是伺服器設置的。然後由response對象通知客戶端去執行具體的操作。

3.重定向:response.sendRedirfect(uri),只能防止重覆刷新重覆請求,但是不能數據共用,如果將所有數據都放在Cookie中將不安全,而且也無法驗證當前Cookie就是此人。

4.session作用域:同一個對象請求多次數據共用。

5.sessionContext作用域:不同對象請求多次數據共用。

6.tomcat伺服器下的web.xml文件中的全局變數將是所有伺服器都共用的數據範圍。

package cn.mr.li;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyServlet extends HttpServlet{

    private static final long serialVersionUID = 8834328433966095720L;

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
        //編碼,從iso8859-1編碼後再轉換成utf-8,uname字元串是請求的變數名
        String uname = new String(request.getParameter("uname").getBytes("iso8859-1"), "utf-8");
        //新建Cookie:將Cookie放到客戶端的消息報頭中
        Cookie cookie = new Cookie("id", uname);
        //此Cookie的最大生命周期,設置了客戶端就會存到他自己的硬碟中,生命周期一到就會刪除,預設有效期期是本次會話,會話一旦關閉則失效
        cookie.setMaxAge(24 * 3600);
        //往響應中添加Cookie,這樣才會通知到客戶端下次請求會帶上本次存放的數據
        response.addCookie(cookie);
        //設置訪問哪些路徑、目錄先時可以帶cookie
        cookie.setPath("/埠號後的鏈接");
        
        /** 請求轉發 一次訪問 後端邏輯跑多個Servlet, 記得要加return*/
        //給Requset添加自定義屬性
        request.setAttribute("key", "value:給下個流程的參數,此值是本流程產生的,這裡是可以放一個Object對象的");
        //演示請求轉發,意思是本Servlet處理完了本此Servlet管理的業務,將自動轉向下一個Servlet處理後序流程(原子性),
        //但如果客戶端網頁一刷新就重新開始一次請求,如果是轉錢業務用請求轉發就完犢子了,他會轉了因為頁面刷新再次請求又會轉,所以還是要看具體業務的。
        request.getRequestDispatcher("其他sevlet的別名url-pattern標簽中的").forward(request, response);
        
        /** 重定向 多次訪問 頭端通知前端,此時前端會自動訪問多個Servlet, 
         * 但是request中如果有屬性值得話request.setAttribute,就無法在下次請求中帶了,因為是不同的requset對象,不過session可以解決*/
        //因為請求轉發用戶一但刷新頁面將會不安全,會重覆跑流程,所以有了重定向,
        //相當於本次Servlet處理業務完成後直接通知客戶端訪問下個Servlet此時客戶端會自動訪問下個Servlet
        response.sendRedirect("直接傳下次要訪問的uri");
        
        /** Session 一個request在伺服器上的對象,一個很全的對象,例如:某個用戶訪問了伺服器:伺服器將此用戶的User信息
         * 查詢出來放到Session中,那麼此用戶下次請求Servlet是甚至只傳很少的參數即可  */
        //創建Session此方法會從Requset的Cookie中取出他自己的SessionId,如果沒有或者沒取到則會創建一個新的Session對象
        //並且將SessionId重新放到Cookie中,預設SessionId的生命周期30分鐘,一旦斷開連接則會銷毀
        HttpSession session = request.getSession();//此session是用請求對象的sessionid取出來的。
        //給session對象賦值屬性值
        session.setAttribute("key", "Object類型");
        //設置session的生命周期,時間單位:秒
        session.setMaxInactiveInterval(123);
        //強制讓session過期
        session.invalidate();
        
        /** ServletContext對象:此對象的數據整個伺服器共用,也就是說存放在此對象中的數據整個伺服器上都能拿到,前提是要能得到此對象  */
        ServletContext sc1 = this.getServletContext();//方式1
        sc1 = this.getServletConfig().getServletContext();//方式2
        sc1 = request.getServletContext();//方式3
        //同樣賦值
        sc1.setAttribute("key", "Objcet");
        //獲取全局配置web.xml
        sc1.getInitParameter("hahhahah");
        //獲取全局配置的所有key名
        sc1.getInitParameterNames();
        
        /**ServletConfig專門讀取某個Servlet下的配置的,有次方法後所有的key都將不需要硬編碼*/
        ServletConfig config = this.getServletConfig();
        //讀取Servlet專屬變數名
        String value = config.getInitParameter("key");//web.xml init-param標簽中
        
        
        //給瀏覽器列印文本
        response.getWriter().write("hello world!!!");
    }
//    @Override
//    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.getWriter().write("do get!!!");
//    }
//    
//    @Override
//    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.getWriter().write("do post!!!");
//    }
//    
//    @Override
//    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.getWriter().write("do put!!!");
//    }
}

順帶提一下jsp:jsp的原理就是講html文件中的所有代碼全部讀進Servlet中轉為輸出語句列印到控制臺上,而其中的java代碼,會讀過來後執行響應的邏輯後再自己的位置列印到瀏覽器。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 定義: 為子系統中的一組介面提供一個一致的界面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 結構:(書中圖,侵刪) 結構:(書中圖,侵刪) 一個簡潔易用的外觀類 一個複雜的子系統 實例: 書中提到了理財的例子,找理財經理就不用自己研究各種股票債券什麼了;致使我一度腦子裡只想到了房 ...
  • 首先我們知道Java是一門面向對象的語言 面向對象三大特性,封裝、繼承、多態。 封裝、繼承、多態 ↓ 無論是學習路線,還是眾人的口語習慣,都是按照這個這樣進行排序,這是有原因的。因為封裝好了才能繼承,封裝和繼承都是為多態做準備的。 多態的三個前提條件: 1、繼承關係 2、方法的重寫 3、向上轉型(即 ...
  • 定義: 定義: 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 結構:(書中圖,侵刪) 一個定義整體框架的父類 若幹不同具體實現的子類 實例: 我瞬間就想到了很多RPG游戲。 不同職業在新手村完成任務,最多就是打的怪名字 ...
  • 前言 對於大部分程式員來說,主要工作都是進行編碼以及一些簡單的中間件安裝,這就導致了很多人對於“運維”相關的工作會比較生疏。例如當我們擁有一臺自己的伺服器以後,可能會在上面跑一跑自己blog程式,mysql,nginx等等。當程式越來越多了沒有一個統一的入口管理啟停,也可能會遇到一些特殊的原因導致程 ...
  • 繼承定義 繼承是使代碼可以復用的重要手段,也是面向對象程式設計的核心思想之一。 繼承就是不修改原有的類,直接利用原來的類的屬性和方法併進行擴展。原來的類稱為基類,繼承的類稱為派生類,他們的關係就像父子一樣,所以又叫父類和子類。 一般格式如下: 派生類成員可以訪問基類的 public成員 和 prot ...
  • 1、字典 字典:一系列鍵-值對,每一個鍵都與每一個值相關聯。與鍵相關聯的值可以是數字、字元串、列表和字典。 最簡單的字典只有一個鍵值對。 eg: alien = {'color':'green','points':5} 2、訪問字典 print(alien['color']) 列印結果:green ...
  • 原創不易,如需轉載,請註明出處 "https://www.cnblogs.com/baixianlong/p/10697554.html" ,多多支持哈! 一、什麼是GC? GC是垃圾收集的意思,記憶體處理是編程人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提 ...
  • 1. Spring Boot簡介 初次接觸Spring的時候,我感覺這是一個很難接觸的框架,因為其龐雜的配置文件,我最不喜歡的就是xml文件,這種文件的可讀性很不好。所以很久以來我的Spring學習都是出於停滯狀態的。 不過這種狀態在我接觸了Spring Boot之後,就發生了改變。Spring官方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...