【问题标题】:Accessing Files From JSP inside WEB-INF [duplicate]从 WEB-INF 中的 JSP 访问文件 [重复]
【发布时间】:2014-06-10 14:52:53
【问题描述】:

我有一个 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"

等,并且无法从文件中读取。
我还是 servlet 的新手,所以我可能在这里错过了一个关键的交互,如果有人能基本上向我展示如何从 WEB-INF 中的 .jsp 访问文件的规范“hello world”版本,我将不胜感激。

【问题讨论】:

    标签: java jsp servlets web-applications


    【解决方案1】:

    这里有几个问题。

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

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

    编辑:@LocHa 的回答可能会奏效,但你真的不应该那样做。

    【讨论】:

    • 感谢您的信息!这纯粹是为了测试目的。在实际的生产代码中,我收到一个数据流。
    • @K.R.S.数据源并不重要,重要的是你在哪里使用它。 JSP 也不是永远的解决方案。
    • 我最终将通过 EJB 将数据接收到我的 servlet。我正在等待其他人编写 EJB,所以我暂时使用 .jsp 将文件处理为 JSON 以进行测试。是的,不好,我知道。
    • 不好的做法,即使是短期的。在我之后重复...“JSP 是一种 DISPLAY 技术”...顺便说一句,您也不应该在 jsp 中引用 EJB,因为 JSP 是一种 DISPLAY 技术。
    • 是的,我已经承认这是不好的做法,不需要大写。只有在有意义的情况下才应该应用最佳实践,而在我的情况下,我认为它没有。也许你不同意,但我不能接受这种答案作为解决方案。见:meta.stackoverflow.com/questions/256314/…
    【解决方案2】:

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

    所以你应该这样做:

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

    【讨论】:

      【解决方案3】:

      测试一下:

      <%
          // 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());
      %>
      

      【讨论】:

      • 不要使用并建议在 21 世纪使用 Scriplet,而是使用 JSTL
      • @Braj 在为自己辩护时,他确实提供了操作人员要求的解决方案。
      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 2015-01-23
      • 2014-08-17
      • 2016-07-03
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      相关资源
      最近更新 更多