JSPラベル作動原理
最近はchronicalesのjavaプロジェクトをしています。自分のjava web関連の様々な技術が希薄であることを発見しました。そこで自分にリストを作って、できないもの、強化すべきものを全部書いて、もうちょっと見てください。そして学習の成果を少し記録します。本文は主にJSPラベルの仕事原理を説明します。まずJSPファイルを見ます。
Drag the story here to add to the 52 week list... You already have 52 stories, so we will be swapping stories. ${model.storyTruncatedTitle}上のような形をしたjspコードは2番目で、3行はtaglibタグを使用していくつかのタブライブラリを導入し、それぞれのプレフィックスをcとfnと定義した。それから、c:forEachなどのラベルを使って埋め込みスクリプトを書くことができます。でも、このラベルはどうやって働いていますか?Intellijでcommand+Bを使用してこれらのラベルの定義ファイルに来ました。tldファイルであることが分かりました。
ここには一つのラベルだけがくっついています。つまり、チョイスの定義には名前と説明以外に、それぞれのラベルが一つのjavaクラスに対応しています。これらのラベルの役割はこれらのクラスで定義されています。これらのjavaコードはどのように書かれていますか?このリンクを参照してください。自分でカスタマイズしたラベルライブラリを書いてもいいです。必要があれば。したがって、jarパッケージ+tldファイルはラベルライブラリを定義しています。
JSTL 1.1 core library JSTL core 1.1 c http://java.sun.com/jsp/jstl/core ;Provides core validation features for JSTL tags. org.apache.taglibs.standard.tlv.JstlCoreTLV ................ Simple conditional tag that establishes a context for mutually exclusive conditional operations, marked by :when and otherwise. choose org.apache.taglibs.standard.tag.common.core.ChooseTag JSP
上記のjspファイルには下記のコードでtaglibを導入しました。
uriを通してtldファイルを特定しますが、このような一つのブラウザはoracleサイトに転向します。そして、ラベル情報が得られないurlはどうしてtldファイルを見つけてくれますか?答えはweb.xmlで構成されています。一般的にweb.xmlにtaglibの定義があります。以下のとおりです
これはこの意味のあるハードディスクのパス「/taglib.tld」に相当します。別名、つまり、urlに似ているuriです。そしてjspで引用できます。しかし、chronicalesのコードを見たら、web.xmlにはこのような定義がないことが分かりました。甚だ疑わしい。今日一日探してやっと答えを見つけました。上のtldファイルに戻ると、このような行が見られます。
http://www.example.com/taglib /taglib.tld
http://java.sun.com/jsp/jstl/core
このtldファイルはstandar.jarというファイルに含まれています。このjarカバンはウェブ/libの下に置いてあります。つまり、classpathの下に置いてあります。jarファイルを開けば、二つのフォルダがあります。org、META-INF。一つ目はもちろんpackage名です。二つ目のファイルには多くのtldファイルが含まれています。各tdにはuriというラベルがあります。uriを指定します。このように、jspファイルはclassipatの下のすべてのMETA-INFフォルダをスキャンして中のtldファイルを探して、uriが一致することに出会うならばこのファイルを指定します。それから実験をして、standar.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/corOKです
もう二つの刺激的な実験をして、tldファイルを拷問して、META-INFと同じレベルのカタログとorgディレクトリの下に置いても、全部見つけられます。検索の範囲は本当に大きいです。だから、jspはすべてのクラスパスとそのすべてのサブディレクトリの下で検索すると結論しました。それなら、classipathの下にjarカバンがたくさんある時、スキャンが遅くなりますか?あるいはインデックスキャッシュの仕組みがありますよね。