เส้นทางไฟล์ไปยังทรัพยากรในโฟลเดอร์ war / WEB-INF ของเราหรือไม่


95

ฉันมีไฟล์อยู่ในโฟลเดอร์ war / WEB-INF ของโครงการแอปเอ็นจินของฉัน ฉันอ่านคำถามที่พบบ่อยว่าคุณสามารถอ่านไฟล์จากที่นั่นในบริบท servlet ฉันไม่รู้ว่าจะสร้างเส้นทางไปยังทรัพยากรอย่างไร:

/war/WEB-INF/test/foo.txt

ฉันจะสร้างเส้นทางของฉันไปยังทรัพยากรนั้นเพื่อใช้กับ File () ได้อย่างไรตามที่ปรากฏด้านบน

ขอบคุณ

คำตอบ:


138

มีสองวิธีในการทำเช่นนี้ ตราบใดที่ไฟล์ WAR ถูกขยาย (ชุดของไฟล์แทนที่จะเป็นไฟล์. war หนึ่งไฟล์) คุณสามารถใช้ API นี้:

ServletContext context = getContext();
String fullPath = context.getRealPath("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

ซึ่งจะทำให้คุณได้รับเส้นทางระบบทั้งหมดไปยังทรัพยากรที่คุณกำลังมองหา อย่างไรก็ตามจะใช้ไม่ได้หาก Servlet Container ไม่เคยขยายไฟล์ WAR (เช่น Tomcat) สิ่งที่จะใช้ได้ผลคือการใช้getResourceวิธีการของ ServletContext

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/test/foo.txt");

หรือหากคุณต้องการเพียงแค่สตรีมอินพุต:

InputStream resourceContent = context.getResourceAsStream("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResource(java.lang.String)

แนวทางหลังนี้จะใช้ได้ผลไม่ว่าคุณจะใช้ Servlet Container แบบใดและติดตั้งแอปพลิเคชันไว้ที่ใดก็ตาม วิธีการเดิมจะใช้ได้ก็ต่อเมื่อไฟล์ WAR ถูกคลายซิปก่อนการปรับใช้

แก้ไข: วิธีการ getContext () เป็นสิ่งที่คุณต้องใช้อย่างชัดเจน เพจ JSP ทำให้พร้อมใช้งานเป็นcontextฟิลด์ ใน servlet คุณจะได้รับจากของคุณServletConfigซึ่งถูกส่งผ่านไปยังinit()เมธอดของ servlet หากคุณเก็บไว้ในเวลานั้นคุณสามารถรับ ServletContext ได้ทุกเมื่อที่ต้องการหลังจากนั้น


3
มันคุ้มค่าที่จะชี้ให้เห็นว่าฉันต้องใส่ค่าเริ่มต้น / ในเส้นทางเพื่อให้สิ่งนี้ทำงานได้เช่นนี้ context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
มิคเสร่อ

1
ใช้งานไม่ได้ง่ายๆใน appengine เนื่องจากคำถามถูกแท็ก
Renascienza

2
ถูกทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องเมื่อ 6 ปีก่อน Google เปลี่ยน API ของ App Engine หรือมีข้อบกพร่องในการทำให้ใช้งานได้ หากคุณใช้งาน Servlet มาตรฐานคุณควรใช้context.getResourceAsStream()รูปแบบนี้ได้
Berin Loritsch

2
ดูเหมือนจะดี แต่ฉันใช้ java 1.8 และ getContext () ไม่มีอยู่ตามค่าเริ่มต้นจะต้องใช้ไฟล์ jar ใด
f1wade

3
ServletContext เป็นส่วนหนึ่งของjavax.servletแพ็คเกจของไลบรารี J2EE ของคุณ คุณได้รับการอ้างอิงจากคลาส servlet (เช่นสิ่งที่ขยายjava.servlet.GenericServlet) BTW, GenericServlet ตอนนี้มีวิธีการgetServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch

3

ตอนนี้ด้วย Java EE 7 คุณสามารถค้นหาทรัพยากรได้ง่ายขึ้นด้วยไฟล์

InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");

https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext--


ที่ไหนที่ไม่getServletContext()มาจากไหน?
Adam Hurwitz

Adam คุณจะพบได้ตั้งแต่ Java Servlet 3.1 เป็นต้นไป
Daniel De León

2

ฉันรู้ว่ามันสายไปแล้ว แต่นี่คือวิธีที่ฉันทำตามปกติ

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.