首页 > 解决方案 > Servlet 无法向jsp输出HashMap键:FileNotFoundException, util class can't find local file after deploy

问题描述

我有一个TranslateServlet需要一些文本,创建一个Cracker类的实例并调用一个getCrackedResult返回HashMap键和值的方法:

public class TranslateServlet extends HttpServlet {
    public static void main(String[] args) {
        Cracker cracker = new Cracker("German", "English");
        HashMap<String, ArrayList<Cracker.EntrySet<String, ArrayList<String>>>> crackedResults =
                cracker.getCrackedResult("Ich bin");

        for (String category: crackedResults.keySet())  {
            System.out.print(category);  //works fine
        }

    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        Cracker cracker = new Cracker("German", "English");

        HashMap<String, ArrayList<Cracker.EntrySet<String, ArrayList<String>>>> crackedResults =
                cracker.getCrackedResult("Ich bin");

        for (String category: crackedResults.keySet())  {
                response.getWriter().print(category);  //doesn't work
        }

        response.getWriter().print("DONE");  //works fine
    }
}

但是,虽然迭代方法HashMap内部main工作正常,但尝试通过方法获取键值时doPost(),我只得到DONE输出,没有其他值。为什么??

编辑: “不起作用”意味着不输出类别。如果main方法输出“Dog”、“Cat”,jsp页面只输出“Done”,而不是“Dog”、“Cat”、“Done”。

我的问题有什么问题足以关闭它?也感谢匿名投票者。

编辑:我检查了tomcat的日志,java.io.FileNotFoundException: some_folder/some_file.bin每次调用servlet时都会出错。

我意识到该函数getCrackedResult使用了这样的本地文件:

InputStream inputPOS = new FileInputStream("some_folder/some_file.bin");

我尝试将文件移动到WEB-INF并更改文件路径:

InputStream inputPOS = new FileInputStream("WEB-INF/some_folder/some_file.bin");

但我仍然得到例外:java.io.FileNotFoundException: WEB-INF/some_folder/some_file.bin.

我应该如何处理该文件,以便Cracker该类,特别是它的getCrackedResults功能可以在部署后获取它。我的文件结构如下所示:

Project Root
------------src
---------------com
------------------util
----------------------Cracker.java
------------------web
---------------------TranslateServlet.java
------------target
------------------classes
-------------------------com
----------------------------util
--------------------------------Cracker.class
----------------------------web
-------------------------------TranslateServlet.class
------------imgs
------------some_folder
-----------------------some_file.bin
------------WEB-INF
-------------------classes
-------------------lib
-------------------some_folder
------------------------------some_file.bin (tried putting it here)

标签: javajspservletsjakarta-ee

解决方案


解决方案:

请在正确的位置部署(!)/WEB-INF/some_file/some.bin,然后您可以FileInputStream从 servlet 环境访问它,例如:

java.io.InputStream inS = /*httpRequest.get*/servletContext
    .getResourceAsStream("/WEB-INF/some_file/some.bin");

请参阅:ServletContext Javadoc (Java8)


推荐阅读