init () विधि

और कुछ अन्य उपयोगी छोटी चीजें। बेशक, मैं सर्वलेट इनिशियलाइज़ेशन के बारे में बात कर रहा हूँ। जैसा कि आप पहले से ही जानते हैं, वेब सर्वर द्वारा सर्वलेट ऑब्जेक्ट बनाने और कंटेनर में रखने के बाद, यह सर्वलेट की init () विधि को कॉल करता है । आप इस विधि को ओवरराइड कर सकते हैं और इसमें आपको जो कुछ भी चाहिए उसे इनिशियलाइज़ कर सकते हैं।

कंस्ट्रक्टर का उपयोग क्यों नहीं करते?

क्योंकि सर्वलेट बनाने की प्रक्रिया कुछ इस प्रकार है:

  • हम विरासत में मिली वस्तु बनाते हैंएचटीटीपी सर्वलेट
  • एक वस्तु बनाएँसर्वलेट कॉन्टेक्स्ट, इसके सर्वलेट वैरिएबल को जोड़ें
  • एक वस्तु बनाएँसर्वलेट कॉन्फिग, इसके सर्वलेट वैरिएबल को जोड़ें
  • वेब सर्वर सर्वलेट को कंटेनर से जोड़ता है
  • init() विधि को कॉल करना

आपके सर्वलेट के कंस्ट्रक्टर में, इसके बहुत सारे आंतरिक चर अभी भी आरंभीकृत नहीं हैं। कंटेनर आपके सर्वलेट के बारे में कुछ नहीं जानता, आपका सर्वलेट इसके संदर्भ के बारे में कुछ नहीं जानता। मुझे लगता है कि यहां सब कुछ स्पष्ट है।

चलिए एक सर्वलेट लिखते हैं, जो प्रारंभ होने पर सेटिंग्स के साथ गुण फ़ाइल पाता है:

public class PropertiesServlet extends HttpServlet {
    public init() {
         try (InputStream input = new FileInputStream("c:/path/to/config.properties")) {

             Properties prop = new Properties();
             prop.load(input);

             String databaseURL = prop.getProperty("db.url");
             String databaseUser = prop.getProperty("db.user ");
             String databasePassword = prop.getProperty("db.password");
	 }
  }
}

यहां हम एक वस्तु बनाते हैंगुणऔर इसमें config.properties फ़ाइल से डेटा लोड करें । ठीक है, भविष्य में आप वस्तु से बाहर निकल सकते हैंगुणडेटाबेस तक पहुँचने के लिए डेटा जैसे विभिन्न विकल्प, जैसे।

गुण फ़ाइल को सही तरीके से कैसे लोड करें

वैसे, क्या होगा यदि आपका सर्वलेट आपके कंप्यूटर पर नहीं चल रहा है?

मान लीजिए कि उन्होंने इसे यहाँ लिखा है, और यह दुनिया के किसी अन्य भाग में कहीं सर्वर पर चलता है। या एकाधिक सर्वर। इस मामले में गुण फ़ाइल को सही तरीके से कैसे लोड करें?

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

इसलिए, हमें उस पथ को खोजने की आवश्यकता है जहां हमारा सर्वलेट संग्रहीत है (सर्वलेट पहले ही प्रारंभ हो चुका है) और इसमें एक सापेक्ष पथ जोड़ें :)

ऐसा कुछ दिखता है:

String path = absoluteServletParh + "relative path";

और, हमेशा की तरह, इस तरह के एक प्राथमिक कार्य का अक्सर अपना छोटा "लेकिन" होता है। आपकी सर्वलेट और इसकी गुण फ़ाइल संग्रह के अंदर संग्रहीत हैं :) जरूरी नहीं, बेशक, लेकिन ऐसा होता है। प्रोपर्टीज फ़ाइल अक्सर जार या युद्ध फ़ाइलों के अंदर संग्रहीत होती है।

अर्थात, आपकी फ़ाइल में डिस्क पर भौतिक पथ नहीं हो सकता है। लेकिन चूंकि कंटेनर आपके सर्वलेट को लोड करने में सक्षम था, इसलिए यह संभवतः आपकी गुण फ़ाइल को भी लोड करने में सक्षम होगा।

ऐसा करने के लिए, आपको क्लास लोडर ऑब्जेक्ट (क्लासलोडर) और उसे अपनी फ़ाइल अपलोड करने के लिए कहें। यहाँ यह कैसा दिखेगा:

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");

Properties prop = new Properties();
prop.load(stream);

getConfig () विधि

वैसे, गुण फ़ाइलों में सर्वलेट को सभी पैरामीटर पास नहीं किए जा सकते हैं। उदाहरण के लिए, आपका सर्वलेट वितरित वेब एप्लिकेशन में अन्य सर्वलेट्स के साथ इंटरैक्ट करता है।

फिर आपको यह सुनिश्चित करने की ज़रूरत है कि जब कंटेनर init() विधि को कॉल करता है तो कंटेनर आपके सर्वलेट को सभी आवश्यक जानकारी पास करता है । इसके अलावा, वह बस यही करता है।

आपका सर्वलेट (याद रखें कि यह HttpServlet वर्ग से विरासत में मिला है ) में getServletConfig() विधि है । जो एक वस्तु देता हैसर्वलेट कॉन्फिग, कंटेनर द्वारा बनाया और आरंभ किया गया। इस वस्तु के निम्नलिखित तरीके हैं:

getInitParameterNames () सर्वलेट पैरामीटर नामों की सूची लौटाता है
getInitParameter (स्ट्रिंग नाम) सर्वलेट पैरामीटर को इसके नाम से लौटाता है
getServletName () सर्वलेट का अपना नाम लौटाता है
getServletContext () एक वस्तु लौटाता हैसर्वलेट कॉन्टेक्स्ट

आइए एक सर्वलेट लिखें जो इसके मापदंडों की सूची लौटाता हैसर्वलेट कॉन्फिग'एक। उन्हें वहाँ रखना web.xml फ़ाइल के माध्यम से होगा:

	<web-app> 
 	
        <servlet> 
            <servlet-name>Print-Servlet</servlet-name> 
            <servlet-class>PrintServlet</servlet-class> 
            <init-param> 
                <param-name>jdbc-driver</param-name> 
    	        <param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value> 
	        </init-param> 
        </servlet> 
  	
        <servlet-mapping> 
            <servlet-name>Print-Servlet</servlet-name> 
            <url-pattern>/print</url-pattern> 
        </servlet-mapping> 
  	
    </web-app>

एक सर्वलेट कोड का उपयोग करके इसके पैरामीटर प्राप्त कर सकता है:

public class PrintServlet extends HttpServlet {
    public void init() {
        ServletConfig config = this.getServletConfig();
        Enumeration<String> initParameterNames = config.getInitParameterNames();

        while (initParameterNames.hasMoreElements()){
       	     String key = initParameterNames.nextElement();
             System.out.println("%s: %s\n", key, config.getInitParameter(key));
    	}
  }
}