JavaRush /Курсхо /All lectures for TG purposes /Танзимоти сервлет

Танзимоти сервлет

All lectures for TG purposes
Сатҳи , Дарс
дастрас

Методи init()

Ва боз чанд чизҳои фоиданок. Албатта, ман дар бораи инициализатсияи сервлет. Чӣ тавр ки ту аллакай медонӣ, пас аз он ки веб-сервер объекти сервлетро сохт ва онро ба контейнер ҷойгир кард, он методи init()-ро дар сервлет фарёд мекунад. Ту можешь ин методро тағйир диҳӣ ва дар он ҳама чизеро, ки лозим аст, инициализатсия кунӣ.

Чаро на конструкторро истифода набарӣ?

Чунки раванди сохтани сервлет тақрибан чунин аст:

  • Сохтани объекте, ки аз HttpServlet мерос мегирад
  • Сохтани объекти ServletContext, ба он тағйирдиҳандаи сервлет илова мекунем
  • Сохтани объекти ServletConfig, ба он тағйирдиҳандаи сервлет илова мекунем
  • Веб-сервер сервлетро ба контейнер пайваст мекунад
  • Методи init()-ро даъват мекунем

Дар конструктори сервлети ту ҳанӯз бисёре аз тағйирдиҳандаҳои дохилияш инициализатсия нашудаанд. Контейнер дар бораи сервлети ту чизе намедонад, сервлети ту дар бораи контексташ чизе намедонад. Фикр мекунам, ин ҷо ҳама чиз аён аст.

Биё як сервлет нависем, ки ҳангоми инициализатсия файли properties-ро бо танзимот пайдо мекунад:


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

Дар ин ҷо мо объекти Properties месозем ва аз файл config.properties маълумотро ба он бор мекунем. Ва дар оянда мумкин аст аз объекти Properties параметрҳои гуногунро, ба монанди маълумот барои дастрасӣ ба базаи маълумот, гирифт.

Чӣ тавр дуруст бор кардани properties-файл

Ба ҳар ҳол, чӣ кор кунем, агар сервлети ту дар компютери ту намегардад?

Гӯем, ки онро дар ин ҷо навиштанд, ва он дар сервере дар қисми дигаре аз ҷаҳон ё дар чанд сервер мегардад. Дар ин ҳол, чӣ тавр дуруст бор кардани properties-файл?

Саволи хуб. Одатан дар раванди кор сервлет танҳо роҳи нисбии файлиҳои properties-и худро медонад, вале роҳи комилро намедонад, чунки файлҳои war бо сервлетҳо метавонанд дар ҳар ҷо нигоҳ дошта шаванд.

Яъне, мо бояд роҳи ҷойгиршавии сервлети худро (сервлети мо аллакай инициализатсия шудааст) ва ба он роҳи нисбиро илова кунем :)

Ин тақрибан чунин менамояд:


String path = absoluteServletPath + "относительный путь";

Ва, мисли ҳамеша, ба чунин вазифаи осон аксаран як "аммо"-и хурд дорад. Сервлети ту ва файли properties-и он дар дохили архив нигоҳ дошта мешаванд :) Албатта, ҳатман не, лекин чунин низ мешавад. Файли properties бисёр вақт дар дохили файли jar ё war нигоҳ дошта мешавад.

Яъне, роҳи физикӣ дар диск барои файли ту мумкин аст мавҷуд набошад. Аммо чунки контейнер тавонист сервлети туро бор кунад, эҳтимолан тавонист файли properties-и туро низ бор кунад.

Барои ин ба ту лозим аст объекти боркунандаи навъи (ClassLoader)-ро гирӣ ва аз он хоҳиш кунӣ, ки файли туро бор кунад. Ин чунин менамояд:


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

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

Методи getConfig()

Ба воситаи, на ҳама параметрҳо метавонанд дар файли properties ба сервлет гузаронида шаванд. Масалан, сервлети ту бо дигар сервлетҳо дар барномаи веб тақсимшуда ҳамкорӣ мекунад.

Он гоҳ лозим аст, ки контейнер ба сервлети ту тамоми маълумоти лозимаро ҳангоми даъват кардани методи init() диҳад. Бештар, он ҳамин тавр мекунад.

Сервлети ту (хона, ки ту медонӣ, ки он аз синфи HttpServlet мерос гирифтааст) методи getServletConfig() дорад. Ки объекти ServletConfig-ро, ки контейнер сохта ва инициализатсия кардааст, бармегардонад. Ин объект чунин методҳо дорад:

getInitParameterNames() Феҳристи номҳои параметрҳои сервлетро бармегардонад
getInitParameter(String name) Параметри сервлетро аз рӯи номаш бармегардонад
getServletName() Номи худи сервлетро бармегардонад
getServletContext() Объекти ServletContext-ро бармегардонад

Биё як сервлет нависем, ки феҳристи параметрҳои худро аз ServletConfig бармегардонад. Онҳоро ба он тавассути файли 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));
    	}
  }
}

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION