जावा ईई वेब एप्लिकेशन में WEB-INF का उपयोग किस लिए किया जाता है?


177

मैं निम्नलिखित स्रोत कोड संरचना के साथ जावा ईई वेब एप्लिकेशन पर काम कर रहा हूं:

src/main/java                 <-- multiple packages containing java classes
src/test/java                 <-- multiple packages containing JUnit tests
src/main/resources            <-- includes properties files for textual messages
src/main/webapp/resources     <-- includes CSS, images and all Javascript files
src/main/webapp/WEB-INF
src/main/webapp/WEB-INF/tags
src/main/webapp/WEB-INF/views

बिट मुझे दिलचस्पी है WEB-INF- इसमें web.xmlसर्विसलेट्स स्थापित करने के लिए एक्सएमएल फाइलें, स्प्रिंग बीन वायरिंग संदर्भ और जेएसपी टैग और विचार शामिल हैं।

मैं यह समझने की कोशिश कर रहा हूं कि इस संरचना को कौन सी बाधाएं / परिभाषित करती हैं। उदाहरण के लिए, JSP फाइलें हमेशा भीतर होनी चाहिए WEB-INFया वे कहीं और हो सकती हैं? और क्या इसमें कुछ और है WEB-INF? विकिपीडिया के WAR ने classesजावा कक्षाओं के लिए और libJAR फाइलों के लिए प्रविष्टि का उल्लेख किया है - यकीन नहीं कि जब मुझे अन्य स्रोत फ़ाइल स्थानों के अलावा इनकी आवश्यकता होगी, तो मैं पूरी तरह से समझ गया हूं।


1
यह मददगार हो सकता है: gordondickens.com/wordpress/2012/07/03/…
smwikipedia

1
FYI करें ... यह जानने के लिए कि सर्वलेट कंटेनर किस प्रकार से WEB-INFऔर अन्य स्थानों से लोड होते हैं, इस प्रश्न को देखते हैं, क्लासलेट को एक सर्वलेट में नियंत्रित करते हैं , विशेष रूप से यह उत्तर
तुलसी बोरक

जवाबों:


216

सर्वलेट 2.4 विनिर्देश का कहना है इस वेब-INF (पेज 70) के बारे में:

एक विशेष निर्देशिका नाम के पदानुक्रम में मौजूद है WEB-INF। इस निर्देशिका में एप्लिकेशन से संबंधित सभी चीजें शामिल हैं जो एप्लिकेशन के दस्तावेज़ रूट में नहीं हैं। नोड आवेदन की सार्वजनिक दस्तावेज पेड़ का हिस्सा नहीं है । निर्देशिका में निहित कोई फ़ाइल कंटेनर द्वारा सीधे क्लाइंट को नहीं दी जा सकती है। हालाँकि, निर्देशिका की सामग्री सर्वलेट कोड के लिए और मेथड कॉल्स का उपयोग करते हुए दिखाई देती है , और कॉल्स का उपयोग करके इसे उजागर किया जा सकता है ।WEB-INFWEB-INFWEB-INFgetResourcegetResourceAsStreamServletContextRequestDispatcher

इसका मतलब है कि WEB-INFसंसाधन आपके वेब-एप्लिकेशन के संसाधन लोडर के लिए सुलभ हैं और जनता के लिए प्रत्यक्ष रूप से दिखाई नहीं देते हैं।

यही कारण है कि बहुत सी परियोजनाओं ने अपने संसाधनों को जेएसपी फाइलों, जेएआर / पुस्तकालयों और अपनी स्वयं की क्लास फाइलों या संपत्ति फाइलों या WEB-INFफ़ोल्डर में किसी अन्य संवेदनशील जानकारी जैसे डाल दिया है । अन्यथा वे एक साधारण स्थिर URL (उदाहरण के लिए CSS या जावास्क्रिप्ट लोड करने के लिए उपयोगी) का उपयोग करके सुलभ होंगे।

आपकी JSP फाइलें तकनीकी दृष्टिकोण से कहीं भी हो सकती हैं। उदाहरण के लिए स्प्रिंग में आप उन्हें WEB-INFस्पष्ट रूप से कॉन्फ़िगर कर सकते हैं :

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/jsp/" 
    p:suffix=".jsp" >
</bean>

WEB-INF/classesऔर WEB-INF/libफ़ोल्डरों विकिपीडिया के में वर्णित युद्ध फ़ाइलें लेख कार्यावधि में सर्वलेट विनिर्देश के लिए आवश्यक फ़ोल्डरों के उदाहरण हैं।

किसी परियोजना की संरचना और परिणामस्वरूप WAR फ़ाइल की संरचना के बीच अंतर करना महत्वपूर्ण है।

कुछ मामलों में परियोजना की संरचना आंशिक रूप से WAR फ़ाइल की संरचना (जैसे JSP फाइलें या HTML और जावास्क्रिप्ट फ़ाइलों के लिए स्थैतिक संसाधनों के लिए) को प्रतिबिंबित करेगी, लेकिन यह हमेशा ऐसा नहीं होता है।

परिणामी WAR फ़ाइल में प्रोजेक्ट संरचना से परिवर्तन एक बिल्ड प्रक्रिया द्वारा किया जाता है।

जब आप आमतौर पर अपनी स्वयं की निर्माण प्रक्रिया को डिजाइन करने के लिए स्वतंत्र होते हैं, आजकल ज्यादातर लोग अपाचे मावेन जैसे मानकीकृत दृष्टिकोण का उपयोग करेंगे । अन्य बातों के अलावा, मावेन परियोजना संरचना में किन संसाधनों के लिए चूक को परिभाषित करता है जिसके परिणामस्वरूप विरूपण साक्ष्य में संसाधन (जिसके परिणामस्वरूप विरूपण इस मामले में WAR फ़ाइल है)। कुछ मामलों में मानचित्रण में एक सादे प्रतिलिपि प्रक्रिया होती है अन्य मामलों में मानचित्रण प्रक्रिया में एक परिवर्तन शामिल होता है, जैसे फ़िल्टरिंग या संकलन और अन्य।

एक उदाहरण : WEB-INF/classesफ़ोल्डर में बाद में सभी संकलित जावा कक्षाएं और संसाधन ( src/main/javaऔर src/main/resources) होंगे जिन्हें एप्लिकेशन शुरू करने के लिए क्लास लोडर द्वारा लोड किए जाने की आवश्यकता है।

एक और उदाहरण : WEB-INF/libफ़ोल्डर में बाद में एप्लिकेशन द्वारा आवश्यक सभी जार फाइलें होंगी। एक मावेन परियोजना में निर्भरताएं आपके लिए प्रबंधित की जाती हैं और मावेन स्वचालित रूप से आपके लिए आवश्यक जार फ़ाइलों को WEB-INF/libफ़ोल्डर में कॉपी कर देता है। यह बताता है कि आपके पास libमावेन प्रोजेक्ट में फ़ोल्डर क्यों नहीं है ।



2
सर्वलेट 3.0 और 3.1 ( JSR 340 ) में परिवर्तन WEB-INF / lib में संग्रहीत JAR के भीतर से स्थैतिक संसाधनों और JSP की सेवा की अनुमति देता है। सर्वलेट 3.1 कल्पना खंड को उद्धृत करने के लिए : स्थैतिक संसाधनों और JSPs के अलावा मेटा- INF / JAR फाइल के संसाधन जो WEB-INF / lib निर्देशिका में रहते हैं, WEB-INF निर्देशिका में निहित कोई अन्य फाइल नहीं हो सकती है। कंटेनर द्वारा ग्राहक को सीधे सेवा दी जाती है। : तो अपवाद केवल पर लागू होता है WAR> WEB-INF> lib> JARफ़ाइल>resources
तुलसी Bourque

1
ओह, ऊपर, परिवर्तन मेरी टिप्पणी है कि करने के लिए अंतिम वाक्य से: स्टेटिक फाइलों से परोसा जा सकता है WARफ़ाइल> WEB-INF> lib> JARफ़ाइल> META-INF> resources> yourStaticFilesGoHere
बेसिल बोर्के

@ मैं आपको सुझाव देता हूं कि आप अपने उत्तर को एक नए सर्वलेट 3 अनुभाग के साथ संशोधित करें, और अपनी वर्तमान सामग्री को एक सर्वलेट 2 अनुभाग के रूप में लेबल करें।
बेसिल बॉर्कल

61

जब आप जावा ईई वेब एप्लिकेशन (फ्रेमवर्क का उपयोग कर रहे हों या नहीं) तैनात करते हैं, तो इसकी संरचना को कुछ आवश्यकताओं / विनिर्देशों का पालन करना चाहिए। इन विशिष्टताओं से आते हैं:

  • सर्वलेट कंटेनर (जैसे टॉमकैट)
  • जावा सर्वलेट एपीआई
  • आपका एप्लिकेशन डोमेन
  1. सर्वलेट कंटेनर आवश्यकताएँ
    यदि आप Apache Tomcat का उपयोग करते हैं, तो आपके एप्लिकेशन की रूट डायरेक्टरी को वेबैप फ़ोल्डर में रखा जाना चाहिए। यदि आप किसी अन्य सर्वलेट कंटेनर या एप्लिकेशन सर्वर का उपयोग करते हैं तो यह अलग हो सकता है।

  2. जावा सर्वलेट एपीआई आवश्यकताओं
    जावा सर्वलेट एपीआई में कहा गया है कि आपके रूट एप्लिकेशन निर्देशिका में निम्नलिखित संरचना होनी चाहिए:

    ApplicationName
    |
    |--META-INF
    |--WEB-INF
          |_web.xml       <-- Here is the configuration file of your web app(where you define servlets, filters, listeners...)
          |_classes       <--Here goes all the classes of your webapp, following the package structure you defined. Only 
          |_lib           <--Here goes all the libraries (jars) your application need

इन आवश्यकताओं को जावा सर्वलेट एपीआई द्वारा परिभाषित किया गया है।

3. आपका एप्लिकेशन डोमेन
अब आपके द्वारा सर्वलेट कंटेनर (या एप्लिकेशन सर्वर) और जावा सर्वलेट एपीआई आवश्यकताओं की आवश्यकताओं का पालन किया गया है, आप अपने वेबप के अन्य भागों को व्यवस्थित कर सकते हैं जो आपको आवश्यक हैं।
- आप अपने आवेदन रूट डायरेक्टरी में अपने संसाधन (जेएसपी फाइलें, सादा पाठ फाइलें, स्क्रिप्ट फाइलें) डाल सकते हैं। लेकिन फिर, लोग आपके ब्राउज़र से सीधे पहुंच सकते हैं, बजाय आपके आवेदन द्वारा प्रदान किए गए कुछ तर्क द्वारा संसाधित किए जा रहे अनुरोधों के बजाय। इसलिए, अपने संसाधनों को सीधे उस तरह से एक्सेस करने से रोकने के लिए, आप उन्हें WEB-INF निर्देशिका में रख सकते हैं, जिनकी सामग्री केवल सर्वर द्वारा सुलभ है।
-यदि आप कुछ चौखटों का उपयोग करते हैं, तो वे अक्सर विन्यास फाइल का उपयोग करते हैं। इनमें से अधिकांश चौखटे (स्ट्रट्स, स्प्रिंग, हाइबरनेट) के लिए आपको अपने विन्यास फाइल को क्लासपाथ ("क्लासेस" डायरेक्टरी) में रखना होगा।


12

आपको WEB-INF को किसी भी पेज या पेज के टुकड़ों में रखना चाहिए, जिसे आप सार्वजनिक नहीं करना चाहते। आमतौर पर, JSP या फेसलेट WEB-INF के बाहर पाए जाते हैं, लेकिन इस मामले में वे किसी भी उपयोगकर्ता के लिए आसानी से सुलभ हैं। यदि आपके पास कुछ प्राधिकरण प्रतिबंध हैं, तो इसके लिए WEB-INF का उपयोग किया जा सकता है।

WEB-INF / lib में 3 पार्टी लाइब्रेरी शामिल हो सकती हैं जिन्हें आप सिस्टम स्तर पर पैक नहीं करना चाहते हैं (JAR आपके सर्वर पर चल रहे सभी एप्लिकेशन के लिए उपलब्ध हो सकता है), लेकिन केवल इस विशेष प्रशंसा के लिए।

सामान्यतया, कई कॉन्फ़िगरेशन फ़ाइलें WEB-INF में भी जाती हैं।

WEB-INF / कक्षाओं के लिए - यह किसी भी वेब-ऐप में मौजूद है, क्योंकि यह वह फ़ोल्डर है जहाँ सभी संकलित स्रोतों को रखा गया है (JARS नहीं, बल्कि संकलित .java फ़ाइलें जो आपने खुद लिखी हैं)।


4

सुरक्षा कारणों से इस सम्मेलन का पालन किया जाता है। उदाहरण के लिए यदि अनधिकृत व्यक्ति को रूट JSP फ़ाइल को सीधे URL से एक्सेस करने की अनुमति है तो वे बिना किसी प्रमाणीकरण के पूरे एप्लिकेशन के माध्यम से नेविगेट कर सकते हैं और वे सभी सुरक्षित डेटा तक पहुंच सकते हैं।


क्या jsp फ़ाइल अभी भी अनुरोध के सत्र के लिए नहीं दिखेगी? और अगर यह कोई भी नहीं मिलेगा, तो यह साइट के कुछ हिस्सों को प्रदर्शित नहीं करेगा।
पारसेर

3

WEB-INF निर्देशिका के अंतर्गत jsp पृष्ठ रखने का एक सम्मेलन (आवश्यक नहीं) है ताकि उन्हें गहरा लिंक या बुकमार्क नहीं किया जा सके। इस तरह jsp पेज के सभी अनुरोधों को हमारे आवेदन के माध्यम से निर्देशित किया जाना चाहिए, ताकि उपयोगकर्ता अनुभव की गारंटी हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.