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

Servlet can't output HashMap keys to jsp: FileNotFoundException, util class can't find local file after deployment

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
    }
}

但是,当在main方法内部遍历HashMap时,效果很好,但是当尝试通过doPost()方法获取键值时,我只能得到DONE作为输出,而没有其他值。为什么??

编辑:"不起作用"表示不输出类别。如果主方法输出" Dog"," Cat",则jsp页面仅输出" Done",而不是" Dog"," Cat"," Done"。

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

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

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

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

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

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

但是我仍然得到异常:java.io.FileNotFoundException: WEB-INF/some_folder/some_file.bin

我应该如何处理文件,以便Cracker类(尤其是它的getCrackedResults函数)在部署后可以获取它。我的文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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)


解决方案:

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

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

请参阅:ServletContext Javadoc(Java8)


现在,我设法用

对其进行了修复。

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

解决方案和some_folder/some_file.bin都放在

  • Project Root/target/classes(这样代码就可以在IDE中运行)
  • Project Root/WEB-INF/classes(以便将代码部署在tomcat上时可以使用)。