|
Bu yazının diğer bölümleri aşağıda sıralanmıştır ulaşmak için tıklayınız.
J2EE
İmparatorluğu - Sistem Mimarileri
J2EE
İmparatorluğu - Uygulama Sunucuları - 1,
J2EE
İmparatorluğu - Uygulama Sunucuları - 2,
J2EE
İmparatorluğu - Teknolojiler
Yazı dizisinin bundan önceki diğer üç bölümünde, 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 istediğ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 grupları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ı:
- İstemci tarafından gönderilen verileri
okumak,
- Gelen HTTP istemi ve taşıdığı bilgiler
ile etkileşim sağlamak,
- Veri tabanı ve orta kat uygulamalarından
veri toplayıp işlemek,
- Bu verileri derleyip, istemcinin tipine
göre (Web, WAP, PDA, etc.) yanıt üretmek,
- İstemciye gönderilen HTTP cevabı ve
taşıdığı bilgiler ile etkileşim sağlamak,
- Dinamik olarak yaratılan cevabı, istemciye
geri göndermektir.
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ı
- CGI programlarından daha hızlı çalışırlar
çünkü daha hafif bir model kullanırlar.
- Özel API'lerle karşılaştırıldığında,
standart bir API kullanırlar.
- Java yazılım dilinin tüm avantajlarından
yararlanırlar.
- Tüm Java Platformunun farklı teknolojileri
ve teknikleri kapsayan API'lerinden yararlanırlar.
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:
- JAVA_HOME adlı bir çevre değişkeni (environment
variable) yaratın ve değerini sisteminiz üzerindeki JDK'nin kurulduğu
dizinin yoluna ayarlayın. Benim sistemimde bu
c:\java\jdk1.4'e
ayarlanmış durumda.
- CATALINA_HOME adlı bir çevre değişkeni
(environment variable) yaratın ve değerini Tomcat'in kurulduğu dizinin
yoluna ayarlayın. Benim sistemimde bu
c:\java\tomcat'e
ayarlanmış durumda.
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çinde 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
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
İnternet Üzerinde
İnternet Üzerindeki bedava hizmetlerin
sayısı gittikçe azalıyor. Ama, benim de kullandığım, MyCGIServer.Com
hala bedava Servlet çalıştırma ortamı sunuyor. Eğer bu konuya ilerideki
yazılarımdan birinde değinmemi isterseniz, bana bir
ileti göndermeniz yeterli.
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...
- Erkans.Com
- Türkçe Teknoloji Tartışma Grupları
- İnternet Üzerindeki Kaynaklar
- Java
- Servlet Kapları
- İnternet
- Kitaplar
- Diğer
Yağız
Erkan
Yazıyla ilgili görüş ve yorumlarınızı yagiz_erkan@yahoo.com
ve yorum@teknoTurk.org
adreslerine yollayabilirsiniz.
|