在javax.servlet.servlet中的Servlet接口,聲明有5個方法,簽名以下:java
public void int(ServletConfig config) throws ServletException; public void service(ServletRequest request, ServletResponse reesponse) throws ServletException, IOException; public vid destroy(); public ServletConfig getServletConfig(); public String getServletInfo();
這個5個方法中,init(), sercie(), destroy() 是與servlet的聲明週期相關的。當實例化某個servlet類後,servlet容器會調用其init()方法進行一次,而且在這個生命週期內只調用一次。在servlet接受任何請求以前,必須色通過正確實例化的。而一個請求到達servlet的時候,容器就調用其service()方法,並將 javax.servlet.servletRequst對象和 javax.servlet.servletResponse對象做爲參數傳入。在將servet從服務器中移除前,servlet容器會調用servet實例的destroy()方法,這時候就有機會讓servlet對象去清除自身持有的資源。通常是容器關閉,或者是servlet容器內存要回收的時候,纔會將servet實例移除。服務器
通常定義一個Servlet只要實現Servlet接口便可。以下:
code
public class PrimitiveServlet implements Servlet{ public void init(ServletConfig config) throws ServletException{ System.out.println("init."); } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{ System.out.println("service"); PrintWriter pw = request.getWriter(); pw.println("Hello, Red Rose."); } public void destroy(){ System.out.println("destroy"); } /* 還有兩個方法沒補充 */ }
那麼如何使用這個Servlet呢,下面咱們來構造一個簡單的Servlet容器。下面是UML類圖對象
簡單分析一下流程:接口
在HttpServer1中負責處理客戶端鏈接,爲每一個鏈接生成請求Request和響應Response實例,經過request的URI類型來判斷是請求是否是一個Servlet,若是是,將其交給ServletProcessor的process()方法,將request和response做爲參數傳入。生命週期
先撇開一下,提及Request和Response。它們就分別表明了服務器端爲請求和響應生成的結果,裏面天然包含有一些屬性了,那麼可以設置與返回這些屬性呢?典型的Java服務器端開發都離不開Socket與SocketServer,沒錯,就是用取得的表明客戶鏈接的Socket來取得輸入輸出流,進而得到那些客戶端的參數的。那麼請求固然包括有就解析的部分啦,Request裏面就有一個簡單的parse()方法。
內存
回來,在Request與Response交由ServletProcessor中的process()方法後,就開始加載這個Servlet,這個Servet就是咱們的PrimiteServlet了。加載固然是從class文件作起,也就是說要用到ClassLoader了,加載完成以後反射生成Servlet實例,接着調用Servlet實例的service()方法,傳入request和response,服務器端的開發人員的處理工做就開始了。
ci