Servlet 3 0 新特性詳解(四)可插性支援

2021-06-29 10:14:43 字數 1654 閱讀 2474

如果說 3.0 版本新增的註解支援是為了簡化 servlet/ 過濾器 / ***的宣告,從而使得 web.xml 變為可選配置, 那麼新增的可插性 (pluggability) 支援則將 servlet 配置的靈活性提公升到了新的高度。熟悉 struts2 的開發者都知道,struts2 通過外掛程式的形式提供了對包括 spring 在內的各種開發框架的支援,開發者甚至可以自己為 struts2 開發外掛程式,而 servlet 的可插性支援正是基於這樣的理念而產生的。使用該特性,現在我們可以在不修改已有 web 應用的前提下,只需將按照一定格式打成的 jar 包放到 web-inf/lib 目錄下,即可實現新功能的擴充,不需要額外的配置。

servlet 3.0 引入了稱之為「web 模組部署描述符片段」的 web-fragment.xml 部署描述檔案,該檔案必須存放在 jar 檔案的 meta-inf 目錄下,該部署描述檔案可以包含一切可以在 web.xml 中定義的內容。jar 包通常放在 web-inf/lib 目錄下,除此之外,所有該模組使用的資源,包括 class 檔案、配置檔案等,只需要能夠被容器的類載入器鏈載入的路徑上,比如 classes 目錄等。

現在,為乙個 web 應用增加乙個 servlet 配置有如下三種方式 ( 過濾器、***與 servlet 三者的配置都是等價的,故在此以 servlet 配置為例進行講述,過濾器和***具有與之非常類似的特性 ):

<?xml version="1.0" encoding="utf-8"?>

fragment

footmark.servlet.fragmentservlet

/fragment

從上面的示例可以看出,web-fragment.xml 與 web.xml 除了在頭部宣告的 xsd 引用不同之外,其主體配置與 web.xml 是完全一致的。

由於乙個 web 應用中可以出現多個 web-fragment.xml 宣告檔案,加上乙個 web.xml 檔案,載入順序問題便成了不得不面對的問題。servlet 規範的專家組在設計的時候已經考慮到了這個問題,並定義了載入順序的規則。

web-fragment.xml 包含了兩個可選的頂層標籤,和 ,如果希望為當前的檔案指定明確的載入順序,通常需要使用這兩個標籤,主要用於標識當前的檔案,而 則用於指定先後順序。乙個簡單的示例如下:

fragmenta

fragmentb

fragmentc

...

如上所示, 標籤的取值通常是被其它 web-fragment.xml 檔案在定義先後順序時引用的,在當前檔案中一般用不著,它起著標識當前檔案的作用。

在 標籤內部,我們可以定義當前 web-fragment.xml 檔案與其他檔案的相對位置關係,這主要通過 的 和 子標籤來實現的。在這兩個子標籤內部可以通過 標籤來指定相對應的檔案。比如:

fragmentb

fragmentc

以上片段則表示當前檔案必須在 fragmentb 和 fragmentc 之後解析。的使用於此相同,它所表示的是當前檔案必須早於 標籤裡所列出的 web-fragment.xml 檔案。

除了將所比較的檔案通過 在 和 中列出之外,servlet 還提供了乙個簡化的標籤 。它表示除了當前檔案之外的其他所有的 web-fragment.xml 檔案。該標籤的優先順序要低於使用 明確指定的相對位置關係。

servlet3 0 非同步處理

servlet3.0提供了非同步處理的功能,在以前的servlet規範中,如果servlet作為控制器呼叫了乙個耗時的業務方法,那麼servlet必須等到業務方法完全返回之後才會生成響應,這使得servlet對業務方法的呼叫變成一種阻塞式的呼叫,效率較低。servlet3.0規範引入了非同步處理來解...

Servlet3 0註解開發

在建立servlet時,servlet的配置資訊都是在web.xml中完成的。如果我們建立的servlet非常多,就會導致web.xml的配置非常臃腫,不便於管理。servlet3.0為我們提供了註解支援,建立servlet時,在這個servlet類上面新增註解就可以完成servlet的配置。ser...

Servlet 3 0中的非同步處理

在以前的servlet規範化,如果servlet作為控制器呼叫了乙個耗時的業務方法,那麼必須等到業務方法完全返回之後才能生成響應,這將使用servlet對業務方法的呼叫變成一種阻塞式的呼叫,因此效率比較低。servlet3.0規範引入了非同步處理來解決這個問題,非同步處理允許servlet重新發起一...