Tomcat无法提供静态文件服务

4

我在这方面已经无从下手了。我试图启动一个超级简单的 Web 应用程序,但似乎找不到办法让 Tomcat 不返回 404 错误页面。

  • I'm using the gradle tomcat plugin with tomcat version 7.0.39
  • My html file is at hey-world/src/main/webapp/index.html
  • My web.xml looks like this:

    <servlet>
        <servlet-name>Resteasy</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>HeyWorldApplication</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/static/*</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>Resteasy</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

所以我认为这个设置应该将localhost:8080/hey-world/static/index.html映射到文件,但它每次都返回404。这是gradle tomcat插件中的一些约定问题吗?


1
一个url-pattern定义了哪些URL映射到哪些servlet,它并不定义静态数据文件的路径 - 实际上也不应该这样做。 - fge
@fge,由于这不是生产代码,我对从tomcat提供静态文件的性能影响不太担心。同样,对于潜在允许访问WEB-INF的安全问题(如果我理解正确,这个版本的tomcat已经修复了?),我也不太关心。我的理解是将某些url-pattern路由到默认servlet将从webapp目录中提供文件服务。 - Chris
1个回答

5
< p >在web.xml / servlet-mapping中使用的URL模式通常有点简单。我认为在您的情况下,Resteasy的/*模式将起到捕获所有内容的作用,因此其他映射实际上并不重要。

为了调试,建议您完全删除Resteasy-servlet,并查看是否可以使用自定义URL从静态文件中提供服务进行映射。 如果这样可以工作,请重新启用Resteasy,但在不同的URL模式下(例如/rest/*)。

如果可以工作,那么一切都很好,只是/*的URL映射会阻止其他任何东西的工作。

最简单的解决方案可能是按默认方式(无映射)提供静态文件,并从另一个URL提供rest-stuff。

或者使用两个Web应用程序。一个带有上下文根/ static ,另一个带有上下文根/


Resteasy 注释掉确实可以启动文件服务,但在 localhost:8080/hey-world/index.html 上仍会出现404错误,这让我想到问题可能出在静态映射上? - Chris
为什么不把index.html放在你的webapp中的“static”文件夹里呢?简单的解决方案总是胜利的。;-) - Harald K
好的,我现在认为Servlet映射根本没有起到任何作用。我将静态文件切换为不使用映射,并将Resteasy放置在<url-pattern>/api/*</url-pattern>,现在它可以正常提供静态文件,但是会在localhost:8080/hey-world/api/path-to-resteasy-stuff上返回404错误。 - Chris
1
面向对象编程。如果您将Resteasy放在另一个URL后面,则需要提供一个<context-param>指定是什么。现在一切都正常了。谢谢! - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接