Servlet无法输出HashMap键到jsp:FileNotFoundException,util类在部署后无法找到本地文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet无法输出HashMap键到jsp:FileNotFoundException,util类在部署后无法找到本地文件相关的知识,希望对你有一定的参考价值。

我有一个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作为输出,而没有其他值。为什么??

编辑:“不工作”意味着不输出类别。如果主方法输出“Dog”,“Cat”,则jsp页面仅输出“Done”,而不是“Dog”,“Cat”,“Done”。

我的问题有什么问题才足以关闭它?谢谢匿名downvoter。

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

我意识到函数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)
答案

Solution:

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

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

见:ServletContext Javadoc (Java8)

另一答案

现在,我设法修复它

InputStream inputPOS = Cracker.class.getClassLoader().getResourceAsStream("some_folder/some_file.bin");

解决方案并将some_folder/some_file.bin放在里面

  1. Project Root/target/classes(这样代码可以在IDE中运行)

  1. Project Root/WEB-INF/classes(以便代码在tomcat上部署时可以工作)。

以上是关于Servlet无法输出HashMap键到jsp:FileNotFoundException,util类在部署后无法找到本地文件的主要内容,如果未能解决你的问题,请参考以下文章

怎么样将servlet中的内容输出到另外一个jsp页面中去啊?

JavaWeb-----JSP基础知识①

笔记之_Java的jsp页面全局变量

javax.servlet.jsp.PageContext 无法解析为类型[重复]

servlet输入输出问题

Servlet处理业务逻辑,JSP处理视图渲染,Servlet处理请求后,把输出的结果转到JSP页面的解决方法