Servlet sozlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

Init() metodi

Va yana bir nechta foydali mayda narsalar. Albatta, men servletni initsializatsiya qilish haqida gapirayapman. Siz allaqachon bilasizki, veb-server servlet obyektini yaratib, uni konteynerga joylashtirgandan so'ng, u servletda init() metodini chaqiradi. Siz ushbu metodni qayta yozishingiz va kerak bo'lgan hamma narsani initsializatsiya qilishingiz mumkin.

Nega konstruktorni ishlatmaslik kerak?

Chunki servlet yaratish jarayoni taxminan quyidagicha sodir bo'ladi:

  • HttpServletdan meros olingan obyekt yaratiladi
  • ServletContext obyekti yaratiladi, u servlet o'zgaruvchisiga qo'shiladi
  • ServletConfig obyekti yaratiladi, u servlet o'zgaruvchisiga qo'shiladi
  • ...
  • Veb-server servletni konteynerga ulaydi
  • init() metodi chaqiriladi

Sizning servletingiz konstruktorida hali ko'p ichki o'zgaruvchilar initsializatsiya qilinmagan. Konteyner sizning servletingiz haqida hech narsa bilmaydi, sizning servletingiz konteksini bilmaydi. O'ylaymanki, bu yerda hamma narsa ravshan.

Keling, initsializatsiya paytida sozlamalar bilan properties-faylni topadigan servlet yozamiz:


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

Bu yerda biz Properties obyektini yaratib, unga config.properties fayldan ma'lumotlarni yuklaymiz. Keyinchalik esa Properties obyektdan turli parametrlarni, masalan, ma'lumotlar bazasi uchun kirish ma'lumotlarini olishimiz mumkin.

Properties-faylni qanday qilib to'g'ri yuklash kerak

Aytgancha, agar sizning servletingiz boshqa bir kompyuterda ishlayotgan bo'lsa, nima qilish kerak?

Masalan, bu yerda yozilgan, lekin u boshqa bir qit'ada joylashgan serverda ishlaydi. Yoki bir nechta serverlarda. Bunday holatda properties-faylni qanday qilib to'g'ri yuklash kerak?

Yaxshi savol. Odatda ish jarayonida servlet faqat nisbiy yo'lni biladi o'z properties-fayllarining, lekin ularning mutlaq yo'lini bilmaydi, chunki servletlar bilan war-fayllar har qanday joyda saqlanishi mumkin.

Demak, biz servlet qaerda saqlanganligini bilishimiz kerak (servlet allaqachon initsializatsiya qilingan) va unga nisbiy yo'lni qo'shishimiz kerak :)

Bu taxminan quyidagicha ko'rinadi:


String path = absoluteServletParh + "nisbiy yo'l";

Va, har doim bo'lgani kabi, bunday oddiy vazifalar ko'pincha o'zining kichik bir "lekin" ga ega. Sizning servletingiz va uning properties-fayli arxiv ichida saqlanadi :) Albatta, bunday shart emas, lekin shunday holatlar bo'lishi mumkin. properties-fayl ko'pincha jar- yoki war-fayllar ichida saqlanadi.

Ya'ni, sizning faylingiz diskda fizik yo'lga ega bo'lmasligi mumkin. Ammo konteyner sizning servletingizni yuklay olganligi sababli, u sizning properties-faylingizni ham yuklay oladi.

Buning uchun siz sinf yuklovchi obyektini (ClassLoader) olishingiz va undan faylingizni yuklashini so'rashingiz kerak. Buni qanday ko'rinadi:


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

getConfig() metodi

Aytgancha, barcha parametrlarni properties-fayllarda servletga o'tkazish mumkin emas. Masalan, sizning servletingiz taqsimlangan veb-dasturda boshqa servletlar bilan o'zaro aloqada bo'lsa.

Keyin konteyner sizning servletingiz metodini init() chaqirayotganda unga barcha kerakli ma'lumotlarni o'tkazishi kerak. Bundan tashqari, u buni amalga oshiradi.

Sizning servletingiz (esingizdami, u HttpServlet sinfdan kelib chiqdi) getServletConfig() metodi mavjud. U konteyner tomonidan yaratilgan va initsializatsiya qilingan ServletConfig obyektini qaytaradi. Ushbu obyektda quyidagi metodlar mavjud:

getInitParameterNames() Servlet parametrlarining nomlar ro'yxatini qaytaradi
getInitParameter(String name) Servlet parametrini uning nomi bo'yicha qaytaradi
getServletName() Servlet o'z nomini qaytaradi
getServletContext() ServletContext obyektini qaytaradi

Keling, ServletConfig dan o'z parametrlar ro'yxatini qaytaradigan servlet yozamiz. Ularni web.xml fayli orqali qo'yamiz:

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

O'z parametrlarini servlet quyidagi kod yordamida olishi mumkin:


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

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION