深入理解Java Web——Servlet

1、概述

狹義上看,是java的一個接口。
廣義上看,任何直接或間接實現了Servlet接口的類。

2、核心對象

下面就是Servlet接口的內容:

public abstract interface javax.servlet.Servlet {

 //初始化
  public abstract void init(javax.servlet.ServletConfig arg0) throws javax.servlet.ServletException;

  //部署時的配置信息,對應的是每個Servlet。
  public abstract javax.servlet.ServletConfig getServletConfig();

 //核心service方法,負責跳轉到post或get方法中執行。
  public abstract void service(javax.servlet.ServletRequest arg0, javax.servlet.ServletResponse arg1) throws javax.servlet.ServletException, java.io.IOException;


  public abstract java.lang.String getServletInfo();

//銷燬
  public abstract void destroy();
}

Servlet的兩個抽象類:

這裏寫圖片描述

其中:
GenericServlet 抽象類實現了大部分的Servlet方法。
HttpServlet實現了一個service方法來反應servlet的http特性。

3、生命週期

servlet沒有main方法,他們受控於一個java應用——容器。Servlet必須運行在web服務器中,web服務器也可以叫做web容器(比如tomcat)。二者是分工和互補的關係。web容器管理Servlet的生命週期,脫離web容器的Servlet便不能工作。

servlet的生命週期大致分爲五部分:裝載、實例化、init()、service()、destroy()。

首先,容器負責加載Servlet類,之後通過構造函數實例化servlet對象。在得到客戶端servlet請求之前完成init()操作,之後是執行請求的service的方法。之後如果不再使用時,執行destroy方法。

得到servlet請求之後,tomcat並不把這個請求交給servlet本身,而是交給部署該servlet的容器。

這裏寫圖片描述

此外,web容器還有其他的作用。比如:通信,支持多線程和jsp等等。

4、單實例,多線程。

一個web容器可以管理或存放多個servlet,比如:用戶管理的servlet,商品管理的servlet等。

但對於提交到同一個servlet類的多個業務請求,共享一個servlet對象。比如:一個查詢用戶信息的請求和一個刪除用戶的請求共享同一個servlet對象。這就是所說的servlet單實例。

servlet體系結構是建立在java多線程機制之上的, servlet容器會自動使用線程池等技術來支持系統的運行。

思考:Servlet是線程安全的嗎?

如果一句話回答安全或者不安全,這未免有些太過於籠統。
Servlet有三個作用域:上下文(Context)、會話(Session)和請求(request)。其中,前兩個都是線程不安全的,只有在請求request中是線程安全的。

比較三個作用域:

名稱 範圍 特點
上下文 相當於全局變量,範圍最大 減少數據庫操作,供所有用戶
會話 會話範圍,類似局部變量 每個用戶享有自己信息
請求 範圍在一次請求中 用完就扔

小結:

如果我們只是在請求的範圍內,則不需要考慮線程安全的問題。除此之外,都會涉及到“共享變量”的問題,就要考慮如何實現線程安全了。其中最常用的方法是使用synchronized關鍵字,但要注意鎖定的範圍。如果在doPost()或doGet()方法上加synchronized,範圍過大。servlet就變成了實實在在的單線程了,根本沒辦法處理併發,這樣做雖然安全,但性能太差,也違背了servlet設計者的初衷,是絕對不可取的。加鎖範圍的思路是,如果此範圍中你所操作的對象有可能被其他人訪問到,那就加鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章