现在奇怪的是我们有一个 web-fragment.xml,但它的一些内容并没有被添加到有效的 web.xml 中。
首先, aweb-fragment.xml
不会物理包含在 mainweb.xml
中。所以当你说它没有被添加到有效web.xml
时,我觉得你可能会出错。
web.xml
Web 片段允许组件在运行时将自己注册到主组件。您会发现发生这种情况的唯一证据是实际尝试使用该组件。
我尝试了一个带有 web 片段的简单的 hello-world 示例并让它工作。为此,我使用 Tomcat 7 和 Servlet 3.0 webapp。
我的主要web.xml
内部WEB-INF
如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>hello-world</display-name>
<absolute-ordering>
<name>filters</name>
</absolute-ordering>
</web-app>
我发现我们注册 a 的唯一方法web-fragment.xml
是遵守以下规则:
- 它必须被命名
web-fragment.xml
- 它必须放在一个JAR文件里面
WEB-INF/lib
web-fragment.xml
必须存在于META-INF
JAR 文件的目录中。
我的web-fragment.xml
样子:
<?xml version="1.0" encoding="UTF-8"?>
<web-fragment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd" id="WebAppFragment_ID" version="3.0">
<name>filters</name>
<filter>
<filter-name>interceptor</filter-name>
<filter-class>com.adarshr.Interceptor</filter-class>
</filter>
<filter-mapping>
<filter-name>interceptor</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-fragment>
通过上述最小设置,我能够让Interceptor
过滤器被触发,尽管它被放置在web-fragment.xml
.
最后,这是我的目录结构(使用http://www.adarshr.com/treegen生成)
+- hello-world
|
+- WEB-INF
|
+- lib
| |
| |- my-library.jar
|
|- web.xml
JAR 文件my-library.jar
具有以下结构:
+- my-library.jar
|
+- META-INF
|
|- web-fragment.xml
一些参考资料: