卷妹的成長日記之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();