要在OSGi容器中動態的管理Web相關的元素,目前有兩種方式。
一種是通過類似于bridge的方式,現在外層的Web Application中配置一個對應的元素,然后通過對這個元素將外部的訪問橋接到OSGi容器內部。在OSGi容器內部,會有一個總控的service,通過這個service來提供Web元素的動態管理,以及對外界請求的響應和分發。Equinox的Servlet Bridge就是采用的這種方式。
另一種方式就是通過使用Web Container提供的原生的API來實現Web元素的動態管理,將Web Container的部分功能作為Service注冊到OSGi中,然后在OSGi中通過這個Service來動態的管理Web元素。
兩種方式各有利弊:
對于bridge方式來說,優點是與Web Container實現無關,在多種Web Container中均能正常使用;缺點也很明顯,無法使用Web Container提供的各種特性,并且相當于自己要實現一部分Web Server的功能,不僅是重復造輪子,而且還是個不怎么好的輪子,能否滿足企業級應用的需求,還只是個未知數。
對于使用原生API的方式來說,優點就是完全使用Web Server自身的機制,可以保證性能和功能需求;缺點同樣也很明顯,現在流行的Web Server開源的并不多,而且就算是開源的,也不一定提供了可以動態管理Web元素的API,就算是有相應的API,也不一定適合OSGi環境,而且同一個Web Server的不同版本,API也很有可能會變化,這直接導致了原生方式實現的多樣性和不兼容性。
幸運的是,在Tomcat 5.5.x和6.0.x中都提供了這樣的API,在以后的章節中,我會著重針對Tomcat 5.5.x、6.0.x版本以及對bridge方式這三個場景,來實現對Web元素的動態管理。
Servlet 2.4中描述了如下可以在web.xml中配置的元素,這也是我要實現動態管理的目標:
- Context Parameter
- Error Page
- Filter
- Filter Mapping
- Listener
- Security role
- Servlet
- Servlet Mapping
- Welcome Page