【问题标题】:Tomcat 6.x web.xml default and custom servlet routingTomcat 6.x web.xml 默认和自定义 servlet 路由
【发布时间】:2010-09-15 20:19:49
【问题描述】:

我在 web.xml 文件中定义了两个 servlet,即 default2 和 myservlet。 default2 servlet 用于映射 javascript 和 css 等静态文件。 myservlet 用于获取动态内容。

<servlet>
    <servlet-name>default2</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    <servlet-name>myservlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:my-servlet.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

servlet映射定义如下

<servlet-mapping>
    <servlet-name>myservlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default2</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

当我尝试访问 /resources 下的任何文件时,我得到一个 404。任何想法为什么此配置不起作用或更改此配置以使其工作。

【问题讨论】:

  • Tomcat 错误说明了什么?另外,为什么两个servlet都加载了相同的值&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
  • 启动时没有tomcat错误。当我们访问 /resources 下的任何文件时,它会给出一个文件未找到错误。

标签: java spring tomcat servlets tomcat6


【解决方案1】:

Tomcat 在 6.0.30 之前默认的 servlet 实际上服务的是一个由HttpServletRequest.getPathInfo() 标识的静态资源,所以在请求/resources/style.css 时会返回/style.css

Tomcat 的行为从 6.0.30 版本开始发生了变化。因此,问题中的原始配置适用于较新版本的 Tomcat。请参阅changelog 中的“50026:添加对将默认 servlet 映射到 /. (timw) 以外的 URL 的支持”。

Jetty 的默认 servlet 使用完整路径。

【讨论】:

    【解决方案2】:

    它应该可以正常工作。这些文件真实是否也位于/resources 文件夹中?

    【讨论】:

    • 异常告诉它不是。当您删除这两个 servlet 时,它们是否可以通过相同的 URL 访问?如果仍然没有,那么使用的 URL 和/或实际位置是完全错误的(或者您有一个 Filter 正在监听 /*,它写得不好,因此会干扰一切)。
    【解决方案3】:

    您的 web.xml 看起来是正确的(除非我会更改您的 &lt;load-on-startup&gt; 常量)。 确保您的 /resources 存在并且是您的项目路径中的一个公开可见的文件夹,而不是在 /WEB-INF 文件夹下。

    【讨论】:

      【解决方案4】:

      尝试将 url-patternmyservlet 更改为 /,并可选择将 &lt;mvc:default-servlet-handler /&gt; (see here) 添加到 Spring 配置中。

      【讨论】:

        【解决方案5】:

        根据@BalusC 评论删除了答案的错误部分。

        在您的 servlet 中设置断点并执行调试会话。查找您的 servlet 获取这些文件的路径。确保它们与位置匹配

        【讨论】:

        • 错误,servletcontainer 将匹配 最具体 servlet url 模式。可能您将它与过滤器的行为混淆了。
        • 是的,你在写。我没有想。仍然在 servlet 中设置断点将有助于确定应用程序在哪里寻找文件。
        • 我建议你编辑你的帖子,因为你得到了负分。
        猜你喜欢
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        • 2012-09-23
        • 2014-05-25
        相关资源
        最近更新 更多