Eğer bir Web Uygulaması geliştirmek istiyorsanız, bir sürü seçeneğiniz var. Bunlardan biri de Struts2'dir.
Struts1'in devemı olan Struts2, size MVC dizayn şablonunu uygulayan modern bir altyapı sağlar. Struts2 nin Struts1'den aldıklarının yanında ondan farklı olan bir çok yeni özelliği vardır.
Eğer geçimişte Struts2 ile uygulama geliştirmiş iseniz, Struts2 ile uygulama geliştirmeye başladığınızda bir çok yeni özelliği hemen farkedeceksiniz. Aslında Struts2, struts1 ile karşılaştırıldığında size tamamen yeni ve farklı bir altyapı sağlar. Tabii ki Struts1 ile bazı ortak noktaları vardır. Ama bu ortak noktalar Struts1'in devamı olduğu için değil, aynı MVC dizayn şablonunu uyguladığı içindir. Sonuç olarak şunu diyebiliriz: Struts2 MVC ve terminolojiyi Struts1'den kalıtsal olarak almıştır ama tamamen farklı bir altyapıdır.
Bu dokümanda, Struts1'den bahsetmeyeceğiz ama Struts1 ve Struts2'nin özelliklerini karşılaştırmak yerinde bir hareket olacaktır.
Aşağıdaki Struts1 ve Struts2 karşılaştırması yer almaktadır. Bu karşılaştırma http://www.roseindia.net/struts/struts1-vs-struts2.shtml adresinden alınmıştır.
| Özellik | Struts1 | Struts2 |
| Action Sınıfları | Struts1, Action sınıfını Ana sınıftan kalıtsal olarak yaratır. Struts1'deki problem, “Arayüzler” (İnterface) kullanmak yerine, ana sınıflar kullanmasınıdır.
| Struts2'de Action sınıfı Action arayüzlerini uygular. Bunun yanında çoğunlukla kullanılan arayüzleri ActionSupport Sınıfında uygulatır.
Action sınıfı için herhangi bir arayüz uygulamasına gerek yoktur. Basit bir POJO sınıfı da Action, execute metodu olmak şartı ile, olarak kullanılabilir. |
| Threadin Modeli | Struts1 Action sınıfları Tekil(Singleton) sınıflardır. Bu yüzden, Thread-safe olmak dumundadırlar. Çünkü, sınıfın tek bir yaratımı sınıfa ulaşan bütün talepleri yönetir.
Tekil yaratım stratejisi, Struts1 i sınırlandıran bir özellik. Kod yazımı sırasında, sınıfı Thread-safe bırakabilmek için ekstra dikkat gerektiriyor. | Struts2'nin Thread-Safe olma gibi bir problemi yoktur. Her bir istemde, Actionsınıfları baştan yaratılır.
Servlet sunucusu her bir talep için bir çok obje yaratır. Bu yaratılan objeler bir performans problemi yaratmaz.
|
| Servlet Bağımlılıkları | Action sınıfları Servlet APIS'sine bağlıdırlar. Çünkü Her bir action Sınıfı metoduna HttpServletRequest ve HttpServletResponse objesi parametre olarak aktarılır.
| Servlet Sunucusu, Struts2 Action sınıfına ve Servlet sınıflarını ay kefeye koyup ikisine de aynı davranışı sergilemez.
Container does not treat the Struts 2 Actions as a couple. Servlet2 kontekst leri Struts2 Action sınıflarında basi Java Map'leri olarak yer bulurlar. Böylece Servlet Response ve Request objelerini hala ulaşılabilir durumda olurlar. Diğer yapısal sınıfların böyle bir ulaşım hakları mevcut değildir. |
| Test Edilebilirlik | Action sınıfları Servlet objelerine bağımlı olduğu için, Struts1 uygulamalarının test edilme aşamasında büyük problemleri vardır.
Struts1 TestCase Objesi bu problemi Mock objeleri ile çözer.
| Struts2 Action sınıflarını test edebilmek için onları yaratmanız, özelliklerini yüklemeniz ve metodları çalışıtmanız yeterlidir.
Bağımlılık enejksiyonu mekanizması test edilebilirliği daha da kolaylaştırır. |
| Girdi Verilerini Toplamak | Struts1 istemciden gelen girdileri ActionForm Objesi aracılığı alır. Action sınıfları gibi ActionForm sınıfı da bi ana sınıfı kalıtsal olarak alır. Diğer JavaBean objeleri ActionForm olarak kullanılamaz. Bu durum, geliştiricilerin girdi değerlerini almak için daha fazla sınıf yaratmalarına sebep olur. DynaBean ActionForm yerine kullanılabilecek iyi bir alternatiftir. | Struts2 Action yerel değişkenlerini girdi değeri olarak kullanır. Bu durum gereksiz ikinci bir sınıf yaratımını engeller.
Bu girdi değerleri, farklı girdi türlerinde olabilir.
Geliştiriciler Action sınıfı yerel değişkenlerine Web Sayfasından Struts Tagleri ile ulaşabilirler.
Struts2 ActionForm sistemini ve POJO Form objelerini de desteklemektedir. |
| Betik Dili | Struts1 JSTL ve JSTL-EL ile entegredir.
EL basit düzeyde obje graf gezimini destekler. Ama yığınlarda ve indeksli değişkenlerde zayıftır. | Struts2 JSTL'yi destekler ama ondan daha güçlü olan OGNL'yi de destekler. |
| Değerleri görünüş'e(View) bağlama | Struts1 objeleri standart JSP mekniazması ile Sayfa içeriğine bağlar. | Struts2 değişken değerlerini Tag'lere bağlarken View aşamasına geçmeden ValueStack mekanizmasını kullanarak değerleri tag'lere bağlar. Bu durum, View'leri tekrar kullanılabilir duruma getirir. |
| Tür Dönüşümü | Struts1 ActionForm değişkenlerinin neredeyse tamamı String türündedir. Tür Dönüşümü için Commons-Beanutils kullanılır. Dönüştürücüler her sınıf için farklıdırve her bir yaratım Için ayarlanabilir değildir. | Struts2 tür dönüşümü için OGNL ve Dönüştürücüler kullanır. Basit genel ve primitiv türler için dönüşümler yapabilir. |
| Doğrulama(Validation) | Struts1 doğrulama işlemini ActionForm sınıfındaki validate metodu ile yapar veya Commons Validator kullanır. Aynı sınıf doğrulaması için farklı doğrulama kontekstleri kullanır. Alt objeler için doğrulama mümkün deildir. | Struts2, doğrulama işlemi için validate metodunu veya Xwork Doğrulama altyapısını kullanabilir.
Xwork doğrulama altyapısı zindirleme bir şekilde obje ve alt objeler için doğrulama yapmanızz olanak sağlar. |
| Action çalıştırma Mekanizması | Struts1'de her modülün , istemcinin talebine istinaden ayrı bir hayat döngüsü vardır. Modül içindeki her Action sınıfı da ynı hayat döngüsünden geçmek zorundadır. | Struts2'de her bir Action sınıfı için interceptor Stack mekanizması aracılığı ile farklı hayat döngüleri yaratılabilir. |
Daha Derine!
Struts2'nin modern bir MVC uygulaması olduğunu belirtmiştik. Peki nedir MVC?
MVC, İş mantığı(Bussiness Logic,Model) ve prezentasyon tabakasını(Presentation Layer, View) birbirinden ayıran bir dizayn şablonudur. Tabi bu tabakalara bir de Yönlendirici(Controller) tabakasını eklemek gerekir.
MVC'nin (C)ontroller tabakası bir kavşakta duran Trafik Polisi gibidir. Nasıl Trafik Polisi gelen geçen arabaların hangi yöne gideceğine karar veriyorsa, Controller da istemciden gelen isteklerin hangi Action'a ulaşacağına karar verir. Aşağıdaki resim MVC'nin yukardan bakışını resmetmektedir.

MVC'nin en önemli özelliği İş Mantığı katmanı ile Prezentasyon Katmanını birbirinden tamamen ayırmasıdır. Struts2 altyapısına baktığınızda ilk fark edeceğiniz özellik budur.
Daha önce, Struts2'nin MVC yapısını uyguladığını söylemiştik. Bu demektir ki: Struts2 altyapısı da yukarda resmedilen MVC yapısına benzemelidir. Eğer aşağıda resmedilen Struts2 altyapısına baktığınızda, yukarıdaki MVC şemasına ne kadar benzediğini farketmeniz gerekir.

Yukarıdaki resim Struts2'nin çok çok çok basitleştirilmiş halidir. Resimde, internet gezgini bir istemde bulunduğunda, ilk olarak FilterDispatcher Objesi yaratılır. Bu objenin yaraılması ile MVC'nin C kısmı aktive olmuş olur. Bu obje, istenilen kaynağın yolunu bir Struts2 Action'ını ile eşleştirir.
Bahsi geçen Action objesi bir Java Objesidir. Bu Java Objesi çalışmaya başladığında MVC'nin M kısmı aktive olmuş olur. Model katmanında, istediğiniz şekilde Java kodu yazabilirsiniz. Ama en sonunda bu Obje String türünde bir Sonuç Değeri(Result Code) dönmek zorundadır. Dönüş değeri bir JSP sayfasına eşleştirilir. Dönüş değerini bir JSP sayfasına eşleştirme ile MVC'nin V kısmı aktive olmuş olur. JSP sayfası üretilemey başladığında Sunucu, istemciye bir sonuç dönüyor demektir. Bu sonuç HTML formatındadır. Yani View aşamasında JSP kodu HTML'ye dönüştürülür.
JSP'den HTML'ye dönüştürme işlemi JSP Betik Dili, JSTL, JSTL-EL, Struts2 tagleri ve/veya diğer genel amaçlı taglerle yapılır.
Güzel!!. Struts2 nin MVC şablonunu nasıl uyguladığını anladınız.
Şimdi aşağıdaki senaryoyu hayal edin:
Bir internet kullanıcısı, internet gezgini ile http://localhost:8080/TVQ/login.action adresine talepte bulunuyor. Bu sayfa TVQ Web Uygulamasının Giriş ekranı ve TVQ uygulaması bir Struts2 uygulaması. Talep sunucuya ulaştığında, Sunucu “TVQ” kelimesini bir Web uygulamasına eşleştirir. Bu eşleştirme sunucudan sunucuya değişir, bu sebeple burada bu seric anlatmak gereksiz. Web uygulaması eşleştikten sonra, sunucu ilk olarak TVQ web uygulamasının web.xml dosyasını okur .
| Herhangi bir J2EE Web uygulamasının standart bir dizin yapısı vardır. Bu yapı9 hakkında daha fazla bilgi edinmek için lütfen http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/WebComponents3.html adresine gidiniz. |
Şu ana kadar, Sunucu TVQ uygulamasının bir Struts2 uygulaması olduğunda haberdar değildir. Aşağıdaki metin web.xml dosyaından alınmıştır.
| <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <!-- Add the filter mapping after all filters --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
Sunucu web.xml dosyasını okuduktan sonra http://localhost:8080/TVQ/login.action adresini hangi sınıfa eşleştirceğini öğrenmiş olur.
Yukarıdaki web.xml içeriği, http://localhost:8080/TVQ adresinden sonraki herhangi bir yazımın(/*) “struts2” ile adlandırılmış filtre tarafından yönlendirilmesini işaret eder. “struts2” adlı filtre web.xml dosyasında tanımlanmış ve org.apache.struts2.dispatcher.FilterDispatcher filtre objesine eşleştirilmiştir. Bu şu anlama geliyor: http://localhost:8080/TVQ/login.action adresi talep edildiğinde,ilk olarak FilterDispatcher sınıfı yaratılacak ve çalıştırılacak.
Bu aşamadan sonra Struts2 sistemi devrededir. FilterDispatcher objesi struts.xml dosyasını okur ve “login.action” yazısının hangi action'a (Java Sınıfına) eşleştirileceiğini öğrenir. Sonra, FilterDispatcher objesi, talep edilen java sınıfı yaratır. Bu, Login objesinin yaratılması ve çalıştırılması demek oluyor. Login objesinin çalışması sonucunda bir Dönüş kodu dönülür. Bu dönüş kodu bir JSP sayfasına eşleşmek durumundadır. Bu eşleştirme struts.xml dosyasında Action tanımlama kısmında mevcuttur. JSP sayfası eşleştikten sonra, JSP HTML'ye dönüştürülür ve istemciye cevap(response) olarak gönderilir.
-halil agin.
Tags: struts2 altyapı