12

在我们的项目中,我们使用 web-fragments 来定义一些 servlet,以便可以轻松地在其他项目中使用这些工件。

现在奇怪的是我们有一个 web-fragment.xml,但它的一些内容并没有被添加到有效的 web.xml 中。

举例:

有效的 web.xml 中存在以下配置:

<filter>
    <filter-name>superUserAutomaticLogon</filter-name>
    <filter-class>nl.caiw.cool.util.filters.SuperUserAutomaticLogonFilter</filter-class>
    <async-supported>false</async-supported>
</filter>

但以下不是:

<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/toolbox/modules/*</url-pattern>
</filter-mapping>

我们已经尝试了几件事,但我们无法弄清楚。希望这里有人可以向我们发送正确的方向。

提前致谢。

4

2 回答 2

14

现在奇怪的是我们有一个 web-fragment.xml,但它的一些内容并没有被添加到有效的 web.xml 中。

首先, aweb-fragment.xml不会物理包含在 mainweb.xml中。所以当你说它没有被添加到有效web.xml时,我觉得你可能会出错。

web.xmlWeb 片段允许组件在运行时将自己注册到主组件。您会发现发生这种情况的唯一证据是实际尝试使用该组件。

我尝试了一个带有 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是遵守以下规则:

  1. 它必须被命名web-fragment.xml
  2. 它必须放在一个JAR文件里面WEB-INF/lib
  3. web-fragment.xml必须存在于META-INFJAR 文件的目录中。

我的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

一些参考资料:

于 2012-06-14T10:43:44.993 回答
4

也许你可以检查一下web.xml没有metadata-complete="true"设置。根据 Servlet 规范,如果此标志设置为 true,则不会加载web-fragment.xml或任何注释,例如@WebFilter

于 2013-09-24T03:07:32.850 回答