什麼是上下文?什麼是資源名,請求流程是怎麼樣的?

什麼是上下文?什麼是資源名,請求流程是怎麼樣的?

昨晚我在羣裏問了個問題,沒人回答,也許是我過於執着,仍是要說一說!對我我的而言也是一種學習態度,課上講的專業術語,老師不講,本身也要搞明白,這倒底是什麼,任何老師都會在課上講,上下文對象,資源路徑等等!web

那麼,http://localhost:80/day3/hello 這個路徑哪一個是上下文,哪一個是資源名稱?

答案是:上下文 /day3 資源名 /hello瀏覽器

第2個問題,如何經過上下文和資源名找到對應的servlet?

這個就要從發佈項目提及,咱們在eclipse中將項目同步或發佈到tomcat發生了什麼?好下圖的操做,倒底給tomcat帶去什麼樣的變化!緩存

能夠說每發佈一個項目,都會生成一個上下文配置,咱們能夠試一個發佈一個項目,而後到tomcat 下的conf中找到server.xml,打開看一下,會有相似這樣的節點產生:tomcat

<Context docBase="D:\JavaApps\Servlet\webapp" path="day3"/>
<Context docBase="D:\JavaApps\Servlet\webapp1" path="day4"/>

每一行表明一個項目!其中docBase表示真實項目路徑 path表明上下文也就是訪問的根路徑!app

知道了上面這個問題,咱們就能夠知道tomcat如何解析了!eclipse

tomcat 解析流程:

一、瀏覽器先發送請求:http://localhost:80/day3/hellowebapp

二、DNS解析域名post

三、Tomcat解析請求:/day3/hello 獲得上下文 /day3 資源名 /hello學習

四、解析Tomcat根/conf/server.xml文件,獲取其中全部的上下文元素,並找到path屬性爲/day3的元素,再讀取該元素,再獲取docBase屬性值,該屬性值就是當前訪問的WEB項目的根路徑url

五、從該web的根路徑/WEB-INF下找到web.xml文件

<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.gwd.aa.He</servlet-class>
  </servlet>
  <servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
  </servlet-mapping>

六、讀取web.xml文件,獲取全部的 元素,並判斷哪個 的文本內容爲:/hello,若找不到則報404錯誤,不然繼續!

七、經過/hello,找到當前Servlet的全限定名com.gwd.aa.He

八、從Servlet的實例緩衝池中去獲取com.gwd.aa.He對應的對象.(這就是爲何init只執行一次的緣由)

Map<String,Servlet> cache = .....;

  Servlet obj = cache.get("com.gwd.aa.He");

  if(obj == null{

   //第一次請求:GOTO 9.

  }else{
   //非第一次請求:GOTO 12;

九、使用反射建立Servlet對象.

Servlet obj = Class.forName("com.gwd.aa.He").newInstance();

十、把建立的Servlet對象,存儲到Servlet實例緩存池中,供下一次請求使用.

cache.put("com.gwd.aa.He",obj);

十一、容器建立ServletConfig對象,並調用init方法,來完成初始化操做.

obj.init(config);

十二、容器建立ServletRequest和ServletResponse對象,並調用service方法,處理請求.

obj.service(req,resp);

1三、在service方法中,對當前請求的客戶端作相應.

作doget和dopost處理(底程是個模板方法),這個能夠本身寫個模板方法體驗一下!

Servletcontext對象和ServletConfig對象的區別

前者當前項目有效,後者對當前servlet有效,拿xml初始參數來講ServletConfig只能獲取當前Servlet的參數,而Servletcontext獲取的是整個項目共有的設置,咱們開發中通常用Servletcontext,由於ServletConfig太麻煩,每個url都要單獨配!

今日能夠擴展的(模板方法 ServletConfig經常使用方法 Servletcontext經常使用方法 servlet繼承體系 )

相關文章
相關標籤/搜索