1. 程式人生 > >JSP標籤工作原理

JSP標籤工作原理

<taglib>
   <taglib-uri>
     http://www.example.com/taglib
   </taglib-uri>
   <taglib-location>
     /taglib.tld
 
   </taglib-location>
 </taglib>

這就相當於給這個有意義的硬碟路徑“/taglib.tld”了一個別名,也就是那個看似url的uri。然後就可以在jsp中引用了。但是我看chronicles的程式碼是,發現web.xml中並沒有這樣的定義。如是甚是納悶。今天找了一天終於找到了答案。回到上面的tld檔案,可以看到這樣一行:

  <uri>http://java.sun.com/jsp/jstl/core</uri>

  這個tld檔案是包含在一個叫做standard.jar的檔案中的,該jar包放到了web/lib下,也就是放到了classpath下面。開啟jar檔案發現有兩個資料夾:org, META-INF。第一個當然就是package名了,在第二個檔案裡包含了一大堆tld檔案。每個tld都有uri這個標籤來指定一個uri。於是可以大概猜測,jsp檔案掃描classpat下的所有META-INF資料夾找裡面的tld檔案,如果遇到uri匹配的就指定該檔案。然後做了個實驗,把standard.jar解壓,改變裡面的uri標籤,比如對於該例,把 http://java.sun.com/jsp/jstl/core 改成 http://java.sun.com/jsp/jstl/cor

。然後再打包替換原來的檔案。再到intellij裡面看jsp檔案裡引用taglib的那些程式碼都紅了,也就是說找不到了。再把引用的那個uri變成跟我在jar包裡修改的一樣,即http://java.sun.com/jsp/jstl/cor,就ok了。

  再做兩個令人髮指的實驗,把tld檔案拷出來,分別放到和META-INF平級的目錄下和org目錄下,竟然也都能找到。看到它搜尋的範圍還真不小。所以結論是jsp會在所有的classpath及其所有子目錄下進行去搜索。那麼classpath下有很多jar包的時候掃描會不會特別慢,或者有一些索引快取機制吧。