Jsp Architecture & LifeCycle

Merhaba arkadaşlar, bu yazımda Jsp mimarisine ve jsp page’lerin yaşam döngüsüne dilim döndüğünce değinmeye çalışacağım.

Öncelikle ne olursa olsun Jsp sayfasının bir Servlet olduğunu aklımızdan çıkarmayalım. Jsp sayfaları belli başlı aşamalardan geçtikten sonra bildiğimiz Servlet sınıflarına dönüşürler. Bu yazımda bu aşamaları ve jsp sayfalarının nasıl çalıştığını göstermekle beraber yaşam döngüsünü de göstermiş olucağım.

Contaıner, jsp sayflarını .java uzantılı Java sınıflarına translate eder. Burada translate aşamasına değinecek olursak eğer Jsp sayfaları içerisinde yazdığımız Expression Tag(local), Declaration Tag(instance), Scriptlet Tag(local) yada page directive vs gibi Java’ya ait olan herşey Contaıner tarafından Java’daki karşılığına çevrilir. Contaıner burada bize bazı avantajlar vs sağlar. Bunlar implicit objeler, el, jstl gibi özellikler olabilir.

Translate aşamasında .jsp sayfasının uzantısı .java olacak şekilde Java classına dönüşmüş olur. Burada isimlendirme taslağı ise şu şekildedir; MyJsp.jsp –>> MyJsp_jsp.java

Translate aşamasından sonra normal bir java sınıfının olduğu gibi .java uzantılı dosya compile edilir ve .class uzantılı compile edilmiş java sınıfları oluşur. MyJsp_jsp.java –>> MyJsp_jsp.class

Bu aşamadan sonra artık Jsp değil Servlet’ten bahsediyor olmuş oluruz.

Bundan sonraki aşama ise yine Contaıner görev ve sorumluluğundadır. Initalize edilmesi ve servlet sınıfını load olunması contaıner’ın görevidir. Jsp sayfasında herhangi bir değişiklik olmadığı sürece Contaıner jsp sayfasını yeniden derlemeyecektir. Bu da bize hız konusunda önemli bir katı sağlayacaktır.

Jsp sayfalarının Servlet’ dönüşme aşamasında vendor’a(sağlayıcı) göre farklılıklar olabilir. Tomcat için konuşalım;

  • Directive bakılır ve translation aşaması için gerekli bilgiler toplanır. Bunlar jsp sayflarına import edilecek java sınıfları olabilir veya jsp sayfasının session, cache, buffer vs vs gibi özellikleri olabilir.
  • HttpServlet subclass’ı oluşturulur. Tomcat 5 için;
    org.apache.jasper.runtime.HttpJspBase sınıfından extend edilir.
  • page attribute içerisinde import ifadesi var ise package ifadesinin alında ve class dışına bunlar yazılır. package ifadesi yine Tomcat 5 için şöyledir;
    package org.apache.jsp;
  • Sonraki aşamada Declaration tag ile tanımlanmış instance değişken veya methodlar service methodu önceine yazılır.
  • Sırada service methodunun oluşturulması vardır. _jspService() methodu oluşturulur. İçerisinde superclass’ın service methodu çağrılır ve HttpServletRequest/HttpServletResponse objeleri gönderilir. Ayrıca service methodu içerisinde tüm implicit objeler initalize edilerek oluşturulur. İmplicit objelere daha sonra detaylı değineceğim insaAllah. _jspService() methodunun başında ki underscore bir anlam içerir. Bu method jsp lifecyle içerisindeki methodlardan biridir. Diğer methodlardan ayıran özelliği ise override edilememesidir! Bu trick bilgiye şurada yer vermiştim
  • Html satırları ve Scriptlet ile Expression tag içerisindekiler PrintWriter ile response out’a yazdırılır. Bunun nasıl olduğunu önceki yazılarımda göstermiştim.

Yukarıda Servlete dönüştürülmüş jsp sayfası bulunmaktadır. Bir önceki yazılarımda kullanmış olduğum sayfa her ziyaret edildiğinde tutulan count değişken örneğidir. Jsp karşılığı ise;

Jsp sayfları nasıl request alır ve handle edilir ona bakalım;

  • Html sayfalarına gelen requestler gibi .jsp uzantılı web sayfasına browser tarafından istek gönderilir. İstek, web server tarafından karşılanır ve ilgili .jsp sayfası ile ilişkilendirilir.
  • Contaıner, jsp sayfasını bulup http requesti jsp sayfasına yönlendirir.
  • Contaıner, jsp sayfasını bulduktan sonra servlete dönüştürür. Buradaki dönüştürmeler önceki yazılarımda göstermiş olduğum gibi tamamen println() ifadesi içerisine yazılır.
  • Servlet sayfası initalize edilip load olunduktan sonra request orjinal service methoduna paslanır. Buradan daha sonra html olan bir içerik oluşturulur ve response olarak return edilir.

Adım adım lifecyle bakalım;

1. Jsp sayfasının oluşturulması;

Screenshot from 2015-06-29 23:26:56

 

2. Jsp sayfasına istek gönderilmesi;

Screenshot from 2015-06-29 23:27:46

3. Servlet classın oluşması;

Screenshot from 2015-06-29 23:27:56

4. Load olunması;

Screenshot from 2015-06-29 23:28:02

 

5. initalize edilmesi. Bu aşamadan sonra jsp sayfası/ servlet artık istekleri karşılamaya hazır durumdadır.

Screenshot from 2015-06-29 23:28:08

 

6. Requstlerin handle edilmesi. Servletlerde olduğu gibi her request farklı thread üzerinden handele edilir.

Screenshot from 2015-06-29 23:28:16

 

 

Tüm bu aşamaları özetleyecek olursak;

Screenshot from 2015-06-29 23:32:25

 

Translation, Compilation, Loading ve instantiation aşamalarını az önce yazmıştım. Loading işleminin tek sefer yapıldıgını ve jsp sayfasında bir değişiklik olmadığı sürece yenilenmeyeceğini aklımızdan çıkarmayalım.

Jsp Lifecycle’ de 3 adet method bulunur. Bunlar jspInit(), _jspService() ve jspDestroy() methodlarıdır.  Servlet’lerden hatırlayacağınız üzere init methodu yaşam döngüsü içerisinde sadece 1 kez çağrılırdı ve config param vs gibi değişkenleri initialize ediyorduk. Tabi amaca göre bu değiştirilebilir. Yine jspDestroy() methodu da sadece 1 kez çalıştırılır o da servlet memory’den silindiğinde.

_jspService() methodu her request için farklı thread’ler üzerinden çağrılacaktır. Requestin handle edilidği kısımdır. Diğer iki methodu override edip düzenleyebilirken bu methodu override edememekteyiz.

Override edebileceğimiz methodları override edelim;

Sayfaya browser üzerinden istek yaptığımızda tek bir defalığına initalize çağrılacaktır. Serverı durdurduğumuzda yada application undeploy olduğunda ise yine tek bir sefer destroyed mesajını göreceğiz.

Screenshot from 2015-06-29 23:49:51

 

Yazımı burada sonlandırmak istiyorum arkadaşlar. Bir sonraki yazımda initilaziton aşamasında config paramları web.xml de nasıl okuruz vs gibi konulara değineceğim insaAllah.

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

~ Alican Akkus

 

948 Total Views 1 Views Today