访问位于WEB-INF文件夹中的资源

3
我一直在开发一个简单的Java Web应用程序,其中包含JSP文件。我一直试图通过位于结果WAR文件的上下文根中的JSP文件访问位于WEB-INF / classes目录中的资源文件,例如css文件和图像。
该项目结构是基于Maven War Plugin使用的建议结构创建的。我查阅了这个论坛中提供的几种解决方案,但都没有适用于这个新结构。
例如,如何从位于上下文根的JSP文件中访问位于WEB-INF / classes目录中的资源? example WAR file with the mentioned structure

我并没有将它们放在WEB-INF目录中,实际上如果你查看我分享的Maven War插件使用链接,它会将图像、CSS文件等打包到WEB-INF/classes目录中。这是推荐的结构。 - Chiranga Alwis
1个回答

6
如果您想通过HTTP访问这些资源,它们必须在其他地方 - 它们不能在WEB-INF中。那个问题将是重复的,因为已经有多次回答(只需查找此问题的相关问题链接)。Java Web应用程序永远不会使WEB-INF下的任何资源可通过HTTP访问。
然而,由于您的问题涉及“推荐”的标准文件结构,让我告诉您文档中的误导之处:src/main/resources中的任何资源都将出现在类路径中,例如WEB-INF/classes中。它不会出现在Web应用程序将其公开给世界的目录中。但是,文档使用了一个图像,表明该图像可以在Web应用程序中使用。它不能。您可以通过类加载器访问它,在您的情况下例如:SomeClassFromYourWebapp.class.getResourceAsStream()。这通常与在运行时处理的.properties文件、.xml或类似文件一起完成,而不是使用图像。我要说这是真正误导的文档(但它是正确的,只是误导)。
从技术上讲,这将回答您关于“如何从JSP访问资源?”的问题,因为您可以在JSP中使用此代码。我相信您的问题更多地是要求通过HTTP访问资源。
那个答案是:将您需要通过HTTP可用的资源移动到src/main/webapp并将它们保持在WEB-INF之外。否则,它们只会出现在类路径中。

话虽如此,在WEB-INF或类路径中放置资源并从此处为http提供服务仍然很常见。例如,Spring就是这样做jsp。 - user2189998
1
@user2189998 对于jsp:可以的。但是您不能将它们作为/WEB-INF/index.jsp提供(这就是此答案的重点),而是需要使用内部重定向技巧。尽管这是(理论上)可能的,但我从未看过它用于CSS和图像。如果您只需要具有URL的资源,则这太麻烦了。 - Olaf Kock
Olaf Kock,正如您所提到的,当我将其移动到src/main/webapp时确实起作用了。 - Chiranga Alwis

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