JavaEE細節問題04——Servlet細節問題

1.<url-patten>的優先級問題

你們都知道,在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



2.缺省Servlet和訪問靜態web資源的本質

若是某個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。 

3.改寫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>


4.建立一個Servlet對象不止一種方式

1.繼承HttpServlet

2.繼承GenericServlet

3.實現Servlet接口


5.ServletConfig對象的細節

其實這個對象的功能很簡單,就是獲取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實例化的!

相關文章
相關標籤/搜索