Servlet Temelleri

Java Servlet teknolojisi, sunucu-istemci (server-side) tabanlı uygulamalar geliştirmek için tasarlanan, platform bağımsız Java bileşenleridir. Servlet sınıflarını kullanarak, dinamik içeriğe sahip, yüksek performanslı sunucu taraflı yazılımlar geliştirmek Java ile oldukça basitdir.

Servletler, herhangi bir protokole özel olarak tasarlanmış bileşenler değildir. Pekçok farklı protokol üzerinde çalışabilen sunucu-istemci uygulamalarını Java platformunda servlet teknolojisi ile geliştirebiliriz. Ancak, web uygulamaları ve dolayısı ile HTTP protokolü en popüler yapılar olduğu için, servletlerin daha çok bu protokol üzerinde çalışan versiyonları bu yazıda ele alınacaktır.

Servlet teknolojisini daha iyi anlamak için, öncelikle servletlerin neden ortaya çıktığından bahsetmek gerekir. Servletler, CGI teknolojisinde ortaya çıkan sorunları ortadan kaldırmak için Java platformuna kazandırılmıştır.

CGI Teknolojisi ve Problemler

CGI teknolojisi sayesinde, herhangi bir programlama dili ile web uygulamaları geliştirilebiliyor.

Java programlama dili ile de pektabi ki CGI kullanarak, web uygulamaları oluşturabiliriz. CGI de mantık basitdir. HTML çıktısı oluşturan bir Java uygulaması yazarsınız, her HTTP isteğinde bu uygulamayı çağırıp kullanıcıya çıktıyı, HTTP protokolü üzerinden gönderirsiniz.

Ancak, CGI teknolojisi ile yüksek hitli web uygulamalarını geçin, orta seviyede bir kullanıcıya hitap eden bir web sitesi kurmak bile oldukça zor ve masraflıdır. Çünkü CGI, kullandığı teknoloji bakımından performansdan ödün verir. CGI de, her HTTP isteği (HTTP request) yapıldığında, çağrılacak CGI scriptleri için ayrı bir process oluşturulur. Process oluşturma, CGI scriptlerinin çalışma süresinden daha uzun bile sürebilir. Bu yüzden bu yöntem günümüzün yüksek hitli web uygulamaları için pahalı ve performanssız bir yöntemdir.

Java Servlet Teknolojisi

Servletler, CGI teknolojisinde uygulandığı gibi her HTTP isteğini yeni bir process oluşturarak yönetmezler. Bunun yerine gelen her HTTP isteği için, sunucu processi ( web server process) içinde çalışan bağımsız kanallar (threads) oluşturur. Threadler, processler gibi farklı hafıza alanları yerine (memory map), içinde çalıştığı processin hafıza alanını ortak kullanırlar. Üstelik thread oluşturulması, process oluşturma işleminden çok daha basit ve maliyetsizdir. Ayrıca threadler arasındaki geçişler (switchler) processlere göre çok daha hızlı gerçekleştirilir. Bu da web uygulamalarının geliştirilmesinde çok büyük bir performans ve maliyet kazancı sağlar.

Tüm bu teknik bilgiden sonra, Servlet teknolojisine daha yakından bakalım.

Servletler, aslında Java nesnesinden başka birşey değildir. Tamamen JVM (Java Virtual Machine) içerisinde çalışır ve varolan tüm Java API (tabiki JDBC de) ile doğal olarak entegredir. JVM üzerinde çalıştığı için Java platformunun sunduğu güçlü, güvenli ve sağlam yazılımların web üzerinde de geliştirilmesini sağlar. Bu sayede, yüksek trafiğe sahip web sitelerini Java teknolojisi ve sunduğu pekçok kütüphaneyi kullanarak inşa edebilirsiniz. Bu yönden bile Servletler, oldukça önemli bir teknolojidir.

Paketler

Servletler, Java platformunda javax.servlet paketi içinde toplanmıştır. Bu paket içerisindeki her sınıf, servletler tarafından kullanılacak özel sınıflardan oluşur.

Protokole özel servletler, yine bu paket içerisinde kendi protokol adlarını taşıyan farklı paketlerde bulunmaktadır. Örneğin, HTTP protokolü ile çalışabilen servletler, javax.servlet.http paketi içerisinde bulunmaktadır.

Servlet Mimarisi

Yukarıda da bahsettiğimiz gibi servletler, birer Java sınıfıdır.

Kendi ihtiyaçlarımıza özel servlet geliştirmek için yapmamız gereken tek şey, javax.servlet paketi içerisinde bulunan Servlet Interface arayüzünü sınıfımıza uygulamaktır. Bu interfacei uygulayan her sınıf, interfacein tanımladığı init(), service(), getServletConfig(), getServletInfo() ve destroy() methodlarını içerisinde tanımlamak zorundadır.

Servlet Interface arayüzünü uygulayan ve interfacein methodlarını tanımlayan genel tipte bir Servlet sınıfı da Java tarafından hazırlanmıştır. javax.servlet.GenericServlet adındaki bu sınıf temel Servlet sınıfını oluşturur. Spesifik protokoller için tanımlanan servletlerin çoğu, bu genel yapıdaki servlet sınıfından türetilerek, GenericServlet sınıfının methodlarını kalıtım sayesinde devralır. Bu sayede servletlerin çalıştırıldığı Servlet Containerlarının ihtiyaç duyduğu methodlar, özel servletlere kazandırılmış olur.

Servletler, Tomcat gibi Servlet Kapları (Servlet Container) içerisinde çalışırlar. Peki Servlet Containerları tam olarak ne yapıyor?

Servlet Containers

Servlet Container, servletleri çalıştırmak, kullanıma hazırlamak, gelen HTTP isteklerini talep edilen Servlet nesnelerine yönlendiren yazılımlardır. Olaya daha açık bir şekilde bakmak gerekirse, bir web uygulaması için eşzamanlı birçok HTTP isteğini kontrol eden, bu istekleri uygun Servlet nesnelerine yönelten, servletlerden gelen cevapları tekrar istemciye ileten Servlet Containerlarıdır. Containerlar, gelen her isteği threadler oluşturarak kontrol eden özel yazılımlardır.

Servlet konteynarlarının HTTP istekleri karşısında yaptıkları işler sırasıyla şu şekildedir

  • Bir HTTP isteği bekle
  • Talep edilen Servlet ilk defa çağrılıyorsa, servleti hafızaya al ve init() methodunu çağır
  • Yapılan her HTTP isteği için, javax.servlet.ServletRequest ve javax.servlet.ServletResponse sınıflarının bir örneğini oluştur.
  • Talep edilen Servlet nesnesine, oluşturulan ServletRequest ve ServletResponse nesnelerini service() methodu aracılığı ile geçir.
  • Servletin işi bittiği zaman, Servletin destroy() methodunu çağır ve hafızadan sil.

Container yazılımları servletler ile, HttpServletRequest ve HttpServletResponse adında iki nesne aracılığı ile haberleşir. Bu iki sınıf sırasıyla, javax.servlet.ServletRequest ve javax.servlet.ServletResponse sınıflarından türetilmiştir.

HttpServlerRequest ve HttpServletResponse sınıfları ve sınıfların sağladığı methodlar ile ilgili daha fazla bilgiye, örnek kodlara ulaşmak isterseniz buraya tıklayabilirsiniz.

Gelen HTTP isteği ile alakalı tüm bilgiler, HttpServletRequest nesnesinde depolanır ve talep edilen servlet nesnesine geçirilir. Servlet bu nesne aracılığı ile gelen istek hakkında her türlü bilgi ve veriye ulaşabilir.

Gelen HTTP isteğine container tarafından döndürülecek cevap, servlet tarafından HttpServletResponse nesnesi aracılığı ile yapılır. Bu yüzden container, servlet ile temasa geçtiğinde bu nesneyi de servlete parametre olarak geçirir.

HttpServlet

Yine daha önce bahsettiğimiz gibi servletler herhangi bir protokole özel olarak tasarlanmamıştır. Ancak konu HTTP protokolünü kullanmak olduğundan, bu protokole özel servletlerden bahsetmemiz gerekir. Java, HTTP protokolü ile çalışabilen methodlara sahip abstract bir servlet sınıfı sunar. HttpServlet adındaki bu sınıf, javax.servlet.GenericServlet adındaki genel tipteki servlet sınıfından türetilir. HttpServlet, abstract bir sınıf olduğu için doğrudan bir örneği oluşturulup kullanılamaz.

HTTP protokolü ile işlem yapabilen servlet sınıfları oluşturmak için, HttpServlet adındaki abstract sınıfı genişleten sınıflar oluşturmak gerekmektedir. Yani, HttpServlet sınıfını genişleten her sınıf, HTTP protokolü ile haberleşebilen birer servlet sınıfıdır.

HttpServlet doGet ve doPost Methodları

HttpServlet, HTTP protokolü ile çalışabilen birçok method sunar. Bu methodları kullanarak protokol üzerinden gelen isteklere servlet içerisinde işleyip, cevap verebiliyoruz. HttpServlet tarafından sunulan ve ‘ do ‘ ile başlayan methodlar, HTTP üzerinden gelen istekleri işlemek için tasarlanan methodlardır. Bunlardan özellikle, doGet() ve doPost() methodları önemlidir.

doGet methodu ile, HTTP protokolü üzerinden GET methodu ile gönderilen istekler ele alınır. Yine benzer şekilde, doPost() methodu içerisinde, POST methodu ile gönderilen istekler işlenir.

protected void doGet(
    HttpServletRequest request,
    HttpServletResponse response
    ) throws ServletException, IOException
{
    // Get methodu ile gelen
    // isteklerin işlendiği yer
}
 
protected void doPost(
    HttpServletRequest request,
    HttpServletResponse response
    ) throws ServletException, IOException
{
    // POST methodu ile gelen
    // isteklerin işlendiği yer
}

Servlet Uygulama Örneği

Şimdi çok basit bir Servlet sınıfı yazalım ve Servlet kullanarak ilk web uygulamamızı geliştirelim. Uygulamaya geçmeden önce söylemem gereken bir nokta da, uygulamayı Eclipse IDE ortamında geliştiriyorum. Eclipse’in sağladığı Java EE sürümü ile web uygulamaları geliştirmek oldukça basit. Ayrıca Tomcat ile entegre bir şekilde çalışarak, sonuçları çok hızlı bir şekilde görebiliyoruz. Bu yüzden örneği incelerken ve denerken, eğer herhangi bir IDE kullanmıyorsanız Eclipse Java EE IDE yi indirmenizi ve incelemenizi öneririm. Knedisi tamamen open source (açık kaynak) ve tabiki ücretsizdir.

Eclipse ve Tomcat entegrasyonuna bu yazıda değinmiycem, bu yüzden internet üzerinde bununla alakalı kaynakları inceleyerek kendiniz halledebilirsiniz. Zaten oldukça kolay.

Servlet uygulamasını Eclipse üzerinde geliştirmek için yapmamız gerekenler

File – > New -> Dynamic Web Project üzerinden yeni bir proje oluşturuyoruz. Daha sonra oluşturduğumuz projeye yanda bulunan Project Explorer üzerinden sağ tıklayarak New – > Servlet aracılığı ile bir Servlet sınıfı oluşturuyoruz. Eclipse otomatik olarak javax.servlet.HttpServlet sınıfından türeyen bir şablonda, belirlediğimiz ada uygun Servlet sınıfını oluşturacaktır.

/**
Basit bir Servlet uygulaması
*/
package org.javablog;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class JavaBlogServlet extends HttpServlet
{
 
    public JavaBlogServlet()
    {
        super();
    }
 
    protected void doGet(
        HttpServletRequest request,
        HttpServletResponse response
        ) throws ServletException, IOException
    {
        // GET yöntemi ile gelen
        //HTTP isteklerini burada işle
 
        PrintWriter output;
        output = response.getWriter();
        output.println(
            "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
            "Transitional//EN\">\n" +
            "<html>\n" +
            "<head>\n" +
            "<title>Merhaba Servlet</title>\n" +
            "</head>\n" +
            "<body>\n" +
            "<h1>JavaBlog.Org Merhaba</h1>\n" +
            "<h2>Merhaba Servlet !</h2>\n" +
            "</body></html>"
        );
 
    }
 
    protected void doPost(
        HttpServletRequest request,
        HttpServletResponse response
        ) throws ServletException, IOException
    {
        // POST yöntemi ile gelen
        //HTTP isteklerini burada işle
    }
 
} // end of class

Uygulamayı Eclipse üzerinden çalıştırdığınızda, uygulamanın hangi web sunucu ile çalıştırılması gerektiğini soracaktır. Burdan daha önce Eclipse ile entegre ettiğiniz Tomcat’i seçerek http://localhost:8080 adresi üzerinden uygulamayı çalıştırabilirsiniz. Ben projeyi oluşturuken proje ismini ServletExample olarak belirlediğim için, yukarıdaki örneği Tomcat’i aktif ettikten sonra

http://localhost:8080/ServletExample/JavaBlogServlet

adresi üzerinden çalıştırabiliyorum. Siz de kendi ayarlarınız doğrultusunda, uygulamanızı çalıştırabiliyor olmanız gerekiyor.

Peki Ya Kusurlar?

Servlet teknolojisi her ne kadar, CGI gibi teknolojilerin performans ve taşınabilirlik problemlerini ortadan kaldırmak için geliştirildi ise de, bir süre sonra teknolojinin de hızlı gelişimi ile paralel, kendisi de birtakım problemlere yol açtı. Yukarıda oluşturduğumuz Servlet örneğine bakarsak, aslında ne demek istediğimi anlayacaksınız. Tüm HTML çıktısı Servlet nesnesi içinde oluşturuluyor ve method aracılığı ile istemcilere gönderiliyor. Bu, küçük web siteleri için pek sorun oluşturmasa da, daha büyük web uygulamaları oldukça büyük bir problem.

Bugün web uygulaması geliştirmek için izlenen yol, uygulamanın tasarım (HTML) kısmı ile asıl fonksiyonelliğin (business logic) birbirinden ayrılmasıdır. Bu yapıyı doğrudan servlet kullanarak kurgulamamız çok zor. Bu yüzden Servlet teknolojisinin yanında bir takım ek modüller de Java platformuna kazandırılmıştır.

JSP (Java Server Pages) ve Java Enterprise Edition 6 ile JSP nin de pabucunu tamamen dama atan JSF (Java Server Faces) teknolojisi ile artık web uygulamalarının tamamen tasarım kısmı ile iş mantığı birbirinden ayrılıyor. Bu sayede web uygulamaları birkaç farklı koldan çok daha hızlı geliştiriliyor.

Ancak, her ne kadar Java ile, doğrudan Servlet kullanarak web uygulamaları geliştirmeyecekseniz de asıl yük Servlet mimarisi altındadır. Bu yüzden Java EE ile web uygulamaları geliştirmek için Servletlerin mantığını ve bazı özelliklerinin iyi bilinmesi bence hala önemli.


İlgili Yazılar:

  1. Java Servlet – Üyelik Sistemi Uygulaması
  2. Java Teknolojisinin Değişik Sürümleri
  3. Tomcat 7 Geliyor
  4. HttpServletRequest ve HttpServletResponse Sınıfları

Yorum bırakmak için buraya, Sitenizden trackback vermek için buraya tıklayabilirsiniz.

4 Responses to “Servlet Temelleri”

  1. [...] önce şurada temellerini açıklamaya çalıştığım Servletler, Java platformu üzerinde performanslı, [...]

  2. [...] methodlardan bahsedicem.Eğer bu nesneler veya servletler hakkında temel bilginiz yok ise, önce bu yazıyı okumanızı [...]

  3. Anonim diyor ki:

    [...] [...]

  4. Kürşat AKSAKALLI diyor ki:

    Emeğinize sağlık, bu kadar açıklayıcı ve sade bir yazıyı hemde Türkçe olarak okumak çok güzel.

Leave a Reply