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

我想在基于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()); } } } 

您可以要求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页面以显示结果。

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

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

如果你不想遵循这种方法并且仍然想要JSTL(我猜你正在使用标签),你可以使用以下内容初始化设置webapp的物理文件夹的bean属性:

  " />  

这是错误的做法。

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

试着看看这个例子。

我怀疑如果你在服务器上寻找本地文件系统路径,那可能是不可能的。 虽然有些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") 

我是第二个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文件夹和classes文件夹中的JAR文件确认。 使用IDE进行编译时,将编译位于源文件夹中的文件,并将.class文件复制到classes文件夹中,如果这些文件不是Java文件,则它们只是复制到文件夹中,但仍在类路径中。

简而言之...... 您可以在类路径中添加非类文件,就像Excel文件一样,并将其组织成包,就像它是一个类一样。

如果将Excel文件放在类路径中,那么只需知道它在类路径中的位置,就可以独立于JAR文件或WAR文件位置访问该文件。

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

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

将为您提供一个包含在您的包中的文件YourExcelFile.xsl的InputStream。

我尽力向你解释这一点,但如果你有疑问,可以查看方法文档 。