2014-05-21 86 views
3

在servlet 3.0之前,需要通過提供url模式和servlet類在web.xml中配置servlet。每當請求發送servlet時,tomcat都會在web.xml中搜索servlet類,並根據請求的類型調用doget或dopost。 在servlet 3.0中,我們可以使用像@WebServlet這樣的註釋來配置servlet類中的servlet。 我的問題是tomcat在這種情況下如何識別servlet類,如web.xml中沒有爲servlet指定的映射。tomcat如何識別帶註釋的servlet?

在此先感謝。

+1

嘗試使用Google搜索'註釋掃描' –

+1

通過實現['Processor'](http://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html)接口。 –

+2

檢查此:[建立你自己的註釋處理器](http://tutortutor.ca/cgi-bin/makepage.cgi?/articles/byoap) –

回答

6

Tomcat掃描Web應用程序的類文件(都在WEB-INF /類和JAR下)。然後將類文件傳遞給Apache Commons字節代碼工程庫(BCEL)的大量編輯後的包,並重命名爲本地副本。 Tomcat的BCEL版本經過優化,僅處理Tomcat感興趣的字節代碼的部分(註釋,超類(如果有的話),已實現的接口),並儘可能快地跳過其餘​​部分。 BCEL直接從磁盤讀取類文件。

Tomcat對BCEL的結果做了一些細緻的緩存,因此即使是最複雜的類層次結構,每個類也只處理過一次,如果註釋(包括從超類)爲任何類。

註釋掃描還會檢查與SCI的@HandlesTypes註釋的匹配。

掃描每個類的註釋是昂貴的,但你這樣做(和我不是這個特定功能的粉絲之一的原因之一)。在達到目前使用的高效實施之前,Tomcat的實現經歷了幾次迭代。

+0

感謝您獲取更簡短的信息thomas。我經歷了谷歌的許多帖子,但沒有得到滿意的描述。你知道任何文件,我可以找到完整的解釋嗎? –

+0

有趣...我真的不知道,tomcat用戶BCEL而不是反射API註釋解析。 – AlexR

+0

@ sumant.raj由於某種原因,它被稱爲* open * source。你想要org.apache.catalina.startup.ContextConfig類。 –

5

它會掃描所有jar文件下lib目錄和類文件中classes目錄Web應用程序的部署,使用類似clazz = Class.forName(theClassName)代碼獲取類,然後調用clazz.getDeclaredAnnotations()clazz.getAnnotation(WebServlet.class)。比它讀取註釋的屬性來提取servlet映射。

這種方式容器找到所有的servlet,過濾器等及其URL映射。這是引入基於註解的API時引入應用程序部署需要更多時間的原因之一。

很明顯,代碼並不像我說的那麼簡單。例如,它在Web應用程序的專有類加載器的上下文中加載類。它也不會真的調用Class.forName(),而是將該類加載爲字節數組並將其傳遞給類加載器。

+0

感謝您的信息。你知道任何鏈接或書籍,提供詳細的信息。 –

+0

這意味着通過tomcat將註釋轉換爲web.xml映射? –

+0

沒有。即使你的非簡單的解釋是廣泛的標誌。Web應用程序類加載器完全不涉及加載過程。 –