Servlet面试题
Servlet面試題
- servlet的生命周期
- servlet的線程安全問題
- 如何解決?
- get 與 post 區別
servlet的生命周期
servlet初始化—init()方法
①第一次創建Servlet時調用,只會執行一次初始化
②默認是第一次處理請求時創建Servlet,也可以設置為服務器第一次啟動時就創建Servlet
servlet處理請求:service()方法
①處理來自瀏覽器的請求,將處理后的結果響應給瀏覽器
②servlet接收到請求后,調用service方法來進行處理,service中針對不同的請求進行匹配,選擇調用doPost或doGet等方法
③在編寫servlet時,需要實現doPost/doGet等方法
servlet長時間沒有被調用或服務器關閉,會調用destroy()方法銷毀servlet,由JVM垃圾回收器來回收servlet
destroy方法只會執行一次
執行后,該servlet被標記為垃圾,等待回收
servlet的線程安全問題
servlet不是線程安全的
servlet是單例的,初始化后,只有長時間不再接受請求或容器關閉時,這個servlet才會銷毀,多個請求線程都訪問的是這一個servlet
一個servlet在處理第一次請求前進行實例化,初始化。或在容器啟動時初始化(需要設置)
后續調用這個servlet的請求,都是獨立的線程來調用service方法,存在線程安全問題
如何解決?
不在servlet中使用成員變量,線程之間沒有資源競爭,線程安全
使用ThreadLocal為每個線程提供一份獨立的變量
給處理請求的方法加鎖;造成阻塞
protected synchronized void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }實現SingleThreadModel接口;會為每個用戶創建一個servlet實例,性能差(已棄用)
public class DormServlet extends HttpServlet implements SingleThreadModelget 與 post 區別
HTTP請求默認使用get
| 參數在url中 | 參數在 resquest body 請求體中 |
| 有長度限制 | 沒有長度限制 |
| 暴露在url中,不安全 | 隱藏在請求體中,安全 |
| 只能url編碼 | 支持多種編碼 |
| 產生一個TCP數據包 | 產生兩個TCP數據包 |
| 獲取服務器中的數據 | 修改服務器上的數據 |
總結
以上是生活随笔為你收集整理的Servlet面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字节取消大小周,部分员工:心疼,每个月少
- 下一篇: 帮一个读者解锁手机