SUN公司定義Servlet規範,其中Servlet API是這樣定義的:A servlet is a small Java program that runs withina Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, theHyperText Transfer Protocol.
a、直接或間接地實現javax.servlet.Servlet接口(或繼承javax.servlet.GenricServlet)html
b、在web.xml中對自定義的Servlet進行配置,映射到URL地址上.java
To implement this interface, you can write a generic servlet that extends javax.servlet.GenericServlet or an HTTP servlet that extends javax.servlet.http.HttpServlet.
Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求後: 1.Web服務器首先檢查是否已經裝載並建立了該Servlet的實例對象。若是是,則直接執行第④步,不然,執行第②步。 2.裝載並建立該Servlet的一個實例對象。 3.調用Servlet實例對象的init()方法。 4.建立一個用於封裝HTTP請求消息的HttpServletRequest對象和一個表明HTTP響應消息的HttpServletResponse對象, 而後調用Servlet的service()方法並將請求和響應對象做爲參數傳遞進去。 5.WEB應用程序被中止或從新啓動以前,Servlet引擎將卸載Servlet,並在卸載以前調用Servlet的destroy()方法。
因爲Servlet是一個供其餘Java程序(Servlet引擎)調用的Java類,它不能獨立運行,它的運行徹底由Servlet引擎來控制和調度。web
針對客戶端的屢次Servlet請求,一般狀況下,服務器只會建立一個Servlet實例對象,也就是說Servlet實例對象一旦建立,它就會駐留在內存中,爲後續的其它請求服務,直至web容器退出,servlet實例對象纔會銷燬。數據庫
在Servlet的整個生命週期內,Servlet的init方法只被調用一次。而對一個Servlet的每次訪問請求都致使Servlet引擎調用一次servlet的service方法。對於每次訪問請求,Servlet引擎都會建立一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,而後將這兩個對象做爲參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分別調用do相關方法。 apache
總結: 什麼時候建立?用戶第一次訪問Servlet時。由容器進行實例化,接着調用init(ServletConfig config)方法. 什麼時候活着?只要建立一次,就主流服務器內存。即一個Servlet對象被建立一次,初始化也是一次. 什麼時候銷燬?應用被卸載時,服務器就會調用destory()方法.
若是在<servlet>元素中配置了一個<load-on-startup>元素,那麼WEB應用程序在啓動時,就會裝載並建立Servlet的實例對象、以及調用Servlet實例對象的init()方法。 舉例: <servlet> <servlet-name>invoker</servlet-name> <servlet-class> org.apache.catalina.servlets.InvokerServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> 用途:爲web應用寫一個InitServlet,這個servlet配置爲啓動時裝載,爲整個web應用建立必要的數據庫表和數據.
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 在${CATALINA_HOME}\conf\web.xml文件中,註冊了一個名稱爲org.apache.catalina.servlets.DefaultServlet的Servlet,並將這個Servlet設置爲了缺省Servlet。當訪問Tomcat服務器中的某個靜態HTML文件和圖片時,其實是在訪問這個缺省Servlet。
1.URL的映射設計模式
2.線程安全問題安全
解決併發出現的問題,能夠採用如下方式: 1.使用Java同步機制對多線程同步:運行效率低 2.使用SingleThreadModel接口 3.合理決定在Servlet中定義的變量的做用域
咱們知道 Java Web 應用是基於 Servlet 規範運轉的,那麼 Servlet 自己又是如何運轉的呢?爲什麼要設計這樣的體系結構。服務器
從上圖能夠看出 Servlet 規範就是基於這幾個類運轉的,與 Servlet 主動關聯的是三個類,分別是 ServletConfig、ServletRequest 和 ServletResponse。這三個類都是經過容器傳遞給 Servlet 的,其中 ServletConfig 是在 Servlet 初始化時就傳給 Servlet 了,然後兩個是在請求達到時調用 Servlet 時傳遞過來的。咱們很清楚 ServletRequest 和 ServletResponse 在 Servlet 運行的意義,可是 ServletConfig 和 ServletContext 對 Servlet 有何價值?仔細查看 ServletConfig 接口中聲明的方法發現,這些方法都是爲了獲取這個 Servlet 的一些配置屬性,而這些配置屬性可能在 Servlet 運行時被用到。而 ServletContext 又是幹什麼的呢? Servlet 的運行模式是一個典型的「握手型的交互式」運行模式。所謂「握手型的交互式」就是兩個模塊爲了交換數據一般都會準備一個交易場景,這個場景一直跟隨個這個交易過程直到這個交易完成爲止。這個交易場景的初始化是根據此次交易對象指定的參數來定製的,這些指定參數一般就會是一個配置類。因此對號入座,交易場景就由 ServletContext 來描述,而定製的參數集合就由 ServletConfig 來描述。而 ServletRequest 和 ServletResponse 就是要交互的具體對象了,它們一般都是做爲運輸工具來傳遞交互結果。多線程
ServletConfig 是在 Servlet init 時由容器傳過來的,那麼 ServletConfig 究竟是個什麼對象呢?併發
下圖是 ServletConfig 和 ServletContext 在 Tomcat 容器中的類關係圖。
上圖能夠看出 StandardWrapper 和 StandardWrapperFacade 都實現了 ServletConfig 接口,而 StandardWrapperFacade 是 StandardWrapper 門面類。因此傳給 Servlet 的是 StandardWrapperFacade 對象,這個類可以保證從 StandardWrapper 中拿到 ServletConfig 所規定的數據,而又不把 ServletConfig 不關心的數據暴露給 Servlet。
一樣 ServletContext 也與 ServletConfig 有相似的結構,Servlet 中能拿到的 ServletContext 的實際對象也是 ApplicationContextFacade 對象。ApplicationContextFacade 一樣保證 ServletContex 只能從容器中拿到它該拿的數據,它們都起到對數據的封裝做用,它們使用的都是門面設計模式。
經過 ServletContext 能夠拿到 Context 容器中一些必要信息,好比應用的工做路徑,容器支持的 Servlet 最小版本等。
ServletContext對象WEB容器在啓動時,它會爲每一個WEB應用程序都建立一個對應的ServletContext對象,它表明當前web應用。 ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,能夠經過ServletConfig.getServletContext方法得到ServletContext對象。 因爲一個WEB應用中的全部Servlet共享同一個ServletContext對象,所以Servlet對象之間能夠經過ServletContext對象來實現通信。ServletContext對象一般也被稱之爲context域對象。
獲取域中的存的值: ServletContext sc = getServletConfig().getSerlvetContext(); Void setAttribute(String key,Object v); Object getAttribute(String key); Void removeAttribute(String key);
經過ServletContext對象的經常使用的應用情景: 1.獲取WEB應用的初始化參數。 2.實現Servlet的轉發 3.利用ServletContext對象讀取資源文件。 .properties文件(屬性文件) 獲得文件路徑(ServletContext.getRealPath(), getReaourceAsStream()),URL方式(中文路徑)。 讀取資源文件的三種方式 4.實現文件的下載
參考博客:1. Servlet 工做原理解析
2.http://www.ibm.com/developerworks/cn/education/java/j-intserv/index.html
API:Servlet-API 2.3
結束......