İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

Servlet

Yazı dizisinin bundan önceki diğer üç bölümde, J2EE'ye ve kapsadığı teknolojilere teorik bir giriş yaptık. Uygulama sunucularından bazılarını beraber inceledik. Bu bölümden itibaren, kısaca açıkladığım teknolojilere pratik olarak ve daha detaylı bir şekilde yaklaşacağız.

İlk olarak değinmek isteğim teknoloji Servletler. JSP'ye bu yazımda yer vermedim. Onu da, daha sonraki bölümlerde detaylı olarak ve örneklerle inceleyeceğiz.

Eğer, herhangi bir bölümde, Java yazılım dili hakkında takıldığınız bir konu olursa, Kaynaklar bölümünde bir bağlantısı bulunan "Java Kitap Projesi"nden yararlanabilirsiniz. Sorularınızı ise aynı bölümde bağlantıları bulunan tartışma guruplarından birine yöneltebilirsiniz.

Servlet Nedir?

Servlet, dinamik içerik üreten bir Java Web bileşenidir. Bir Servlet, her yönüyle, herşeyden önce, bir Java nesnesidir. Yazdığınız bir Java Servlet sınıfı, Java derleyicisi tarafından, platformdan bağımsız olan Java bayt koduna çevirilir ve bir Servlet Kabı (Motoru) tarafından çalıştırılır. Servlet Kabı (ne olduğunu biraz ileride örneklerle göreceğiz), Servletlerin Web istemcileriyle, istem-yanıt modelini kullanarak etkileşimlerini sağlar. Bu model HTTP (Hypertext Transfer Protocol) protokolünü üzerine kurulmuştur. Genel olarak, karşılaşacağınız Servletler, Internet üzerinde, HTTP protokolü ile kullanılmak üzere yaratılmış olacaklar. Ama, Servletlerin protokolden bağımsız olduğunu belirtmekte yarar var. Örneğin, FTP ya da SMTP kullanan Servletler yazılabilir.

Servletler, Java'nin, CGI (Common Gateway Interface) programlamasına alternatifi olarak yaratıldılar. Web sunucusu ile diğer ortakat uygulamaları ve veri tabanı arasında yer alırlar. Ana görevlerinden bazıları:

Servlet Kabı

İlk başlarda Servlet Motoru (Servlet Engine) adıyla anılan ve J2EE'nin ortaya çıkması ile Servlet Kabı (Servlet Container) diye adlandırılan uygulamalar, Servletleri ve yaşam süreçlerini yönetirler. Yazılım geliştirme ortamı haricinde, her zaman bir Web sunucusuyla ve/veya uygulama sunucusuyla bereber çalışırlar. Bundan 2-3 sene öncesine kadar bağımsız ürünler olarak pazarlanan Servlet kapları, şimdi, birkaç istisna hariç, uygulama sunucuları olarak pazarlanıyorlar. Birçoğu, Servlet kabı olarak ortaya çıktılar ama zamanla, pazarın yarattığı isteğe uyarak, uygulama sunucusu haline geldiler.

Bir Servlet kabı, HTTP protokolünün istem-yanıt modelini desteklemek zorundadır. Bunun dışında, HTTPS (HTTP over SSL - SSL üzerinden HTTP) gibi diğer ek protokolleri de destekleyebilirler. Servlet belirtiminin 2.2 versiyonuna göre, HTTP'nin 1.0 versiyonun desteklenmesi zorunluyken, 1.1 versiyonun desteklenmesi tavsiye edilir.

Biraz ileride, yazılım endüstrisinin en ünlü Servlet kaplarından birini olan Tomcat'i kullanarak bir örnek geliştireceğiz. Tomcat'i seçmemin en büyük nedeni kodu açık bir yazılım olması ve Servlet belirtimine kaynak alarak geliştirilmiş olması.

Servletlerin Diğer Teknolojilerle Karşılaştırılması

Tomcat

Yazı dizisinin ilk pratik bölümüne başlamanın zamanı geldi. Hemen önemli bir noktaya değineyim: Sisteminizde bir Servlet geliştirme ve çalıştırma ortamı yaratabilmek için, öncelikle sisteminizde bir Java geliştirme ortamı bulunması gerikiyor. Eğer henüz yapmadıysanız, daha ileri gitmeden JDK 1.3 ya da JDK 1.4'i indirin ve kurun.

İlk iş Tomcat'i İnternet üzerinden indirip, sisteminize kurmak. Kullandığım Tomcat'in versiyonu 4.0.3. Bu yazıyı yazdığım sırada, kullandığım versiyon, en son kullanım için yeterince sabit ve kararlı olan versiyon. Eğer, Java ve Web teknolojileri ile yeterince deneyimli değilseniz, "kararlı" (stable) olarak etiketlenmiş versiyonların dışındakilerini kullanmamanızı tavsiye ederim.

İndirdiğiniz ZIP dosyasının (örneğin jakarta-tomcat-4.0.3.zip) içeriğini Tomcat'i kurmak istediğiniz dizine aktarın. Ben kendi bilgisayarım üzerinde ve yazılarımdaki örnekler için c:\java\tomcat dizinini kullaniyorum. ZIP dosyasının içeriğini, c:\java dizinine aktarın. Ortaya çıkan jakarta-tomcat-4.0.3 dizininin ismini tomcat olarak değiştirin. Böylece Tomcat'i c:\java\tomcat dizininin içine kurmuş olduk.

Tomcat'i çalıştırmadan önce, daha önce yapmadıysanız, yapmanız gereken iki küçük ayarlama var:

Eğer bu ayarları herhangi bir nedenden dolayı sisteminizde yapmak istemiyorsanız, başka bir seçenek daha var: c:\java\tomcat\bin\catalina.bat dosyasının içeriğini değiştirmek üzere açın. Zorunlu olan bu iki çevre değişkenini, bu dosyanın en başına aşağıdaki iki satırı ekleyerek sisteme kaydedebilirsiniz:

SET JAVA_HOME=c:\java\jdk1.4 
SET CATALINA_HOME=c:\java\tomcat 

Şimdi, c:\java\tomcat\bin dizinine gidin ve catalina start komudu ile Tomcat'i çalıştırın. Bu komuttan sonra kullandığınız DOS penceresinde

Using CATALINA_BASE:   c:\java\tomcat
Using CATALINA_HOME:   c:\java\tomcat
Using CATALINA_TMPDIR: c:\java\tomcat\temp
Using JAVA_HOME:       c:\java\jdk1.4

yazılarını göreceksiniz. Yeni açılan pencerede de Tomcat'in çalıştığını ve kullandığınız versiyon numarasını göreceksiniz:

Starting service Tomcat-Standalone
Apache Tomcat/4.0.3
Starting service Tomcat-Apache
Apache Tomcat/4.0.3

Tahmin edeceğiniz gibi, catalina stop komuda da Tomcat'i durdurur.

Tomcat'i test etmek için, en gözde İnternet tarayıcınızı açıp (Eğer henüz denemediyseniz Opera'yı şiddetle ve hararetle tavsiye ederim), http://localhost:8080/ adresine gidin. Bu, Tomcat'in giriş sayfasını açacak:

Tomcat'in giriş sayfası

http://localhost:8080/examples/servlet/HelloWorldExample ise "Merhaba Dünya" (ya da "Selâm Millet") Servletini çalıştıracak:

Merhaba Dünya Servleti

Bu iki adresi sorunsuz çalıştırabildiyseniz tebrikler! Tomcat'i kurup, ilk Servletinizi çalıştırdınız. Eğer herhangi bir sorunla karşılaştıysanız, Kaynaklar bölümündeki tartışma gruplarından birine üye olup, istediğiniz sorularu sorup, diğerlerinin tecrübelerinden yararlanabilirsiniz.

Bir sonraki adım "Merhaba Dünya" Servlet örneğini yaratmak.

Merhaba Dünya

İlk önce yeni bir WebApp yaratalım (WebApp terimi, Web Uygulaması anlamına gelen Web Application'ın kısaltması). Tomcat'in Web uygulamaları, webapps dizini içinde yeralır. Yeni örneğimizi içerecek olan ornekler dizinini, webapps dizini içinde yaratın. Bu dizin, bizim Web uygulamamızın ana dizini olacak.

ornekler

Daha sonra, ornekler dizini içinda WEB-INF isimli bir dizin yaratın. Normal olarak, ornekler dizini içine konulan her dosya ve dizin, tarayıcı kullanarak görülebilir duruma gelir (Bunu test etmek için, ornekler dizini içine bir dosya koymanız ve http://localhost:8080/ornekler/ adresine gitmeniz yeterli). Bu dediğim, WEB-INF hariç, tüm dizinler ve dosyalar için geçerli. WEB-INF, Web uygulamasının düzenleşim dosyasını, Servlet sınıflarını, gerekli olan Java sınıflarını ve kütüphanelerini içinde bulundurur.

WEB-INF

Yazacağımız Servletin içinde bulunacağı classes dizinini WEB-INF'in içinde yaratın.

classes

Yaratacağımız basit Servletin görevi, gelen her tarayıcı istemi için, dinamik olarak, "Merhaba Dünya" diyen bir HTML sayfası yaratmak. Bu temel analizden sonra, en gözde editörümüzü açıp kod yazmaya başlayabiliriz.

Servletimizin hangi pakete ait olduğunu belirtelim:

/**
 * Package
 */
package erkans.servlet;

Servletimizin hangi sınıflara bağımlı olduğunu "import"" komutları ile belirtelim:

/**
 * Imports
 */
//J2SE
import java.io.IOException;
import java.io.PrintWriter;

//J2EE
import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

Programlarınızın import komutlarında, tüm bir pakete ("*" ile) başvurmak yerine, kullandığınız sınıfları tek tek yazmanızda büyük yarar var. Bunun birincisi "okunabilirlilik". import komutlarını ayrı ayrı yazarak, kodunuzu, başka birisi tarafından daha kolay okunulabilir hale getirirsiniz. İkinci büyük avantaj ise yarattığınız sınıfın dış bağımlılığını rahatça görebiliyor olmanız. Teorik olarak, ne kadar az import kullanırsanız, kodunuz o kadar "yeniden kullanılabilir" olur.

Yukarıda gördüğünüz gibi, Servletimiz, javax.servlet paketini kullanıyor. Bu paket, J2EE (Java 2 Enterprise Edition) kapsamına giriyor ve J2SE (Java 2 Standard Edition)'nin içinde bulunmuyor. Biraz ileride de göreceğimiz gibi, Servletimizin kodunu başarıyle derleyebilmek için, javax.servlet paketini içeren JAR dosyasını CLASSPATH'ımıza eklemek zorunda kalacağız.

Yaratmakta olduğumuz Servletin sınıfını belirtelim:

**
 * J2EE Imparatorlugu - 4. Bolum
 * Basit bir Servlet ornegi. Her tarayici istemi geldiginde, <b>Merhaba
 * Dunya</b> gosteren bir HTML sayfasi yaratir.
 *
 * @author Yagiz Erkan (http://www.erkans.com)
 * @version 1.0
 */
public class MerhabaDunya extends HttpServlet {

Servletimiz, ve büyük ihtimalle, yazacağınız Servletlerin tümü javax.servlet.http.HttpServlet sınıfından türer.

/**
   * HTTP GET istemi tarafindan calistirilir.
   *
   * @param request HTTP istemi
   * @param response HTTP cevabi
   * @throws IOException I/O hatasi olunca
   * @throws ServletException Servlet hatasi olunca
   */
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
                    throws IOException, ServletException {

Daha sonraki yazılarımda, Servletleri detaylı incelerken göreceğiniz gibi, geliştirdiğiniz Servlet doGet, goPost, doPut, doDelete, init veya getServletInfo metodlarından en az birine gövde yazarak sunucu ile iletişim kurabilecek. Bu basit örneğimde, doGet kullanıyoruz. HTTP protokolüne yabancı olmayanların tahmin ettikleri gibi, bu metod, sunucunun, istemciden HTTP GET komutu almasıyla çalıştırılır.

request nesnesi, sunucuya gönderilen istemi, response nesnesiyse, istemciye gönderilen cevabı nesneleştiriyor.

doGet metodunun işlemi sırasında herhangi bir sorunla karşılaşıldığında, sorunun cinsine göre IOException ya da ServletException istisnalarından biri iletiliyor.

// Dokumanin tipini HTML olarak belirle
    response.setContentType("text/html");

İstemciye göndereceğimiz cevabın içeriğinin ne tipte olduğunu belirtmemiz gerekiyor. Servletimiz HTML yarattığı için, içeriğinin cinsi HTML (text/html) oluyor. Content-Type özelliği, MIME (Multi-Purpose Internet Mail Extension) Type'lardan birine eşit olmalı. Örneğin, Servletimiz HTML yerine XML yatıyor olsaydı,

response.setContentType("text/xml"); 

kullanacaktık. Kaynaklar bölümünde MIME Typesların bir listesi var.

// icerik yazmak icin response'dan bir Writer nesnesi al.
    PrintWriter out = response.getWriter();

Sunucuya gönderilecek olan cevabı dinamik olarak hazırladığımızı söyledik. Durağan (statik) içerik, önceden oluşturulmuş bir dosyayı göndermekle elde edilir. Bu dosya, gönderilidiği anda oluşturulmadığı veya değiştirilmediği için, olduğu gibi istemciye iletilir. İnternet üzerindeki sitelerin çoğunluğu durağan dosyalar kullanırlar.

İstemciye göndereceğimiz cevabın içeriğine biz karar verdiğimiz için, bu verileri göndermek bize düşüyor. Cevabı simgeleyen response nesnesine (dolaylı olarak istemciye) istediğimiz verileri gönderebilmek için, getWriter() metodunu kullanarak, bir java.io.PrintWriter nesnesi elde ediyoruz.

// Dokumanin icerigini gonder
    out.println("<html>");
    out.println("<head>");
    out.print("<meta http-equiv=\"content-type\"");
    out.println(" content=\"text/html; charset=ISO-8859-9\">");
    out.println("<title>Merhaba Dünya!</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Merhaba Dünya!</h1>");
    out.println("</body>");
    out.println("</html>");

Daha sonra, istediğimiz içeriği HTML olarak istemciye gönderiyoruz. 

    // PrintWriter'i kapat
    out.close();
  }//son doGet
}//son MerhabaDunya

Son olarakta, göndermek istediğimiz veriler tamamlandığında, kullanmayı bitirdiğimiz PrintWriter nesnesini kapatıyoruz. Kodumuz hazır: MerhabaDunya.java

Göster Gizle Kopar Satır Gizle Satır Göster
/**
 * Package
 */
package erkans.servlet;

/**
 * Imports
 */
//J2SE
import java.io.IOException;
import java.io.PrintWriter;

//J2EE
import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * J2EE Imparatorlugu - 4. Bolum
 * <br>Basit bir Servlet ornegi. Her tarayici istemi geldiginde, <b>Merhaba
 * Dunya</b> gosteren bir HTML sayfasi yaratir.
 *
 * @author Yagiz Erkan (http://www.erkans.com)
 * @version 1.0
 */
public class MerhabaDunya extends HttpServlet {

    /**
     * HTTP GET istemi tarafindan calistirilir.
     *
     * @param request HTTP istemi
     * @param response HTTP cevabi
     * @throws IOException I/O hatasi olunca
     * @throws ServletException Servlet hatasi olunca
     */
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
                      throws IOException, ServletException {

        // Dokumanin tipini HTML olarak belirle
        response.setContentType("text/html");

        // icerik yazmak icin response'dan bir Writer nesnesi al.
        PrintWriter out = response.getWriter();

        // Dokumanin icerigini gonder
        out.println("<html>");
        out.println("<head>");
        out.print("<meta http-equiv=\"content-type\"");
        out.println(" content=\"text/html; charset=ISO-8859-9\">");
        out.println("<title>Merhaba Dünya!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Merhaba Dünya!</h1>");
        out.println("</body>");
        out.println("</html>");

        // PrintWriter'i kapat
        out.close();

    }//son doGet

}//son MerhabaDunya

Derleme

Kodumuz hazır. Kodu içeren dosyayı MerhabaDunya.java adı altında kaydedin. Servletler, normal Java sınıfları oldukları için, Servlet kabı tarafından çalıştırılmadan önce, derlenmeleri gerekiyor. Bunun için, bir DOS penceresi açın ve kod dosyasının bulunduğu dizine gidin. Aşağıdaki komutu kullanarak kodunuzu derleyin:

javac MerhabaDunya.java

Eğer, aşağıdakine benzer hata mesajları alıyorsanız, CLASSPATH'da bir değişiklik yapmanız gerekiyor:

MerhabaDunya.java:14: package javax.servlet does not exist
import javax.servlet.ServletException;
                     ^
MerhabaDunya.java:16: package javax.servlet.http does not exist
import javax.servlet.http.HttpServlet;
                          ^
MerhabaDunya.java:17: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletRequest;
                          ^
MerhabaDunya.java:18: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletResponse;
                          ^
MerhabaDunya.java:28: cannot resolve symbol
symbol  : class HttpServlet
location: class erkans.servlet.MerhabaDunya
public class MerhabaDunya extends HttpServlet {
                                  ^
MerhabaDunya.java:38: cannot resolve symbol
symbol  : class HttpServletRequest
location: class erkans.servlet.MerhabaDunya
    public void doGet(HttpServletRequest request,
                      ^
MerhabaDunya.java:39: cannot resolve symbol
symbol  : class HttpServletResponse
location: class erkans.servlet.MerhabaDunya
                      HttpServletResponse response)
                      ^
MerhabaDunya.java:40: cannot resolve symbol
symbol  : class ServletException
location: class erkans.servlet.MerhabaDunya
                      throws IOException, ServletException {
                                          ^
8 errors

Hata mesajlarının nedeni, Servlet sınıflarının, standart Java paketlerinin içinde bulunmamaları. Bu yüzden, CLASSPATHımıza, Tomcat ile beraber gelen servlet.jar kütüphanesini de dahil etmemiz gerekiyor (Eğer bu konularda emin olmadığınız ya da yenilemek istediğiniz temel bilgiler varsa, Kaynaklar bölümünde bağlantısı olan "Java Kitap Projesi"nden yararlanabilirsiniz. Sorularınızı ise aynı bölümde bağlantıları bulunan tartışma guruplarından birine yöneltebilirsiniz.):

set CLASSPATH=.;c:\java\tomcat\common\lib\servlet.jar

servlet.jar dosyasının yeri, kullandığınız Tomcat'in versiyonuna göre değişebilir. Gerekli ayarlamaları yapmadan önce, dosyanın orada olup olmadığını kontrol edin. servlet.jar dosyasını CLASSPATH'a dahil ettikten sonra, kodumuzu tekrar derlemeye çalıştıgımızda, bir sorunla karşılaşılmadan, MerhabaDunya.class dosyasının, erkans ve servlet dizinleri içerisinde yaratıldığını göreceksiniz.

MerhabaDunya.class dosyasını, ornekler webapp'ı içine yerleştirmemiz gerekiyor ki, tarayıcımızla Servletimize bir istem gönderdiğimizde, Servlet kabı, MerhabaDunya sınıfını bulup çalıştırabilsin. MerhabaDunya Servletinin yeri, diğer Servletler için de olduğu gibi, WEB-INF içerisindeki classes dizini. Burada dikkat edilecek nokta, Servletimizi buraya koyarken, gerekli paket hiyerarşisini de oluşturmak:

C:\java\tomcat\webapps\ornekler\WEB-INF\classes\erkans\servlet\MerhabaDunya.class

Servletimiz çalıştırılmaya hazır durumda. Yukarıda belirttiğim gibi, catalina start komutuyla Tomcat'i çalıştırın. Tarayıcınıza aşağıdaki adresi girin:

http://localhost:8080/ornekler/servlet/erkans.servlet.MerhabaDunya

Elde ettiğiniz sonuç "Merhaba Dünya!" mesajlı bir sayfa olmalı:

Merhaba Dünya 

Kısaca...

Bu yazımda, en sık kullanılan Java teknolojilerinden biri olan Servletlere değindim. Servletler, Java Web bileşenleridirler. Java platformundan ve İnternet protokollerinden yararlanarak, dinamik içerik üretmek için kullanılırlar.

Teorik bir girişten sonra, kolları sıvayıp, yazı dizisinin ilk pratik çalışmasını yaptık. İlk önce Tomcat'i sistemimize kurduk. Çalıştırdık ve test ettik. Daha sonra, basit bir HTML sayfası yaratan ilk örneğimizi yarattık, derledik, kurduk ve İnternet tarayıcımızı kullanarak sonucu gördük.

Daha sonraki yazı dizilerinde de göreceğiniz gibi, Servletler artık basit HTML sayfaları yaratmak için kullanılmıyorlar. Bu amaca daha iyi hizmet eden başka bir teknoloji var: JSP (Java Server Pages). Servletlerin J2EE mimarisindeki yeri HTML yaratmaktan daha önemli. Ama, her teknolojide olduğu gibi, Servletleri de sindirerek öğrenmemizde yarar var. Benim size tavsiyem, Tomcat'in örnekler (examples) bölümüne bir göz atın. Örnek servletleri çalıştırın, yaptıkları işlere bakarak kaynak kodlarını inceleyin. Kaynaklar bölümündeki kitaplara da bir göz atın. Yine aynı bölümde bazı tartışma gruplarının bağlantılarını koydum. Eğer sorularınız varsa soru sormak için, tecrübeniz varsa bilgilerinizi paylaşmak için veya sadece diğerlerinin deneyimlerini dinleyip, karşılaşabileceğiniz aynı tipteki sorunlardan önceden haberdar olmak için, bu listedeki guruplara katılabilirsiniz. Ben genellikle oralardayım ve sizi de beklerim. Yazılarımla ilgili olumlu ya da olumsuz eleştirilerinizi, düşüncelerinizi ve yardımlarınızı, özel adresime ya da tartışma guruplarından birine yöneltebilirsiniz. Bir sonraki bölüme kadar hoşçakalın...

Kaynaklar

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır