Servlet Lifecycle 2 & How Servlet works?

Merhaba arkadaşlar, bu yazımda Servlet yaşam döngüsünde bazı püf noktalara ve Servlet’lerin çalışma mantığına dair noktalara değinmeye çalışacağım.

Servlet Lifecycle

Öncelikle Servlet’lerin yaşama döngüsü ile başlarsak konuyu daha iyi kavrayabiliriz.

Sevlet’ler web.xml içerisinde belirtilen <load-on-startup> parametresine göre iki şekilde yüklenir. Bunlardan biri ilk request alındığında contaıner tarafından servlet’in yüklenmesi. Diğeri ise contaıner başlatılığında yada başka bir deyişle uygulama deploy olduğunda servlet’in yüklenmesi.

Contaıner gelen requesti handle ederken servlet’in yüklenip yüklenmediğine göre bir yol haritası çizer.

Eğer servlet load olmamış ise;

  • Servlet’i yükle.(load the servlet class)
  • Servlet’ten bir instance oluştur.(instantiates the servlet class)
  • init() methodunu çağır ve ServletConfig objesini parametre olarak pasla(calls the init method and passing ServletConfig object).

Eğer servlet load olmuş ise;

  • service() methodunu çağır ve request, response objelerini parametre olarak pasla.

Servletin yaşam döngüsünü 3 kısma ayıralım. Bunlar; new , ready ve end olsun.

  • new state : Servletin load olduğu ve instance’nın oluşturulduğu durumdur.
  • ready state : Servlet’in init() methodu tamamlandığında servletimiz ready durumuna geçer. Bu andan sonra gelen requestler handle edilebilir ve service() methodu koşturulabilir.
  • end state : Servlet için destroy() methodunun koşturulması ile oluşur.

1 – Servletin load olması ; Classloader ilgili servlet class’ını bulur ve yükler. Bu class , web.xml içerisindeki url mapping ile ilişkilendirilen servlet classıdır.

2 – Servlet instance oluşuturulması ; Servlet classı load olduktan sonra Contaıner Servletten bir instance oluştutur. Servlet lifecycle içerisinde sadece bir defa instance oluşturulur. Gelen her request aynı servlet objesi üzerinde ama farklı threadler içerinde çalıştırılır.

3 – Servlet init() methodunun çağrılması ; Servlet instance oluştuktan sonra init() methodu çağrılır. Lifecycle içerisnde sadece bir defa çağrılır. Override edilebilir. ServletConfig objesini parametre olarak alır. web.xml içerisindeki init-param’ları init() methodunda okuyabiliriz. Database connection yada diğer kaynaklara erişimi buradan başlatabiliriz.

İki adet init methodu mevcuttur. Bunlar javax.servlet.Servlet interface içerisinde tanımlanmıştır ;

  1. Parametre almayan init() methodu ; super.init(config); yazılmasına gerek yoktur.
  2. ServletConfig objesini parametre olarak alan init(ServletConfig config) methodu; ServletConfig objesini parametre olarak alan init methodu override edildiğinde super.init(config); ile Contaınerın servleti ilk kullanıma hazırlamasını sağlamamız gerekmektedir. Eğer bunu yapmaz isek getServletConfig() methodu bize null dönecektir.

* init methodunu override etmek istiyorsanız parametre almayan init methodunu override etmeniz daha sağlıklı olucaktır.

* Contaıner ilk olarak parametre alan init methodunu daha sonra diğer init methodunu çağırır.

* Eğer ServletConfig objesini parametre olarak alan init methodunu override ediyorsanız super.init(config) çağrısını yaptığınızdan emin olmalısınız.

4 – service methodunun çağrılması; Web Contaıner gelen her request için service methodunu çağırır ve request, response objelerini parametre olarak methoda gönderir. Eğer Servlet initalize edilmemiş ise ilk 3 adım gerçekleşir daha sonra request handle edilir.

*  javax.servlet.Servlet interface içerisinde tanımlanmıştır.

 

* İki tane service methodunun olduğunu görmekteyiz. Bu methodlara göz atalım;

* public olan service methodu gelen Servlet request objelerini Http request  objelerine cast eder ve diğer service methodunu çağırır ve objeleri parametre olarak ekler. Diğer service methoduna bakalım;

* HttpServletRequest ve HttpServletResponse objelerini parametre olarak alan service methodu gelen request tipine göre hangi doXXX methodunun çağrılacağına karar verir. Servlet classımızda ilgili doXXX methodunu override etmemiş isek hata oluşacaktır.

2015-01-09 15:36:58

Ne Zaman/ Ne İçin/ Override Etmelimiyiz?

1 – init () : 

Ne zaman : Contaıner init methodunu servlet instance oluşturuldaktan sonra çağırır. Requst geldiğinde service methodu init() methodu bitmeden çalıştırılamaz. init() methodu tamamlandıktan sonra request handle edilebilir.

Ne için : Herhangi bir requesti handle etmeden yada request gelmeden önce servleti initalize etmek için.

Override (E/H) : Override edilebilir. web.xml’den yada diğer obje,kaynakları oluşturmak için init() methodu override edilebilir.

2 – service() : 

Ne zaman : Bir request geldiğinde Contaıner yeni bir thread oluşturur yada mevcut thread pool kullanarak service methodunu çalıştırır.

Ne için : Gelen requestin tipine göre HTTP methodunun tipine(GET, POST, PUT vs) karar verir ve ilişkili doXXX methodunu çağırır.

Override (E/H) : Override edilmesi mümkündür ancak override edilmemelidir!. Bizim görevimiz doXXX methodlarını override etmektir. service() methodunun implementasyonu Contaınerın görevidir. service() methodunu doğru şekilde override etmek zor ve zahmetlidir.

3 – doGet and/or doPost : 

Ne zaman : service() methodu doGet() , doPost() vs. methodlarını request geldiğinde ve requestin tipi belirlendikten sonra çağırır.

Ne için : Asıl yaptımız iş burada başlamaktadır. Uygulamamızın amacına yönelik işlemleri yapacağımız kod parçacıklarının bulundugu methodlardır.

Override (E/H) : Overrride edilmelidir!. Bir Http methodunu override ediyorsak eğer contaıner’a o method için requst kabul edebiliriz demiş oluruz. Örn; doPost() methodunu override etmemiş isek Http POST methodunu desktelemiyoruz demektir. Post tipte request alınamaz demektir.

How Servlet works?

Servlet’lerin request gelmeden önce , geldiği anda ve requeste cevap verildikten sonra oluşan birkaç adımı listeleyelim;

  1. Yazdıgımız herhangi bir servlet için istek geldi.
  2. web.xml içerisindeki servlet(url-mapping) ile request eşleştirilir.
  3. Gelen istek için request ve response objeleri oluşturulur.
  4. Thread içerisinde service methodu çağrılır.
  5. Önce public olan service methodu çağrılır. Bu method içerisinde ServletRequest ve ServletResponse objeleri HttpServletRequest ile HttpServletResponse objelerine cast edilir. Bu method içerisinde diğer service methodu çağrılır ve cast edilen objeler parametre olarak eklenir.
  6. Http request ve response objelerini alan service methodu gelen requestin Http method tipini belirler ve parametre olarak aldığı objeleri ilişkili doXXX methoduna parametre olarak gönderir(çağırır).
  7. doXXX() methodlarında response oluşturulur ve requeste cevap verilir.
  8. Response edildikten sonra request ve response objeleri web contaıner tarafından silinir. Üzerinde çalışılan Thread ise contaınerin implementasyonuna göre ya silinir yada thread pool’a aktarılır.

Tüm bu işlemler Web Contaıneri sorumluluğundadır.

Yazımı burada sonlandırıyorum arkadaslar.

Mutlu kalın , kod’la kalın ve bol bol Çay için

~ Alican Akkus

1238 Total Views 1 Views Today