你們都知道,在web.xml中能夠經過配置<servlet>和<servlet-mapping>來讓一個servlet真正跑起來,而讓服務器經過URL定位到java
具體serlvet的標籤就是經過<url-patten> ---> <servlet-name> ---> <servlet-class>web
這樣的定位方式,那麼,用戶在訪問url的時候,到底調用的是哪一個serlvet呢?apache
這裏就涉及到了<url-patten>的優先級問題:tomcat
在配置<url-patten>的時候,遵循以下原則:服務器
精確匹配的優先級最高 /* 的優先級比 *.擴展名高app
若是某個Servlet的映射路徑僅僅爲一個正斜槓(/),那麼這個Servlet就成爲當前Web應用程序的缺省Servlet。 this
凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請求都將交給缺省Servlet處理,url
也就是說,缺省Servlet用於處理全部其餘Servlet都不處理的訪問請求。 spa
在<tomcat的安裝目錄>\conf\web.xml文件中,註冊了一個名稱爲org.apache.catalina.servlets.DefaultServlet的Servlet,code
並將這個Servlet設置爲了缺省Servlet。
當訪問Tomcat服務器中的某個靜態HTML文件和圖片時,其實是在訪問這個缺省Servlet。
Servlet通常狀況下是在用戶第一次請求時建立和初始化
可是經過配置web.xml中的<servlet>中的<load-on-startup>標籤,就可以實現Servlet的自啓動
其中的值最比如1大,由於1是缺省Servlet
web.xml
<servlet> <!--表明加載順序,數字越小越有限加載,取值只能是(1,2,3,...) --> <load-on-startup>2</load-on-startup> </servlet>
1.繼承HttpServlet
2.繼承GenericServlet
3.實現Servlet接口
其實這個對象的功能很簡單,就是獲取Servlet的初始化參數,也就是獲取配置在<init-param>標籤裏的鍵值對。
ServletConfig對象的方法:
如API所示,裏面提供了4中方法。
分別是:
getInitParameter(String name) 獲取一個初始化參數,傳入<param-name>中的值,返回<param-value>中的值。
getInitParameterNames() 獲取一個包含全部<param-name>中值的枚舉
getServletContext() 返回一個ServletContext對象
getServletName() 獲取當前的Servlet名稱,即<servlet-name>中的值
在HttpServlet的子類中獲取其對象能夠有兩種方式:
1.ServletConfig sc = this.getServletConfig();
2.重寫init(ServletConfig config)方法,將做爲參數的ServletConfig對象返回給一個成員變量
private ServletConfig config; public void init(ServletConfig config) throws ServletException { this.config = config; }
那麼問題來了,這個子類是如何獲取到ServletConfig對象的呢?
首先這個類繼承了HttpServlet,那麼咱們看一下HttpServlet的源碼:
這樣就能夠看出,咱們的HttpServlet中也沒有提供相應的方法,那咱們就去他們的父類GenericServlet看看
在GenericServlet中有getServletConfig()和init(ServletConfig config)方法,底層實現其實很簡單:
這時候有一個疑惑,那麼實際上這個config對象又是如何產生的呢?是怎麼被傳進來的呢?
這時候就要看API的解釋了
API解釋說,ServletConfig對象其實是Servlet容器產生的,也就是說是Tomcat實例化了他的對象!
實際上不單單是ServletConfig,包括ServletContext,ServletRequest,ServletResponse,這些對象都是Tomcat實例化的!