如何在Java程序(J2EE + JSTL)中获取服务器文件夹的路径

时间:2009-05-27 23:04:19

标签: java java-ee

我想在基于Web的项目(J2EE-JSP + Servlets)中阅读Excel文件的内容,这些项目位于Web服务器的文件夹中。

我创建了一个java文件,我将使用JSTL库通过JSP页面调用,但是我需要在Java文件中获取Excel工作表的路径,所以我可以阅读内容。

如何获取当前Java文件的路径以及Excel文件?

另外,我将通过POI库阅读Excel文件的内容。我能够在J2SE开发中做到这一点,但这可能吗?

POIFSFileSystem fs = null;
    try {
        fs = new POIFSFileSystem(new FileInputStream("**some path here of sheet**"));
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    HSSFWorkbook wb = null;
    try {
        wb = new HSSFWorkbook(fs);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFRow row;
    HSSFCell cell1,cell2,cell3; 

    int rows; // No of rows, stores the no. of rows for an excel sheet
    int cols; // No of columns, stores the no. of columns for an excel sheet

    rows = sheet.getPhysicalNumberOfRows();
    cols = 5;

    for(int r = 0; r < rows; r++) {
        row = sheet.getRow(r);

        if(row != null) {
            cell1 = row.getCell(1);
            cell2 = row.getCell(2);
            cell3 = row.getCell(4);

            //System.out.println(cell1.getStringCellValue()+" "+cell2.getStringCellValue()+" "+cell3.getStringCellValue());                
        }
    }
}

5 个答案:

答案 0 :(得分:3)

您可以要求servlet上下文相对于实际路径进行转换:

context.getRealPath("/");

如果你的java类是servlet,你可能会做类似

的事情
getServletConfig().getServletContext();

否则,jsp页面是一个servlet,所以你可以从那里传递它。

最后,您可以在启动应用时选择一次:

public class AppStartup implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent event) {
    }

    public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();
        // remember it in some static class for future use
    }
}

说完这一切之后,最好是创建一个具有servlet上下文的servlet,解析路径,并使用已解析的文件路径调用类,然后最终将请求转发到jsp页面以显示结果。

答案 1 :(得分:1)

在一个基本的JSP / Servlet应用程序中,您将拥有一个支持servlet,它将执行程序中的几乎所有逻辑,模型推送到请求中,然后将用户重定向到JSP页面这将从请求中拉出模型,并且只会格式化它(如果需要,可以使用JSTL)。如果你的方法需要使用Excel文件执行某种处理,它应该在一个扩展javax.servlet.http.HttpServlet的类中,这样你就可以访问ServletContext及其方法

String physicalFolder = getContext().getRealPath("/");

如果您不想使用此方法并且仍想使用JSTL(我猜您使用&lt; jsp:useBean /&gt; 标记),则可以初始化bean属性设置webapp的物理文件夹使用类似的东西:

<jsp:useBean id="excelBean" scope="request" class="yourpackage.YourClass" >
    <jsp:setProperty name="physicalPath" value="<%= application.getRealPath("/") %>" />
</jsp:useBean> 

答案 2 :(得分:1)

这是错误的做法。

您应该通过将其放在WEB-INF / classes中并使用getResourceAsStream来使用文件名从上下文路径获取InputStream来读取该文件。

尝试查看this示例。

答案 3 :(得分:0)

我怀疑如果你在服务器上寻找本地文件系统路径,那可能是不可能的。虽然有些Web应用程序服务器(特别是Tomcat,我认为)确实有一个包含所有应用程序文件的文件夹,但还有其他服务器直接从压缩的WAR文件运行应用程序。在这种情况下,可能没有Excel文件的路径,因为它在存档中。

一种可能的方法是独立于您正在运行的应用程序服务器,将Excel文件打包到WEB-INF/lib中的一个JAR中,然后使用

读取它
getClass().getResourceAsStream("/class/path/to/file.xls")

而不是

new FileInputStream("/local/filesystem/path/file.xls")

使用getResourceAsStream(“...”)时,需要提供类路径,而不是文件系统路径。因此,如果您将Excel文件打包在JAR中,则在名为com.yourcompany.files的包中,您需要使用

getClass().getResourceAsStream("/com/yourcompany/files/file.xls")

答案 4 :(得分:0)

我是第二个duffymo和Martin McNulty,你必须使用getResourceAsStream并放入你的Excel文件,这里就是例子:

你的webapp结构是这样的,对吧?

- Application Root
 |
 +- WEB-INF
     |
     +- classes/  <--- This is added to CLASSPATH
     |
     +- lib/      <--- Its contents are added to CLASSPATH
     |
     +- web.xml

在此结构中,您的应用程序类路径符合位于 lib 文件夹和文件夹中的JAR文件。当您使用IDE进行编译时,将编译位于源文件夹中的文件,并将 .class 文件复制到 classes 文件夹中,如果这些文件不是Java文件,则刚刚复制到文件夹中,但仍然在类路径中。

因此,简单地说...... 您可以在类路径中添加非类文件,例如Excel文件,并将其组织成包,就像它是一个类一样。

如果将Excel文件放在类路径中,您将获得的优势是可以独立于JAR文件或WAR文件位置访问该文件,只需知道它在类路径中的位置即可。

方法 Class.getResourceAsStream(String path)允许您访问类路径中的文件,只需传递用斜线替换点的路径,例如:

getClass().getResourceAsStream("/yourpackage/YourExcelFile.xsl");

将为您提供文件 YourExcelFile.xsl 的InputStream,该文件位于包 yourpackage 中。

我尽力向您解释此问题,但如果您有疑问,可以查看method documentation