1.1 interface Servlet
Bugun yangi va qiziqarli mavzuga — servletlar ga kirishamiz. Aynan servletlarni Java ga qo'shilishi Java ning hozirda katta server dasturlari uchun de-fakto standartga aylanishiga olib keldi. Dunyodagi barcha korporativ dasturiy ta'minotning 80% Java da yozilgan. Xitoyda esa barcha 100% Java da ishlaydi. Xo'sh, servletlar nima?
Servlet — bu Java dasturini veb-xizmatga aylantiradigan va mijozlardan kelgan so'rovlarni qayta ishlashiga imkon beradigan narsa. Bu ish shunday bo'ldi ...
90-yillarda, global tarmoq paydo bo'lganidan so'ng, veb-mijozlar (brauzerlar) va veb-serverlar paydo bo'ldi. Veb-serverlar odatda internet orqali ularda saqlangan fayllarni tarqatish uchun xizmat qilardi: html-sahifalar, skriptlar, rasmlar va hokazo.
Bir payt kelib, hamma ikkala tomon ham aqlliroq bo'lishi kerak degan xulosaga keldi. HTML sahifalarga JavaScript qo'shildi, serverlarga esa plaginlar qo'shildi — muayyan so'rovlarga javoban ishga tushiriladigan maxsus skriptlar va serverning xatti-harakatlarini moslashuvchan va aqlliroq qilishga imkon berdi.
Xo'sh, servlet — bu Java-plagin, u Java veb-server ga o'rnatiladi va Java kodini ma'lum bir sahifaga so'rov kelganda bajarishga imkon beradi. Va bu Java kodi, Servlet sinfidan meros bo'lgan sinf sifatida taqdim etilgan, ishlab chiquvchilari mo'ljallagan ishni bajaradi.
Siz allaqachon bilasizki, eng mashhur Java veb-server - bu Tomcat. Bu, masalan, "Tom va Jerry" multfilmidagi Tom mushugi nomi bilan atalgan.
Xo'sh, Tomcat servletlar bilan qanday muloqot qiladi? Aslida, bu jarayon standarttlashtirilgan va servlet hayot tsikli deb ataladi. Unda servlet — bu yuklanadigan ob'ekt, veb-server esa servletlarning kontayneri.
Agar servlet hali yuklanmagan bo'lsa, quyidagi jarayon amalga oshiriladi:
- Servlet sinfi konteyner tomonidan yuklanadi.
- Konteyner servlet sinfining nusxasini (ob'ektini) yaratadi.
- Konteyner servlet ob'ektidagi
init()metodini chaqiradi. Metod faqat bir marta chaqiriladi.
Standart ish tsikli — mijoz so'rovini qayta ishlash:
- Har bir so'rov alohida oqimda qayta ishlanadi.
- Konteyner servlet ustida
service()metodini chaqiradi va unga ServletRequest va ServletResponse ob'ektlarini uzatadi. - Servlet ishini tugatish uchun servlet ob'ektidagi
destroy()metodini chaqirishadi. U faqat bir marta chaqiriladi.
Servlet ishini tugatish sabablari juda ko'p bo'lishi mumkin:
- Programmier veb-serverni qayta ishga tushiradi, barcha servletlarni to'g'ri tugatish kerak.
- Programmier servletning yangi versiyasini yuklaydi, eski versiyani to'g'ri tushirib olish kerak.
- Va hokazo.
Asosiy narsani esda saqlang: veb-server va uning servletlari xatolarsiz va qayta yuklamasdan oylar davomida ishlashi kerak, har daqiqada minglab so'rovlarni qayta ishlash. Shuning uchun servletni yuklash, ishni amalga oshirish va tushirib olish kodlarini juda sifatli yozish kerak.
1.2 HttpServlet sinfi
Servlet sinfi servlet va konteynerning ishini standartlashtirish uchun mavjud. Ushbu sinf bilan dasturchilar bevosita ishlamaydi. Yoki juda kam ishlaydi. Ko'pincha Servlet’dan meros bo'lgan HttpServlet sinfi ishlatiladi.
Ushbu sinfda bizga kerak bo'lishi mumkin bo'lgan bir nechta metodlar mavjud. Ularni tez-tez ishlatib turasiz:
| Metod | Tavsif | |
|---|---|---|
| 1 | init() |
Servlet yuklanishida bir marta chaqiriladi |
| 2 | destroy() |
Servlet tushirilishida bir marta chaqiriladi |
| 3 | service(HttpRequest, HttpResponse) |
Servletga har bir yangi so'rov kelganda chaqiriladi |
| 4 | doGet(HttpRequest, HttpResponse) |
Servletga har bir yangi GET so'rov kelganda chaqiriladi |
| 5 | doPost(HttpRequest, HttpResponse) |
Servletga har bir yangi POST so'rov kelganda chaqiriladi |
| 6 | doHead(HttpRequest, HttpResponse) |
Servletga har bir yangi HEAD so'rov kelganda chaqiriladi |
| 7 | doDelete(HttpRequest, HttpResponse) |
Servletga har bir yangi DELETE so'rov kelganda chaqiriladi |
| 8 | doPut(HttpRequest, HttpResponse) |
Servletga har bir yangi PUT so'rov kelganda chaqiriladi |
init() va destroy() metodlari Servlet sinfidan meros olingan. Shuning uchun, agar siz ularni o'z servletingizda qayta aniqlashtirmoqchi bo'lsangiz, siz ularni bazaviy sinfdagi realizatsiyasini chaqirishingiz kerak bo'ladi. Buning uchun super.metodNomi() buyrug'i ishlatiladi.
Servlet misoli:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// So'rovdan “secret” parametrini olamiz
String secret = request.getParameter("secret");
// “secret” parametrini Http-sessiyaga qo'yamiz
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Brauzer javobi sifatida HTMLni chop etamiz
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Sarlavha</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet misoli "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 Method service(HttpServletRequest, HttpServletResponse)
Client so'rovini servlet nuqtai nazaridan ko'rsak, ishlar taxminan shunday ko'rinadi.
Har bir client so'rovi uchun konteyner (veb-server) HttpServletRequest va HttpServletResponse obyektlarini yaratadi, keyin mos servletda service(HttpServletRequest request, HttpServletResponse response) metodini chaqiradi. Bu objektlar metodga uzatilib, metod request’ dan kerakli ma'lumotlarni olishi va response da ish natijasini qo'yishi mumkin.
service() metodi standart realizatsiyaga ega. Agar uni qayta aniqlashtirmasak, aynan shu metod ishlaydi. Mana u nima qiladi.
service() metodi request’ dan HTTP metodining turini (GET, POST, …) belgilaydi va so'rovga mos metodni chaqiradi.
| Metod | Tavsif | |
|---|---|---|
| 1 | service(HttpRequest, HttpResponse) |
Servletga har bir yangi so'rov kelganda chaqiriladi |
| 2 | doGet(HttpRequest, HttpResponse) |
Servletga har bir yangi GET so'rov kelganda chaqiriladi |
| 3 | doPost(HttpRequest, HttpResponse) |
Servletga har bir yangi POST so'rov kelganda chaqiriladi |
| 4 | doHead(HttpRequest, HttpResponse) |
Servletga har bir yangi HEAD so'rov kelganda chaqiriladi |
| 5 | doDelete(HttpRequest, HttpResponse) |
Servletga har bir yangi DELETE so'rov kelganda chaqiriladi |
| 6 | doPut(HttpRequest, HttpResponse) |
Servletga har bir yangi PUT so'rov kelganda chaqiriladi |
O'z sinfingizda siz yoki bitta service() metodini qayta aniqlashtirishingiz mumkin, yoki uni umuman o'zgartirmasdan, kerakli metodlarni doGet(), doPost(), … qayta aniqlash orqali ishlashingiz mumkin.
GO TO FULL VERSION