init() na pamamaraan

At ilang iba pang kapaki-pakinabang na maliliit na bagay. Siyempre, pinag-uusapan ko ang pagsisimula ng servlet. Tulad ng alam mo na, pagkatapos na likhain ng web server ang servlet object at ilagay ito sa lalagyan, tinatawag nito ang init() method ng servlet . Maaari mong i-override ang paraang ito at simulan ang anumang kailangan mo dito.

Bakit hindi gumamit ng constructor?

Dahil ang proseso ng paglikha ng isang servlet ay ganito:

  • Lumilikha kami ng isang bagay na minana mula saHttpServlet
  • Lumikha ng isang bagayServletContext, idagdag ang servlet variable nito
  • Lumikha ng isang bagayServletConfig, idagdag ang servlet variable nito
  • Ang web server ay nakakabit ng servlet sa lalagyan
  • Pagtawag sa init() na pamamaraan

Sa constructor ng iyong servlet, marami sa mga panloob na variable nito ang hindi pa rin nasisimulan. Walang alam ang lalagyan tungkol sa iyong servlet, walang alam ang iyong servlet tungkol sa konteksto nito. Sa tingin ko malinaw na ang lahat dito.

Sumulat tayo ng isang servlet na, kapag nasimulan, ay nakahanap ng isang file ng mga katangian na may mga setting:

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");
	 }
  }
}

Dito tayo lumikha ng isang bagayAri-arianat i-load ang data mula sa config.properties file papunta dito . Well, sa hinaharap maaari kang makalabas sa bagayAri-arianiba't ibang mga opsyon tulad ng data upang ma-access ang database, hal.

Paano i-load nang tama ang file ng mga katangian

Sa pamamagitan ng paraan, paano kung ang iyong servlet ay hindi tumatakbo sa iyong computer?

Sabihin nating isinulat nila ito dito, at tumatakbo ito sa isang server sa isang lugar sa ibang bahagi ng mundo. O maramihang mga server. Paano i-load nang tama ang file ng mga katangian sa kasong ito?

Magandang tanong. Karaniwan, kapag tumatakbo, ang isang servlet ay nakakaalam lamang ng kamag-anak na landas ng mga file ng pag-aari nito, hindi ang ganap na landas nito, dahil ang mga file ng digmaan ng servlet ay maaaring maimbak kahit saan.

Kaya, kailangan nating malaman ang landas kung saan naka-imbak ang ating servlet (nasimulan na ang servlet) at magdagdag ng isang kamag-anak na landas dito :)

Mukhang ganito:

String path = absoluteServletParh + "relative path";

At, gaya ng nakasanayan, ang gayong gawain sa elementarya ay kadalasang may sariling maliit na "ngunit". Ang iyong servlet at ang mga katangian ng file ay naka-imbak sa loob ng archive :) Hindi kinakailangan, siyempre, ngunit ito ay nangyayari. properties file ay madalas na naka-imbak sa loob ng jar o war file.

Iyon ay, ang iyong file ay maaaring walang pisikal na landas sa disk. Ngunit dahil na-load ng container ang iyong servlet, malamang na mai-load din nito ang file ng iyong properties.

Upang gawin ito, kailangan mong makuha ang class loader object (ClassLoader) at hilingin sa kanya na i-upload ang iyong file. Narito ang magiging hitsura nito:

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

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

getConfig() Paraan

Sa pamamagitan ng paraan, hindi lahat ng mga parameter ay maaaring maipasa sa servlet sa mga file ng pag-aari. Halimbawa, ang iyong servlet ay nakikipag-ugnayan sa iba pang mga servlet sa isang distributed na web application.

Pagkatapos ay kailangan mong tiyakin na ipinapasa ng lalagyan ang lahat ng kinakailangang impormasyon sa iyong servlet kapag tinawag nito ang init() na pamamaraan nito . Bukod dito, ginagawa niya iyon.

Ang iyong servlet (tandaan na ito ay minana mula sa HttpServlet class ) ay may getServletConfig() method . na nagbabalik ng isang bagayServletConfig, ginawa at sinimulan ng container. Ang bagay na ito ay may mga sumusunod na pamamaraan:

getInitParameterNames() Nagbabalik ng listahan ng mga pangalan ng parameter ng servlet
getInitParameter(Pangalan ng string) Nagbabalik ng servlet parameter ayon sa pangalan nito
getServletName() Ibinabalik ang sariling pangalan ng servlet
getServletContext() Nagbabalik ng isang bagayServletContext

Sumulat tayo ng isang servlet na nagbabalik ng listahan ng mga parameter nito mula saServletConfig'A. Ang paglalagay sa kanila doon ay sa pamamagitan ng web.xml file:

	<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>

Maaaring makuha ng isang servlet ang mga parameter nito gamit ang code:

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));
    	}
  }
}