init() పద్ధతి

మరియు కొన్ని ఇతర ఉపయోగకరమైన చిన్న విషయాలు. వాస్తవానికి, నేను సర్వ్లెట్ ప్రారంభించడం గురించి మాట్లాడుతున్నాను. మీకు ఇప్పటికే తెలిసినట్లుగా, వెబ్ సర్వర్ సర్వ్లెట్ ఆబ్జెక్ట్‌ను సృష్టించి, దానిని కంటైనర్‌లో ఉంచిన తర్వాత, అది సర్వ్లెట్ యొక్క init() పద్ధతిని పిలుస్తుంది . మీరు ఈ పద్ధతిని ఓవర్‌రైడ్ చేయవచ్చు మరియు దీనిలో మీకు కావలసినదాన్ని ప్రారంభించవచ్చు.

కన్స్ట్రక్టర్‌ను ఎందుకు ఉపయోగించకూడదు?

ఎందుకంటే సర్వ్లెట్ సృష్టించే ప్రక్రియ ఇలా ఉంటుంది:

  • మేము వారసత్వంగా ఒక వస్తువును సృష్టిస్తాముHttpServlet
  • ఒక వస్తువును సృష్టించండిసర్వ్లెట్ సందర్భం, దాని సర్వ్లెట్ వేరియబుల్ జోడించండి
  • ఒక వస్తువును సృష్టించండిసర్వ్లెట్ కాన్ఫిగర్, దాని సర్వ్లెట్ వేరియబుల్ జోడించండి
  • వెబ్ సర్వర్ సర్వ్‌లెట్‌ను కంటైనర్‌కు జత చేస్తుంది
  • 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));
    	}
  }
}