Friday, October 31, 2003

Servlet Teknikleri

Servlet nesnelerini JSP sayfalarının Javalaşmış hali olarak düşünebiliriz. Bir JSP sayfasının <% %> işaretleri arasında Java kodu yazmak yerine, aynı Java kodunu gerçek bir Java nesnesi olan Servlet üzerinde yaratıp, aynen orada çalıştırmak mümkündür. Zaten JSP sayfaları da derlenip, arka planda Servlet'e dönüşüyorlar!

Peki o zaman, ne için JSP kullanıyoruz? Nerede Servlet nerede JSP kullanalım?

Bu soruya cevap şöyle olacaktır: "Görsel kodları JSP içine, işlemsel kodları Servlet içine koymak gerekir".

İşlemsel kodlara örnek, veri tabanına erişen işlevler, hesap yapan, karar veren tanımlar, ya da, kullanıcının girdiği veriyi işleyip kontrolden geçiren türden işlemler olabilir. Servlet, bütün bu arka plan işleri yaptıktan sonra gerekli 'veri nesnelerini' yaratıp, kontrolü JSP'ye bırakabilir. JSP bundan sonra veri nesnelerine bakarak ekranda sayfayı göstermeye başlayacaktır.

Servlet, kullanıcı hareketlerinin (bağlantı tıklama, dügmeye basma) gittiği adres olmalıdır. Yani, bir url bağlantısı sayfaya koymuş isek, hedef olarak bu bağlantı, Servlet nesnesini gösterebilir. Bunu yapmak için şöyle bir ibare yeterlidir.

<a suraya="/IslemciServlet?bildirgec1=deger1&bildirgec2=deger2">Buraya Tiklayin</a>


Ya da, kullanıcının girdiği bilgileri işlemek için, HTML/JSP başında şöyle bir tanım yapabiliriz:

<form type=POST action="/IslemciServlet">
<input type...
....
<input type="submit"...
</form>


Yukarıdaki tıklamayı işlemek için, şöyle bir Servlet kodlanabilir.

public final class IslemciServlet extends HttpServlet {

// buraya, sinif icinde gerekli olan degiskenleri
// tanimlayabilirsiniz.

// tiklama islemi, bizi direk bu doGet islemine getirir
public void doGet(HttpServletRequest request,
HttpServletResponse response)

throws IOException, ServletException {

String bildirgec1 = request.getParameter("bildirgec1")
String bildirgec2 = request.getParameter("bildirgec2")

//
// bu degerler ile islem yap..
//

response.sendRedirect("sonuc_goster.jsp");

} catch (Exception e) {
throw new ServletException(e);
}



Sonuc_goster.jsp nesnesinin ekranda birseyler gösterebilmesi için, oturum nesnesi üzerine bazı cevap nesneleri koymak mümkün. Dikkat edin, Servlet, doGet işleminden return ile geri değer vermiyor. Servlet ile JSP'ler arasındaki iletişim bu yüzden, request.getSession() ile erişilen "oturum" (session) nesnesi üzerinden yapılıyor. Bu nesneye değer koymak için, şöyle bir ibare yeterli olur.

..
request.getSession().setAttribute("geriBildirgec1", new String("filan"));
..

Servlet Derlemek ve Yerleştirmek

Bağlantıların Servlet'lere erişebileceğini gösterdik. Peki Tomcat, ya da başka J2EE uyumlu Uygulama Servisi bu tanımı nasıl biliyorlar? Hangi Servlet'e nasıl erişileceğini bilgisayarda nasıl söylüyoruz?

Bunu yapmak için, site_ismi/WEB-INF/web.xml adlı dosyaya Servlet hakkında bilgi vermemiz gerekiyor. web.xml dosyası, Tomcat başlarken her seferinde "bakılan" bir dosyadır, Internet uygulamanız hakkında tanımlar burada yapılır.

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<servlet>
<servlet-name>IslemciServlet</servlet-name>
<servlet-class>IslemciServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>IslemciServlet</servlet-name>
<url-pattern>/IslemciServlet</url-pattern>
</servlet-mapping>

</web-app>




Uygulamanız için bir WAR dosyası paketlerken, yukarıdaki web.xml dosyasının WEB-INF/ dizini altında olması beklenir. J2EE standartına göre bu böyledir.

WAR dosyasının şöyle bir yararı var; İnternet uygulamanız için bütün gereken kodları bir paket içinde tutar. WAR dosyası yaratmak için JAR komutunu kullanabilirsiniz, sadece sonuç dosyasının sonu .jar ile değil, .war ile bitecek. Bütün fark burada.

Tabii WAR'ın 'formatı' bir yana, esas dikkat edilmesi gereken tarafı WAR'ın paketlediği 'dizin düzeninin' standarta göre olması gerektiğidir. Bu düzen şöyle olmalı:

site_ismi/WEB-INF/web.xml - Ayartanım dosyası
site_ismi/WEB-INF/classes - Derlenmiş Java nesneleri
site_ismi/WEB-INF/lib - Paketlenmiş serbest yazılım, ya da ticari dış
Java paketleri

Böyle bir düzeni paketleyip Tomcat'a verdiğinizde (webapps altına bırakarak mesela), hiç CLASSPATH ile uğraşmanız gerekmeyeceğini belirtelim. Bu yöntemin rahatlığı budur: J2EE standartına göre yazılmış bütün Uygulama Servisleri, classes/ ve lib/ altında gördükleri Java nesnelerini CLASSPATH'e otomatik olarak dahil ederler.

Servlet'e Dönelim

Web.xml, Tomcat'a Servlet'in nerede olduğunu gösterdi. Bunun haricinde, Tomcat'in içinde (server.xml üzerinde), her Servlet'i gösterecek şekilde yapılmış bir ayar da vardır. Bu ayar sayesinde sonu "Servlet" ile biten bütün Java dosyalarına, http://localhost:portno/siteismi/servlet/xxxServlet gibi bir ibare ile erişilebilirsiniz.

Yani, programcı dilerse, yukarıda servlet-mapping olarak gösterilen ibareyi hiç kullanmayabilir, Servlet'in öteki kullanım şekli ile halâ erişilmesi mümkündür. Seçim programcıya kalmış. Sistem idaresi bakımından Servlet'lerin direk adresini özellikle belirtmek size daha uygun gelebilir.

Evet, şimdi Tomcat'i başlatın, ve tarayıcınızdan önce HTML sayfasına, oradanda tıklayarak Servlet'i işlettirip, JSP sayfasına gidebilirsiniz.

Unutmayın, Servlet içinden HTML üretmeyin, çünkü kod bakımı açısından zorluklar yaşayabilirsiniz. Başkasının yazdığı bir program üzerinde Metin (String) nesnesi kullanılıp Java içinde HTML üretildiğini görünce kaçmak isteyen çok programcı gördüm! Aynı şekilde, JSP içinde görsel olmayan işlem yapmak uygun değildir. Sonuç itibari ile JSP içinde daha limitli bir ortama "hapis durumdayız", bir Java sınıfında olduğumuz kadar serbest olamayız. Bu yüzden dişli bütün kodların JSP içinden çıkartılması isabetli olur.

Özel örnek vermek gerekirse, birim testlerinin erişimi bakımından Servlet üzerinde işlem mantığı işinizi kolaylaştıracaktır. Ayrıca, kodunuz Servlet üzerinde ise, sözdizim hatalarını derleme sırasında bulabilirsiniz, JSP örneğinde sayfayı ayreten ziyaret ederek derleme işlemini 'tetiklemek' gerekecekti. Servlet ile bu dertlerden kurtuluyoruz.

Yardımcı Programlar


* Java J2SE Geliştirme Seti (JDK) - Temel Java kütüphaneleri ve derleyici programı
* Java J2EE Geliştirme Seti (JDK) - Servlet kodlarını derlemek için gereken kütüphaneler
* Tomcat Uygulama Servis programı

No comments: