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使用了这样的本地文件:
我尝试将文件移到WEB-INF并更改文件路径:
但是我仍然得到异常: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) |
- 您的问题出在哪里是不完整的。没有Cracker类。
-
标题与您的代码不符。通常的方法是让servlet设置请求属性,并让JSP从请求中获取它们。
-
@Nathan Hughes那就是我最初所做的。但是,在试图找出问题的根源时,我尝试了servlet直接输出HashMap,但没有成功,这意味着问题本身就在servlet中。
-
src目录在运行时不存在。您需要将其放置并作为资源而不是文件进行访问。
-
为了使其工作,(尝试)将其放在WEB-INFclassessome_foldersome_file.bin下...,然后参考new FileInputStream("some_foldersome_file.bin"); ...如果不加载...ClassLoader.getResourceAsStream("some_foldersome_file.b in");可以。
-
@ xerx593第一个不会工作,第二个会工作。
-
最好是request.getServletContext().getResourceAsStream(path),其中路径以" / "开头,并且相对于Servlet上下文根(\\ .WEB.INF \\\\ WEB-INF "上方的.war ..文件夹" deployed "的根)。 .answer!?;)...然后您可以将其放在WEB-INF之上,我仍然不建议这样做。
-
@ xerx593我尝试了InputStream inputPOS = Cracker.class.getClassLoader().getResourceAsStream("some_fol dersome_file.bin"),但是似乎InputStream为空,因为我得到了NullPointerException。尝试使用"some_foldersome_file.bin"和"WEB-INFsome_foldersome_file.bin"作为参数。尝试将也放置在两条路径的前面,结果相同。
-
@ xerx593您仍然不建议原因?
-
@parsecer您没有正确复制他的代码。请注意path以" / "开头。
-
@ user207421 "也尝试将/放在两个路径的前面,结果相同"。
-
@ user207421资源位于Project Rootsome_foldersome_file.bin下(现在,我已经将其复制到了Project RootWEB-INFsome_foldersome_file.bin中)。
-
为什么?那不是告诉你放的地方。如果您只想忽略这里告诉您的内容,为什么还要发布问题?
-
我关注了@ xerx593的评论。据我所知,他们没有提到将文件移到其他任何地方。
-
不,你没有。 @ xerx593表示使用ClassLoader.getResourceAsStream()或ServletContext.getResourceAsStream。您都没用过。在这两种情况下,您也都没有遵循他建议的资源放置方式。他当然确实提到将其移至其他地方。两次。
-
..不建议:因为文件(some.bin)暴露于" web ",所以WEB-INF文件夹受到保护(no1可以"下载"您的web.xml;)。 Cracker.class.getClassLoader() ...在servlet环境中(总是)不好,替代方法:Thread.currentThread().getContextClassLoader().getResourceAs Stream("pathrelativ elytoWEB-INFclass es") .. and best :(有几种方法可以获取servletcontext)... ServletContext.getResourceAsStream("WEB-INFwhere-ever-you- put-itsome.bin")
-
@ xerx593您似乎在建议引入的注释中似乎不建议您使用ServletConext.getResourceAsStream()。
-
否,我建议ServletConext.getResourceAsStream("WEB-INFsome_foldersome .bin") :),并且文件必须在那里。 (在.war中)
-
"此方法不同于使用类加载器的java.lang.Class.getResourceAsStream。此方法允许servlet容器从任何位置使servlet可以使用资源,而无需使用类加载器。" from servletContext-javadoc
-
啊,不建议:将敏感文件放在WEB-INF之外! xD
-
可能的重复:stackoverflow.com/q/12883861/592355
解决方案:
请在正确的位置部署(!)/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上时可以使用)。