हमारे युद्ध / WEB-INF फ़ोल्डर में संसाधन के लिए फ़ाइल पथ?


95

मुझे अपने ऐप इंजन प्रोजेक्ट के युद्ध / WEB-INF फ़ोल्डर में एक फ़ाइल मिल गई है। मैं अक्सर पूछे जाने वाले प्रश्न में पढ़ता हूं कि आप किसी फ़ाइल को सर्वलेट संदर्भ में पढ़ सकते हैं। मैं नहीं जानता कि कैसे संसाधन के लिए रास्ता बनाना है:

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

मैं फ़ाइल के साथ उपयोग करने के लिए उस संसाधन पर अपना पथ कैसे बनाऊंगा, जैसा कि ऊपर दिखता है?

धन्यवाद

जवाबों:


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)

आप जिस संसाधन की तलाश कर रहे हैं, उसका पूरा सिस्टम पथ आपको मिल जाएगा। हालाँकि, यह काम नहीं करेगा यदि सर्वलेट कंटेनर WAR फ़ाइल (जैसे टॉमकैट) का विस्तार कभी नहीं करता है। सर्वलेटकोटेक्स्ट के getResourceतरीकों का उपयोग करके क्या काम करेगा ।

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)

बाद का दृष्टिकोण आपके द्वारा उपयोग किए जाने वाले किसी भी मामले में काम नहीं करेगा और एप्लिकेशन इंस्टॉल किया गया है। पूर्व दृष्टिकोण केवल तभी काम करेगा जब WAR फ़ाइल परिनियोजन से पहले अनज़िप की गई हो।

संपादित करें: getContext () विधि स्पष्ट रूप से कुछ है जिसे आपको लागू करना होगा। JSP पृष्ठ इसे contextक्षेत्र के रूप में उपलब्ध कराते हैं । एक सर्वलेट में आप इसे अपने से प्राप्त ServletConfigकरते हैं जिसे सर्वलेट की init()विधि में पारित किया जाता है । यदि आप इसे उस समय संग्रहीत करते हैं, तो आप अपने सर्वलेटकोटेक्स्ट को उसके बाद किसी भी समय प्राप्त कर सकते हैं।


3
यह इंगित करने के लायक है कि मुझे इसे प्राप्त करने के लिए पथ में एक प्रारंभिक / लगाने की आवश्यकता थी, इस तरह: संदर्भ.getResourceAsStream ("/ WEB-INF / test / foo.txt");
मिक सेयर

1
Appengine पर उतना आसान काम नहीं करता है, जितना सवाल के लिए टैग किया गया है।
रेनासिंज़ा

2
इसे 6 साल पहले सही उत्तर के रूप में चिह्नित किया गया था। या तो Google ने ऐप इंजन API को बदल दिया है या आपकी तैनाती में कोई बग है। यदि आप एक मानक सर्वलेट चला रहे हैं, तो आपको context.getResourceAsStream()भिन्नता का उपयोग करने में सक्षम होना चाहिए ।
बेरिन लोरिट्श

2
यह अच्छा लगता है, लेकिन मैं जावा 1.8 का उपयोग कर रहा हूं और getContext () डिफ़ॉल्ट रूप से मौजूद नहीं है, इसका उपयोग करने के लिए किस जार फ़ाइल की आवश्यकता है?
f1wade

3
ServletContext javax.servletआपके J2EE पुस्तकालयों के पैकेज का हिस्सा है । आपको सर्वलेट क्लास से इसका संदर्भ मिलता है (अर्थात क्या विस्तार होता है java.servlet.GenericServlet)। BTW, getServletContext() GenericServlet के
Berin Loritsch

3

अब जावा ईई 7 के साथ आप संसाधन आसानी से पा सकते हैं

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

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


कहां से getServletContext()आता है?
एडम हर्विट्ज़

एडम आपको जावा सर्वलेट 3.1 से बाद में मिल जाएगा।
डैनियल डे लियोन

1

मुझे पता है कि यह देर हो चुकी है, लेकिन यह है कि मैं इसे सामान्य रूप से कैसे करता हूं,

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.