从WEB-INF内的JSP访问文件

时间:2014-06-10 14:52:53

标签: java jsp servlets web-applications

我有一个由servlet调用的.jsp来处理数据。 我试图用本地文件测试它,我的目录目前看起来像这样:

WEB-INF
    |----jsp
        |----test.jsp
    |----data.txt

我的.jsp甚至无法读取基本文件:

<%
    String in = "../data.txt";
    BufferedReader br = new BufferedReader(new FileReader(in));
    out.println(br.readLine());
%>

我还尝试了很多其他变体:

= "data.txt"
= "./data.txt"
= "/data.txt"
= "file:///data.txt"
= "file://data.txt"
= "WEB-INF/data.txt"

等,并且无法从文件中读取。
我仍然是servlets的新手,所以我可能在这里错过了一个关键的互动,如果有人能够向我展示规范的“你好世界”,我将不胜感激。如何从.jsp中的WEB-INF访问文件的版本。

3 个答案:

答案 0 :(得分:5)

这里有几个问题。

  1. 最重要的是JSP是显示技术。你不应该试图在jsp中做任何事情,而不仅仅是显示环境提供的一些数据(例如servlet设置的HttpResponse上的属性)。您当然不应该尝试从jsp访问文件系统。

  2. 即使是从servlet,你也不应该这样做。您应该将文件放在类路径中,并使用getClass().getClassLoader().getResourcegetResourceAsStream。可以直接从Web应用程序访问文件系统中的文件,但不建议这样做,也不能移植。

  3. 编辑:@ LocHa的答案可能会有效,但你真的不应该这样做。

答案 1 :(得分:0)

您应该使用ServletContext.getRealPath()来获取文件的实际文件系统路径。 ServletContext可以从.jsp下访问,名称为application

所以你应该这样做:

<%
    String in = application.getRealPath("/WEB-INF/data.txt");
    BufferedReader br = new BufferedReader(new FileReader(in));
    out.println(br.readLine());
%>

答案 2 :(得分:-1)

测试一下:

<%
    // application is JSP variable point to ServletContext instance

    InputStream is = application.getResourceAsStream("/WEB-INF/data.txt");

    BufferedReader b = new BufferedReader( new InputStreamReader( is ));

    out.println(br.readLine());
%>