1.1 interface Servlet
Bu gün yeni və maraqlı bir mövzuya başlayırıq — servletlər. Məhz servletlərin Java-ya əlavə edilməsi, Java-nın hazırda böyük server tətbiqləri üçün faktiki standart olmasına səbəb oldu. Dünyada bütün korporativ proqram təminatının 80%-i Java-da yazılır. Çin'də isə bu rəqəm hətta 100%-dir. Bəs servletlər nədir?
Servlet — bu məhz Java proqramını veb-servisə çevirən və müştəridən gələn sorğuları emal etməyə imkan verən bir vasitədir. Hər şey belə başladı...
90-cı illərdə, dünya şəbəkəsi yaranandan dərhal sonra, veb-müştərilər (brouzerlər) və veb-serverlər meydana gəldi. Veb-serverlər adətən sadəcə saxladıqları faylları internet vasitəsilə paylaşırdılar: html səhifələri, skriptlər, şəkillər və s.
Bir anda hər kəs qərara gəldi ki, hər iki tərəfi daha ağıllı etmək lazımdır. HTML səhifələrinə JavaScript əlavə etdilər və serverlərə pluginlər əlavə etdilər — təlimatlı skriptlər, müəyyən sorğulara cavab olaraq çağırılırdılar və serverin davranışını daha çevik və ağıllı etməyə imkan verdilər.
Belə ki, servlet — bu xüsusi bir Java-plugindir, hansı ki, Java veb-serverinə
qoşulurdu və müəyyən səhifələrə sorğu gələndə Java kodunu yerinə yetirməyə imkan verirdi. Bu Java kodu isə, Servlet sinifindən törəmiş bir sinif tərəfindən təqdim edilirdi və bu kod onun yaradıcılarının nə düşündüysə onu edirdi.
Və artıq bildiyin kimi, ən populyar Java veb-server — Tomcatdir. Yeri gəlmişkən, adı "Tom və Jerry" cizgi filmindəki pişiyin Tom adına görə verilmişdir.
Bəs Tomcat servletlərlə necə qarşılıqlı əlaqədə olur? Əslində bu proses standartlaşdırılıb və buna servletin həyat dövrü deyilir. Burada servlet — yüklənə bilən obyekt, veb-server isə servletlərin konteyneridir.
Əgər servlet hələ yüklənməmişsə, o zaman:
- Servlet sinfi konteyner tərəfindən yüklənir.
- Konteyner sinifin nümunəsini (obyekt) yaradır.
- Konteyner servlet obyektinin
init()
metodunu çağırır. Bu metod yalnız bir dəfə çağırılır.
Standart iş dövrü — müştəri sorğusunun xidmət edilməsi :
- Hər bir sorğu ayrı bir yivdə işlənilir.
- Konteyner servletin
service()
metodunu çağırır və ora ServletRequest və ServletResponse obyektlərini ötürür. - Servlet işinin tamamlanması üçün servlet obyektinin
destroy()
metodu çağırılır. Bu metod yalnız bir dəfə çağırılır.
Servlet işinin tamamlanmasının bir çox səbəbi ola bilər:
- Proqramçı veb-serveri yenidən işə salır, bütün servletlərin işini düzgün şəkildə tamamlamaq lazımdır.
- Proqramçı servletin yeni versiyasını yükləyir, köhnəsini düzgün şəkildə boşaltmaq lazımdır.
- Və s.
Əsasını yadda saxla: veb-server və onun servletləri illər boyunca, dəfələrlə yenidən yüklənmədən və xətasız işləməlidir, hər dəqiqə minlərlə sorğu xidmət edərək. Buna görə də servletin həm yükləmə, həm iş, həm də boşaltma kodu həmişə yüksək keyfiyyətli olmalıdır.
1.2 HttpServlet Sinfi
Servlet Sinfi servlet və konteyner arasında işin standartlaşması üçün mövcuddur. Proqramçılar bu siniflə birbaşa işləmirlər. Və ya çox nadir hallarda işləyirlər. Ən çox istifadə olunan Servlet'dən törədilmiş HttpServlet
sinfidir.
Bu sinifdə bizə lazım olacaq bir neçə metod var. Bu metodlardan tez-tez istifadə edəcəksən:
Metod | Təsvir | |
---|---|---|
1 | init() |
Servletin yüklənməsi zamanı bir dəfə çağırılır |
2 | destroy() |
Servletin boşaldılması zamanı bir dəfə çağırılır |
3 | service(HttpRequest, HttpResponse) |
Servletə hər yeni sorğu üçün çağırılır |
4 | doGet(HttpRequest, HttpResponse) |
Servletə hər yeni GET-sorğusu üçün çağırılır |
5 | doPost(HttpRequest, HttpResponse) |
Servletə hər yeni POST-sorğusu üçün çağırılır |
6 | doHead(HttpRequest, HttpResponse) |
Servletə hər yeni HEAD-sorğusu üçün çağırılır |
7 | doDelete(HttpRequest, HttpResponse) |
Servletə hər yeni DELETE-sorğusu üçün çağırılır |
8 | doPut(HttpRequest, HttpResponse) |
Servletə hər yeni PUT-sorğusu üçün çağırılır |
init()
və destroy()
metodları Servlet sinfindən miras alınır. Buna görə, öz servletində onları yenidən təyin etmək istəyirsənsə, onları əsas sinifdən də çağırmaq lazımdır. Bunun üçün super.metodAdı()
əmri istifadə olunur.
Servlet nümunəsi:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Sorğudan “secret” parametrini alırıq
String secret = request.getParameter("secret");
// “secret” parametrini Http-sessiyaya daxil edirik
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Brauzer üçün cavab olaraq HTML çap edirik
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Başlıq</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet nümunəsi "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 Metod service(HttpServletRequest, HttpServletResponse)
Müştəri sorğusunun işlənməsi servlet baxımından belə görünür:
Hər müştəri sorğusu üçün konteyner (veb-server) HttpServletRequest
və HttpServletResponse
obyektlərini yaradır, sonra isə uyğun servletin service(HttpServletRequest request, HttpServletResponse response)
metodunu çağırır. Bu obyektlər ora ötürülür ki, metod request
-dən lazım olan məlumatları ala bilsin və işin nəticəsini response
-a qoysun.
service()
metodunun default olaraq bir implementasiyası var. Əgər onu yenidən tərtib etməsən, o icra olunacaq. Bu, belə işləyir:
service()
metodu request’dən HTTP-metod növünü (GET, POST, ...) müəyyən edir və sorğuya uyğun metodu çağırır.
Metod | Təsvir | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Servletə hər yeni sorğu üçün çağırılır |
2 | doGet(HttpRequest, HttpResponse) |
Servletə hər yeni GET-sorğusu üçün çağırılır |
3 | doPost(HttpRequest, HttpResponse) |
Servletə hər yeni POST-sorğusu üçün çağırılır |
4 | doHead(HttpRequest, HttpResponse) |
Servletə hər yeni HEAD-sorğusu üçün çağırılır |
5 | doDelete(HttpRequest, HttpResponse) |
Servletə hər yeni DELETE-sorğusu üçün çağırılır |
6 | doPut(HttpRequest, HttpResponse) |
Servletə hər yeni PUT-sorğusu üçün çağırılır |
Öz sinfində ya service()
metodunun yalnız birini yenidən tərtib edə bilərsən, ya da onu heç toxunmadan, lazım olduqda doGet()
, doPost()
və s. metodlarını yenidən tərtib edə bilərsən.
GO TO FULL VERSION