1

我继承的项目有一个 excel 模板,当用户执行操作时会填充该模板。最初对其进行编程的人是在 ApplicationProperties.properties 文件中执行此操作的。

#LOCAL
TemplatePath=C:/.../web/fileName.xls
#LIVE
#TemplatePath=/usr/share/tomcat/webapps/projectName/fileName.xls

有几个不同的文件是这样设置的,所以每次我们必须部署时,我必须确保进入应用程序属性文件并更新它们。我想重构代码,以便仅使用文件的相对路径即可完成。如果这是一个 .net 项目,我将使用 Server.MapPath() 来获取当前路径,然后将目录/文件名附加到它上面。

有没有办法在 Java 中做到这一点?或者,还有更好的方法?当我在谷歌搜索这个问题时,我注意到将文件放在 WEBINF/classes 中。那个更好吗?这是如何运作的?我是 Java 新手。

4

2 回答 2

3

如果你把它放在你的WEB-INF/classes目录中,那么这些文件将在你的类路径中可用,你可以使用MyClass.class.getResourceAsStream("classpath path"). 这比您尝试做的要好,因为类路径在您的控制之下。当您使用文件的相对路径时,如果不同的 IDE 使用不同的工作目录,您的代码可能会中断。

当然,如果你这样做,你不能轻易地写入这些文件,因为它们会在你的战争文件中。但我不确定这是否是您的要求。

这是一个似乎与您的问题相关的好答案:getResourceAsStream() vs FileInputStream

于 2013-05-28T21:29:42.867 回答
1

您可以将 XLS 模板放入 java 包中,如下所示:

MyWebApp
+---src
|   \---org
|       \---paulvargas
|           \---test
|               |   TestServlet.java
|               |
|               \---resources
|                       template.xls
|
\---WebContent
    \---WEB-INF
        |   web.xml
        |
        \---lib

部署应用程序时,文件template.xls会自动放在java包所指示classes目录中, . 因此,要读取文件:WEB-INF/classes/org/paulvargas/test/resources/

package org.paulvargas.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Scanner;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        ClassLoader classLoader = Thread.currentThread()
            .getContextClassLoader();
        InputStream inputStream = classLoader
            .getResourceAsStream("org/paulvargas/test/resources/template.xls");

        // Populate the template

    }

}

也可以看看:

于 2013-05-28T22:03:09.297 回答