Spring mvc源碼分析系列--Servlet的前世今生

Spring mvc源碼分析系列--Servlet的前世今生概述上一篇文章Spring mvc源碼分析系列--前言挖了坑,但是由于最近需求繁忙,一直沒有時間填坑 。今天暫且來填一個小坑 , 這篇文章我們來說說Servlet的發展歷史 。所以這篇文章還是比較輕松,不涉及太多的源碼分析,簡單介紹Servlet的由來和發展 。
Servlet是什么傳說在上世紀90年代,因為nternet和瀏覽器的飛速發展,使得基于瀏覽器的B/S模式隨之火爆發展起來 。最初 , 用戶使用瀏覽器向WEB服務器發送的請求都是請求靜態的資源,比如html、css等 。但是可以想象:根據用戶請求的不同動態的處理并返回資源是理所當然必須的要求 , 例如用戶提交一些東西,服務器就能按提交的內容反饋用戶不同的效果 。所以人們應該非常迫切想要推出一項技術來實現動態的處理,java 為了應對上述需求 , 促進了servlet技術誕生 。
Servlet 是在服務器上運行的小程序 。這個詞是在 Java applet的環境中創造的,Java applet 是一種當作單獨文件跟網頁一起發送的小程序,它通常用于在客戶端運行 , 結果得到為用戶進行運算或者根據用戶互作用定位圖形等服務 。服務器上需要一些程序 , 常常是根據用戶輸入訪問數據庫的程序 。這些通常是使用公共網關接口(Common Gateway Interface,CGI)應用程序完成的 。然而,在服務器上運行 Java,這種程序可使用 Java 編程語言實現 。在通信量大的服務器上,JavaServlet 的優點在于它們的執行速度更快于 CGI 程序 。各個用戶請求被激活成單個程序中的一個線程,而無需創建單獨的進程 , 這意味著服務器端處理請求的系統開銷將明顯降低 。不清楚CGI是什么?這篇文章CGI是什么可以解答你的疑問 。
Servlet與 CGI 比較存在的優點如下:

  • 與傳統的 CGI 和許多其他類似 CGI 的技術相比,Java Servlet 具有更高的效率,更容易使用,功能更強大,具有更好的可移植性,更節省投資 。在未來的技術發展過程中,Servlet 有可能徹底取代 CGI 。
  • 在傳統的 CGI中,每個請求都要啟動一個新的進程,如果 CGI 程序本身的執行時間較短,啟動進程所需要的開銷很可能反而超過實際執行時間 。而在 Servlet 中,每個請求由一個輕量級的 Java 線程處理(而不是重量級的操作系統進程) 。
  • 在傳統 CGI 中,如果有 N 個并發的對同一 CGI程序的請求,則該CGI程序的代碼在內存中重復裝載了 N 次;而對于 Servlet,處理請求的是 N 個線程,只需要一份 Servlet 類代碼 。在性能優化方面,Servlet 也比 CGI 有著更多的選擇 。
Servlet可以說是Java技術中最早的Web解決方案,Servlet與普通Java類的編寫非常類似 。在Servlet中可以通過挨著行輸出Html等語句來實現頁面的樣式和輸出,數據的動態功能當然也就實現了 。表現、邏輯、控制、業務全部混在Servlet類中 。下面給出一個簡單例子來直觀感受一下 。
public void doGet(HttpServletRequest request,HttpServletResponse)throws IOException,ServletException{response.setContentType("text/html;charset=gb2312");PrintWriter out = response.getWriter();out.println("<html>");out.println("<head><title>Hello World!</title></head>");out.println("<body>");out.println("<p>Hello World!</p>");out.println("</body></html>");}Servlet是怎么運行的上一小節介紹到,Servlet是用于處理動態響應客戶端請求的 。那么Servlet是運行在哪里的呢?
最早支持 Servlet 技術的是 JavaSoft 的 Java Web Server 。此后,一些其它的基于 Java 的 Web Server 開始支持標準的 Servlet API 。Servlet 的主要功能在于交互式地瀏覽和修改數據,生成動態 Web 內容 。
還記得上一篇文章里的靈魂拷問嗎? 瀏覽器的一個請求,是如何精確到達你的web服務器里的業務邏輯里的,其中經歷的流程能說個所以然嗎,這個過程為:
  1. 客戶端發送請求至服務器端 。
  2. 服務器將請求信息發送至 Servlet 。
  3. Servlet 生成響應內容并將其傳給服務器 。響應內容動態生成,通常取決于客戶端的請求 。
  4. 服務器將響應返回給客戶端 。
以上的每一步都包含著大量的細節,現在廣泛使用的web服務器是Tomcat,以Tomcat為例,簡單分析一下以上的四步: