1. Giriş
Belgenin PDF dosyası, |BURADA| adresinde mevcuttur.
Belgedeki örnekler |BURADA| adresinde mevcuttur.
Burada, örnekler yardımıyla Struts 2'nin önemli kavramlarını tanıtmayı amaçlıyoruz. Struts 2, aşağıdakileri sağlayan bir web çerçevesidir:
- JAR dosyaları biçiminde bir dizi kütüphane
- bir geliştirme çerçevesi: Struts 2, bir web uygulamasının geliştirilme şeklini etkiler.
Örnekleri anlamak için gerekli ön koşullar şunlardır:
- Java diline ilişkin temel bilgiler
- web geliştirme konusunda temel bilgiler, özellikle HTML dili.
[http://developpez.com] sitesinde bu önkoşullar için gerekli tüm kaynaklar bulunabilir. Bunlardan bazılarını ben yazdım; bunları [https://stahe.github.io] sitesinde bulabilirsiniz.
Struts 2 hakkında daha ayrıntılı bilgi edinmek için aşağıdaki kaynaklara başvurabilirsiniz:
- [ref1]: Struts web sitesinde bulunan Struts 2 belgeleri
- [ref2]: Donald Brown, Chad Michael Davis ve Scott Stanlick tarafından yazılan ve Manning yayınevi tarafından basılan "Struts 2 in Action" kitabı. Bu kitap özellikle öğretici niteliktedir.
Bazen okuyucuya bu kitapla bir konuyu daha derinlemesine inceleyebileceğini belirtmek için [ref2]'e atıfta bulunacağız.
Bu belge, elinizde bir bilgisayar olmadan da okunabilecek şekilde yazılmıştır. Bu nedenle, çok sayıda ekran görüntüsü yer almaktadır.
1.1. Bir web uygulamasında Struts 2’nin yeri
Öncelikle, Struts 2’nin bir web uygulaması geliştirme sürecindeki yerini belirleyelim. Çoğu zaman, bu uygulama aşağıdaki gibi çok katmanlı bir mimari üzerine inşa edilir:
![]() |
- [web] katmanı, web uygulamasının kullanıcısıyla temas halinde olan katmandır. Kullanıcı, bir tarayıcı aracılığıyla görüntülenen web sayfaları vasıtasıyla web uygulamasıyla etkileşime girer. Struts 2, bu katmanda yer alır ve yalnızca bu katmanda bulunur.
- [metier] katmanı, maaş veya fatura hesaplaması gibi uygulama yönetim kurallarını uygular. Bu katman, [web] katmanı aracılığıyla kullanıcıdan gelen verileri ve [dao] katmanı aracılığıyla veritabanı yönetim sisteminden (DBMS) gelen verileri kullanır.
- [dao] katmanı (Veri Erişim Nesneleri), [jpa] katmanı (Java Persistence API) ve JDBC sürücüsü, veritabanı sistemindeki verilere erişimi yönetir. [jpa] katmanı, ORM (Nesne-İlişkisel Eşleştirici) görevi görür. Bu katman, [dao] katmanı tarafından işlenen nesneler ile ilişkisel bir veritabanındaki verilerin satırları ve sütunları arasında bir köprü görevi görür.
- Katmanların entegrasyonu, bir Spring veya EJB3 (Enterprise Java Bean) konteyneri aracılığıyla gerçekleştirilebilir.
Aşağıda verilen örneklerin çoğunda, yalnızca tek bir katman, yani [web] katmanı kullanılacaktır:
![]() |
Ancak bu belge, çok katmanlı bir web uygulamasının oluşturulmasıyla sona erecektir:
![]() |
[metier], [dao] ve [jpa/hibernate] katmanlarının tümü bize bir jar arşivi şeklinde sağlanacaktır; böylece yine sadece [web] katmanını oluşturmamız gerekecektir.
1.2. Struts 2’nin MVC geliştirme modeli
Struts 2, MVC olarak bilinen mimari modelini (Model – Görünüm – Denetleyici) şu şekilde uygular:
![]() |
Bir istemciden gelen isteğin işlenmesi şu şekilde gerçekleşir:
İstenen URL'ler şu biçimdedir: http://machine:port/contexte/rep1/rep2/.../Action. [/rep1/rep2/.../Action] yolu, bir Struts 2 yapılandırma dosyasında tanımlanmış bir eyleme karşılık gelmelidir; aksi takdirde reddedilir. Bir eylem, bir XML dosyasında şu biçimde tanımlanır:
Önceki örnekte, URL [ http://machine:port/contexte/actions/Action1]'in talep edildiğini varsayalım. Bu durumda aşağıdaki adımlar gerçekleştirilir:
-
istek - tarayıcı istemcisi, [FilterDispatcher] denetleyicisine bir istek gönderir. Bu denetleyici, istemcilerden gelen tüm istekleri alır. Burası, uygulamanın giriş kapısıdır. MVC'teki "C" harfi budur.
-
İşleme
- C denetleyicisi, yapılandırma dosyasını inceler ve actions/Action1 eyleminin mevcut olduğunu tespit eder. namespace (1. satır), eylem adıyla (2. satırdaki name özniteliği) birleştirilerek actions/Action1 eylemini tanımlar.
- C denetleyicisi, [2a]'i, [actions.Action1] türünde bir sınıf olarak örneklendirir (2. satırdaki class özniteliği). Bu sınıfın adı ve paketi herhangi bir şey olabilir.
- Eğer istenen URL, [param1=val1¶m2=val2&...] türünde parametrelerle birlikte verilirse, C denetleyicisi bu parametreleri [actions.Action1] sınıfına şu şekilde atar:
Bu nedenle, [actions.Action1] sınıfının, beklenen her bir parami parametresi için setParami yöntemlerine sahip olması gerekir.
- (devam)
- C denetleyicisi, [actions.Action1] sınıfının [String execute()] imza yönteminin çalıştırılmasını ister. Bu yöntem, sınıfın aldığı parami parametrelerini kullanabilir. Kullanıcı isteğinin işlenmesi sırasında, [metier] ve [2b] katmanlarına ihtiyaç duyabilir. Müşterinin isteği işlendikten sonra, bu yöntem çeşitli yanıtları çağırabilir. Klasik bir örnek şudur:
- istek düzgün bir şekilde işlenemediğinde bir hata sayfası
- aksi takdirde bir onay sayfası
- C denetleyicisi, [actions.Action1] sınıfının [String execute()] imza yönteminin çalıştırılmasını ister. Bu yöntem, sınıfın aldığı parami parametrelerini kullanabilir. Kullanıcı isteğinin işlenmesi sırasında, [metier] ve [2b] katmanlarına ihtiyaç duyabilir. Müşterinin isteği işlendikten sonra, bu yöntem çeşitli yanıtları çağırabilir. Klasik bir örnek şudur:
execute yöntemi, C denetleyicisine "navigasyon anahtarı" adı verilen bir karakter dizisi türünde bir sonuç döndürür. Yukarıdaki örnekte, [actions.Action1].execute, "page1" (satır 3) ve "page2" (satır 4) olmak üzere iki navigasyon anahtarı üretebilir. [actions.Action1] yöntemi.execute yöntemi ayrıca, kullanıcıya yanıt olarak gönderilecek olan JSP sayfasının kullanacağı M şablonu [2c]'i de güncelleyecektir. Bu şablon şu öğeleri içerebilir:
- (devamı)
- [actions.Action1] sınıfından oluşturulan
- kullanıcının oturumu
- Uygulama kapsamındaki veriler
- …
- yanıt - C denetleyicisi, gezinme anahtarına karşılık gelen JSP sayfasının görüntülenmesini ister [3]. Bu, MVC'in görünümü, yani V'sidir. JSP sayfası, müşteriye göndermesi gereken yanıtın dinamik kısımlarını başlatmak için bir M şablonu kullanır.
Şimdi, MVC web mimarisi ile katmanlı mimari arasındaki bağlantıyı açıklayalım. Aslında bunlar, bazen birbiriyle karıştırılan iki farklı kavramdır. Tek katmanlı bir Struts 2 web uygulamasını ele alalım:
![]() |
[web] katmanını Struts 2 ile uygularsak, bir MVC web mimarisine sahip oluruz, ancak çok katmanlı bir mimariye sahip olmayız. Burada, [web] katmanı her şeyi üstlenecektir: sunum, iş mantığı, veri erişimi. Struts 2 ile bu işi [Action] türündeki sınıflar yapacaktır.
Şimdi, çok katmanlı bir web mimarisini ele alalım:
![]() |
[web] katmanı, herhangi bir çerçeve kullanmadan ve MVC modelini takip etmeden uygulanabilir. Bu durumda gerçekten çok katmanlı bir mimariye sahibiz, ancak web katmanı MVC modelini uygulamamaktadır.
MVC'te, M modelinin V görünümüne ait olduğunu, yani c.a.d'te V görünümü tarafından görüntülenen veri kümesini ifade ettiğini belirtmiştik. Bazen (çoğu zaman), MVC'teki M modeli için başka bir tanım verilir:
![]() |
Birçok yazar, [web] katmanının sağındaki kısmın, MVC modelinin M modelini oluşturduğunu düşünür. Belirsizlikleri önlemek için şunlardan söz edilebilir:
- [présentation] katmanının sağındaki her şeyi ifade ederken alan modelinden
- bir V görünümü tarafından görüntülenen verileri ifade ederken "görünüm modeli"
Bundan sonra, "M modeli" terimi yalnızca bir V görünümünün modelini ifade edecektir.
1.3. Kullanılan araçlar
Bundan sonra (Aralık 2011 itibarıyla) şunları kullanıyoruz:
- IDE NetBeans 7.01, URL ve [http://www.netbeans.org] adreslerinde mevcuttur
- NetBeans 7.01 için Struts 2 eklentisi şu adreste mevcuttur: URL [http://plugins.netbeans.org/plugin/39218]
- Struts 2'nin 2.2.3 sürümü şu adresten indirilebilir: URL [http://struts.apache.org/]
Aşağıdaki örnekleri geliştirmek için yalnızca URL ve [http://struts.apache.org/] adreslerinden indirilen Struts 2 kütüphaneleri gereklidir. NetBeans, başka bir IDE (Eclipse, JDeveloper, IntelliJ, ...) ile değiştirilebilir ve Struts 2 eklentisi yalnızca geliştiricinin işini kolaylaştırmak için vardır. Bu eklenti de zorunlu değildir.
1.3.1. IDE NetBeans
NetBeans indirme sayfasında, Java sürümünü seçiyoruz:

1.3.2. Struts 2 Eklentisi
NetBeans sürümlerine bağlı olarak, bu eklenti her zaman mevcut olmamıştır. Aralık 2011'de, URL ve [http://plugins.netbeans.org] adreslerinde bulunabilir. Bu URL, NetBeans için mevcut olan çeşitli eklentileri öğrenmemizi sağlar. Aradığımızı filtreleyebiliriz. [1]'te, adlarında "struts" kelimesini içeren eklentileri sorgulayabiliriz.
![]() |
- [2] bağlantısını takip ediyoruz
![]() |
Eklentiyi indirip [2] dosyasını açıyoruz. Bunu NetBeans'e entegre etmek için şu adımları uygulayabiliriz:
- NetBeans'i başlatın
![]() |
- [1]'te, Tools/Plugins menüsünü seçin
- [2] sekmesinde, [3] düğmesini kullanın
- [4] sekmesinde, indirilen eklentilerin .nbm dosyalarını seçin. Burada, Struts 2.0.14 sürümündeki kütüphaneler yerine Struts 2.2.3 sürümündeki kütüphaneleri seçiyoruz
- [2] sekmesine geri dönüp, [5] düğmesiyle seçilen eklentileri kuruyoruz.
Eklentilerin kurulumu genellikle NetBeans'in yeniden başlatılmasını gerektirir.
1.3.3. Struts 2 kütüphaneleri
NetBeans için Struts 2 eklentisini indirdiyseniz, Struts'un ana kütüphanelerine sahip olursunuz, ancak hepsine sahip olmazsınız. İlerleyen bölümlerde, Struts 2 web sitesinde bulunan bazı kütüphanelere ihtiyacımız olacak [http://struts.apache.org/].
![]() |
[1] bağlantısını ve ardından [2] bağlantısını takip ederek 2.2.3.1 sürümünün zip dosyasını indiriyoruz. Dağıtım paketi açıldıktan sonra, Struts için gerekli kütüphaneler dağıtım paketindeki [lib] ve [3] klasörlerinde bulunur. Bunların sayısı onlarca olduğundan, hangilerinin zorunlu olduğu sorusu ortaya çıkar. İşte bu noktada Struts eklentisi bize yardımcı olacaktır.










