Servlets 如何查找基于servlet的应用程序的工作文件夹以加载资源

Servlets 如何查找基于servlet的应用程序的工作文件夹以加载资源,servlets,resources,relative-path,absolute-path,working-directory,Servlets,Resources,Relative Path,Absolute Path,Working Directory,我编写了一个Java servlet,我想在不同服务器上的许多Tomcat实例上安装它。servlet使用一些静态文件,这些文件与WEB-INF下的war文件一起打包。这是典型安装中的目录结构: - tomcat -- webapps --- myapp ---- index.html ---- WEB-INF ----- web.xml ----- classes ------ src ------- ..... ----- MY_STATIC_FOLDER ------ file1 ----

我编写了一个Java servlet,我想在不同服务器上的许多Tomcat实例上安装它。servlet使用一些静态文件,这些文件与WEB-INF下的war文件一起打包。这是典型安装中的目录结构:

- tomcat
-- webapps
--- myapp
---- index.html
---- WEB-INF
----- web.xml
----- classes
------ src
------- .....
----- MY_STATIC_FOLDER
------ file1
------ file2
------ file3
如何知道静态文件夹的绝对路径,以便读取静态文件

我不能依赖“当前文件夹”(我在一个新文件(“.”)中获得的内容),因为它取决于Tomcat服务器的启动位置,这在每个安装中都是不同的

您可以使用将相对web内容路径转换为绝对磁盘文件系统路径

String relativeWebPath = "/WEB-INF/static/file1.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...
但是,如果您的唯一目的是从中获取
InputStream
,最好改用它,因为
getRealPath()
在WAR未扩展到本地磁盘文件系统而是扩展到内存和/或虚拟磁盘时,可能会返回
null

String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...
这比
java.io.File
方法更加健壮。此外,使用
getRealPath()
被认为是不好的做法

另见:

我更愿意使用getResourceaAsStream选项根据父目录加载资源

getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1");
您可以试试这个

字符串relativeWebPath=“WEB-INF/static/file1.ext”
InputStream输入=getServletContext().getResourceAsStream(relativeWebPath);

@BalusC,我登录时没有看到前面的答案,可能是我们两人在同一时间发布了答案。。。既然你的答案已经在我之前公布了,那你就应该投赞成票对。已监督资源是否在类路径之外。很抱歉