天天看點

卷妹的成長日記之javaweb day12

卷妹的成長日記之javaweb day12

👩‍💻部落格首頁:京與舊鋪的部落格首頁

✨歡迎關注🖱點贊🎀收藏⭐留言✒

🔮本文由京與舊鋪原創

😘系列專欄:java學習

👕參考網站:動力節點

💻首發時間:🎞2022年8月26日🎠

🎨你做三四月的事,八九月就會有答案,一起加油吧

🀄如果覺得部落客的文章還不錯的話,請三連支援一下部落客哦

分析使用純粹Servlet開發web應用的缺陷

  • 在Servlet當中編寫HTML/CSS/JavaScript等前端代碼。存在什麼問題?
  • java程式中編寫前端代碼,編寫難度大。麻煩。
  • java程式中編寫前端代碼,顯然程式的耦合度非常高。
  • java程式中編寫前端代碼,代碼非常不美觀。
  • java程式中編寫前端代碼,維護成本太高。(非常難于維護)
  • 修改小小的一個前端代碼,隻要有改動,就需要重新編譯java代碼,生成新的class檔案,打一個新的war包,重新釋出。
  • 思考一下,如果是你的話,你準備怎麼解決這個問題?
  • 思路很重要。使用什麼樣的思路去做、去解決這個問題
  • 上面的那個Servlet(Java程式)能不能不寫了,讓機器自動生成。我們程式員隻需要寫這個Servlet程式中的“前端的那段代碼”,然後讓機器将我們寫的“前端代碼”自動翻譯生成“Servlet這種java程式”。然後機器再自動将“java”程式編譯生成"class"檔案。然後再使用JVM調用這個class中的方法。

關于B/S結構系統的會話機制(session機制)

  • 什麼是會話?
  • 會話對應的英語單詞:session
  • 使用者打開浏覽器,進行一系列操作,然後最終将浏覽器關閉,這個整個過程叫做:一次會話。會話在伺服器端也有一個對應的java對象,這個java對象叫做:session。
  • 什麼是一次請求:使用者在浏覽器上點選了一下,然後到頁面停下來,可以粗略認為是一次請求。請求對應的伺服器端的java對象是:request。
  • 一個會話當中包含多次請求。(一次會話對應N次請求。)
  • 在java的servlet規範當中,session對應的類名:HttpSession(jarkata.servlet.http.HttpSession)
  • session機制屬于B/S結構的一部分。如果使用php語言開發WEB項目,同樣也是有session這種機制的。session機制實際上是一個規範。然後不同的語言對這種會話機制都有實作。
  • session對象最主要的作用是:儲存會話狀态。(使用者登入成功了,這是一種登入成功的狀态,你怎麼把登入成功的狀态一直儲存下來呢?使用session對象可以保留會話狀态。)
  • 為什麼需要session對象來儲存會話狀态呢?
  • 因為HTTP協定是一種無狀态協定。
  • 什麼是無狀态:請求的時候,B和S是連接配接的,但是請求結束之後,連接配接就斷了。為什麼要這麼做?HTTP協定為什麼要設計成這樣?因為這樣的無狀态協定,可以降低伺服器的壓力。請求的瞬間是連接配接的,請求結束之後,連接配接斷開,這樣伺服器壓力小。
  • 隻要B和S斷開了,那麼關閉浏覽器這個動作,伺服器知道嗎?
  • 不知道。伺服器是不知道浏覽器關閉的。
  • 張三打開一個浏覽器A,李四打開一個浏覽器B,通路伺服器之後,在伺服器端會生成:
  • 張三專屬的session對象
  • 李四專屬的session對象
  • 為什麼不使用request對象儲存會話狀态?為什麼不使用ServletContext對象儲存會話狀态?
  • request.setAttribute()存,request.getAttribute()取,ServletContext也有這個方法。request是請求域。ServletContext是應用域。
  • request是一次請求一個對象。
  • ServletContext對象是伺服器啟動的時候建立,伺服器關閉的時候銷毀,這個ServletContext對象隻有一個。
  • ServletContext對象的域太大。
  • request請求域(HttpServletRequest)、session會話域(HttpSession)、application域(ServletContext)
  • request < session < application
  • 思考一下:session對象的實作原理。
  • HttpSession session = request.getSession();
  • 這行代碼很神奇。張三通路的時候擷取的session對象就是張三的。李四通路的時候擷取的session對象就是李四的。
  • session的實作原理:
  • JSESSIONID=xxxxxx 這個是以Cookie的形式儲存在浏覽器的記憶體中的。浏覽器隻要關閉。這個cookie就沒有了。
  • session清單是一個Map,map的key是sessionid,map的value是session對象。
  • 使用者第一次請求,伺服器生成session對象,同時生成id,将id發送給浏覽器。
  • 使用者第二次請求,自動将浏覽器記憶體中的id發送給伺服器,伺服器根據id查找session對象。
  • 關閉浏覽器,記憶體消失,cookie消失,sessionid消失,會話等同于結束。
  • Cookie禁用了,session還能找到嗎?
  • cookie禁用是什麼意思?伺服器正常發送cookie給浏覽器,但是浏覽器不要了。拒收了。并不是伺服器不發了。
  • 找不到了。每一次請求都會擷取到新的session對象。
  • cookie禁用了,session機制還能實作嗎?
  • 可以。需要使用URL重寫機制。
  • ​​http://localhost:8080/servlet12/test/session;jsessionid=19D1C99560DCBF84839FA43D58F56E16​​
  • URL重寫機制會提高開發者的成本。開發人員在編寫任何請求路徑的時候,後面都要添加一個sessionid,給開發帶來了很大的難度,很大的成本。是以大部分的網站都是這樣設計的:你要是禁用cookie,你就别用了。
  • 總結一下到目前位置我們所了解的域對象:
  • request(對應的類名:HttpServletRequest)
  • 請求域(請求級别的)
  • session(對應的類名:HttpSession)
  • 會話域(使用者級别的)
  • application(對應的類名:ServletContext)
  • 應用域(項目級别的,所有使用者共享的。)
  • 這三個域對象的大小關系
  • request < session < application
  • 他們三個域對象都有以下三個公共的方法:
  • setAttribute(向域當中綁定資料)
  • getAttribute(從域當中擷取資料)
  • removeAttribute(删除域當中的資料)
  • 使用原則:盡量使用小的域。
  • session掌握之後,我們怎麼解決oa項目中的登入問題,怎麼能讓登入起作用。
  • 登入成功之後,可以将使用者的登入資訊存儲到session當中。也就是說session中如果有使用者的資訊就代表使用者登入成功了。session中沒有使用者資訊,表示使用者沒有登入過。則跳轉到登入頁面。
  • 銷毀session對象:
session.invalidate();