Servlet 无法将 HashMap 键输出到 jsp:FileNotFoundException,util class 在部署后找不到本地文件
Servlet can't output HashMap keys to jsp: FileNotFoundException, util class can't find local file after deployment
我有一个 TranslateServlet
需要一些文本,创建一个 Cracker
class 的实例并调用一个 getCrackedResult
方法,该方法 returns 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
}
}
然而,虽然在 main
方法中迭代 HashMap
工作正常,但当试图通过 doPost()
方法获取键值时,我只得到 DONE
作为输出,没有其他值。为什么??
编辑: "Doesn't work" 表示不输出类别。如果main方法输出"Dog"、"Cat",jsp页面只输出"Done",而不是"Dog"、"Cat"、"Done".
我的问题有什么问题足以关闭它?也谢谢匿名投票者。
编辑:我检查了 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
class,特别是它的 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)
现在,我设法用
修复了它
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 上部署时可以正常工作)。
解决方案:
请在正确的位置部署(!)/WEB-INF/some_file/some.bin
,然后您可以从 servlet 环境访问它的 FileInputStream
,例如:
java.io.InputStream inS = /*httpRequest.get*/servletContext
.getResourceAsStream("/WEB-INF/some_file/some.bin");
我有一个 TranslateServlet
需要一些文本,创建一个 Cracker
class 的实例并调用一个 getCrackedResult
方法,该方法 returns 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
}
}
然而,虽然在 main
方法中迭代 HashMap
工作正常,但当试图通过 doPost()
方法获取键值时,我只得到 DONE
作为输出,没有其他值。为什么??
编辑: "Doesn't work" 表示不输出类别。如果main方法输出"Dog"、"Cat",jsp页面只输出"Done",而不是"Dog"、"Cat"、"Done".
我的问题有什么问题足以关闭它?也谢谢匿名投票者。
编辑:我检查了 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
class,特别是它的 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)
现在,我设法用
修复了它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 上部署时可以正常工作)。
解决方案:
请在正确的位置部署(!)/WEB-INF/some_file/some.bin
,然后您可以从 servlet 环境访问它的 FileInputStream
,例如:
java.io.InputStream inS = /*httpRequest.get*/servletContext
.getResourceAsStream("/WEB-INF/some_file/some.bin");