2.12.2 Servlet3的Web模块支持
2.12.2 Servlet3的Web模块支持
Servlet3
为模块化开发提供了良好的支持,Servlet3
规范不再要求所有web
组件(如Servlet
、ListenerFilter
等)都部署在web.xml
文件中,而是允许采用“web
模块”来部署、管理它们。
Web模块结构
Web
模块通常对应于一个JAR
包,这个JAR
包有如下文件结构:
1 | <webModule>.jar——这是Web模块的JAR包,可以改变 |
web模块部署描述符
从上面的文件结构可以看出,Web
模块与普通JAR
的最大区别在于需要在META-INF
目录下添加个web-fragment.xml
文件,这个文件也被称为web
模块部署描述符。
web-fragment.xml
文件与web.xml
文件的作用、文档结构都基本相似,因为它们都用于部署、管理各种web
组件。只是web-fragment.xml
用于部署、管理web
模块而已,但web-fragment.xml
文件可以多指定如下两个元素:
<name>
:用于指定该Web
模块的名称<ordering>
:用于指定加载该Web
模块的相对顺序。
上面<ordering>
元素用于指定加载当前web
模块的相对顺序,该元素的内部结构如图2.49所示。
程序示例
crazyit模块
下面开发第一个Web
模块,该web
模块内只定义了一个简单的ServletContextListner
,该Web
模块对应的web-fragment.xml
文件如下。
1 |
|
上面的web
模块部署描述文件的根元素是<web-fragment>
代码:
1 | <name>crazyit</name> |
指定该Web
模块的名称是crazyit
,接下来代码:
1 | <ordering> |
指定该web
模块将在其他所有web
模块之前加载.
leegang模块
接下来再开发一个web
模块,接下来的Web
模块同样只定义了一个ServletContextListener
,该Web
模块对应的web-Fragment.xm
文件如下。
1 |
|
将这两个Web
模块打包成JAR
包,Web
模块JAR
包的内部结构如图2.50所示。
将这两个Web
模块对应的JAR
包复制到任意Web
应用的WEB
ⅠNF/lib
目录下,启动Web
应用,将可以看到两个Web
模块被加载:先加载crazyit
模块,再加载leegang
模块。
web.xml中指定Web模块加载的绝对顺序
Web
应用除了可按web-fragment.xml
文件中指定的加载顺序来加载Web
模块之外,还可以通过web.xml
文件指定各Web
模块加载的绝对顺序。在web.xml
文件中指定的加载顺序将会覆盖Web
模块中web-fragment.xml
文件所指定的加载顺序.
假如在Web
应用的web.xml
文件中增加如下配置片段:
1 |
|
上面的配置片段指定了先加载leegang
模块,后加载crazyit
模块,如果重新启动该Web
应用,将可看到leegang
模块被优先加载
Web模块化开发的优点
Servlet3
的web
模块支持为模块化开发、框架使用提供了巨大的方便,例如需要在web
应用中使用web
框架,这就只要将该框架的JAR
包复制到Web
应用中即可。因为这个JAR
包的META-NF
目录下可以通过web-fragment.xml
文件来配置该框架所需的Servlet
、Listener
、Filter
等,从而避免修改Web
应用的web.xml
文件。Web
模块支持对于模块化开发也有很大的帮助,开发者可以将不同模块的web
组件部署在不同的web-fragment.xml
文件中,从而避免所有模块的配置、部署信息都写在web.xml
文件中,这对以后的升级、维护将更加方便。