Takip et

Struts2 Nedir? Neden Kullanılır?

Struts2 Nedir? Neden Kullanılır? Struts2, Apache Yazılım Vakfı tarafından geliştirilen, Java tabanlı bir web uygulama çatısı (framework)

Struts2 Nedir? Neden Kullanılır?

Struts2, Apache Yazılım Vakfı tarafından geliştirilen, Java tabanlı bir web uygulama çatısı (framework) olup, Model-View-Controller (MVC) tasarım desenini temel alır. Özellikle büyük ve karmaşık kurumsal uygulamaların geliştirilmesinde, iş mantığını sunum katmanından ayırarak kodun daha düzenli, sürdürülebilir ve test edilebilir olmasını sağlar.

Struts2’nin Temel Avantajları:

  • MVC Mimarisi: İş mantığı (Model), görünüm (View) ve kontrolcü (Controller) arasında net bir ayrım sağlar.
  • POJO Tabanlı Action’lar: Struts1’in aksine, Action sınıflarının belirli bir arayüzü uygulamasına veya bir temel sınıftan miras almasına gerek yoktur. Bu, daha esnek ve test edilebilir kod yazımına olanak tanır.
  • Interceptor Mimarisi: İstek işleme yaşam döngüsüne müdahale etmek için güçlü bir mekanizma sunar. Kimlik doğrulama, yetkilendirme, loglama, dosya yükleme, doğrulama gibi ortak görevleri Action’lardan ayırarak kod tekrarını azaltır.
  • Value Stack ve OGNL: Verilerin Action’lar ve View’ler arasında kolayca aktarılmasını sağlayan güçlü bir mekanizmadır. OGNL (Object-Graph Navigation Language) ile Value Stack üzerindeki verilere kolayca erişilir.
  • Plugin Desteği: JSON, REST, Spring entegrasyonu gibi birçok ek özellik plugin’ler aracılığıyla kolayca eklenebilir.
  • Form Doğrulama: Hem XML tabanlı hem de programatik olarak güçlü ve esnek form doğrulama mekanizmaları sunar.

Struts2’nin Temel Bileşenleri ve Çalışma Prensibi

Struts2’nin mimarisi, bir dizi bileşenin uyumlu çalışmasına dayanır. Bu bileşenleri anlamak, framework’ün nasıl çalıştığını kavramanın anahtarıdır.

1. Action

Struts2’deki Action’lar, kullanıcı isteklerini işleyen ve iş mantığını içeren POJO (Plain Old Java Object) sınıflarıdır. Genellikle, isteği işleyen ve bir sonuç kodu (örn. “success”, “error”, “input”) döndüren bir execute() metodu içerirler. Bu sonuç kodu, hangi görünümün gösterileceğine karar verir.

Örnek Action Sınıfı:


package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

public class MerhabaAction extends ActionSupport {

    private String kullaniciAdi; // Formdan gelecek veri

    public String getKullaniciAdi() {
        return kullaniciAdi;
    }

    public void setKullaniciAdi(String kullaniciAdi) {
        this.kullaniciAdi = kullaniciAdi;
    }

    @Override
    public String execute() throws Exception {
        if (kullaniciAdi != null && !kullaniciAdi.isEmpty()) {
            // İş mantığı burada yürütülebilir
            addActionMessage("Merhaba, " + kullaniciAdi + "!");
            return SUCCESS; // Başarılı sonuç
        }
        addActionError("Kullanıcı adı boş bırakılamaz.");
        return INPUT; // Formu tekrar göster
    }
}

2. Interceptor (Araya Girici)

Interceptor’lar, bir Action çağrılmadan önce veya çağrıldıktan sonra belirli görevleri yerine getiren nesnelerdir. Zincirleme bir yapıya sahiptirler ve her istek için bir dizi Interceptor sırayla çalışır. Bu yapı, Action’ları tekrar eden veya çapraz kesen endişelerden (cross-cutting concerns) arındırmaya yardımcı olur.

  • Örnek Interceptor’lar: workflow (Action’ın validate() metodunu çalıştırır), validation (XML tabanlı doğrulamayı yapar), params (HTTP parametrelerini Action özelliklerine eşler), fileUpload (dosya yükleme işlemini yönetir).

struts.xml’de Interceptor Tanımı:



    
         
           
             
        /WEB-INF/jsp/basarili.jsp
        /WEB-INF/jsp/kayitFormu.jsp
    

3. Result (Sonuç)

Bir Action’ın execute() metodu tarafından döndürülen String değeri, hangi Result’ın çalıştırılacağını belirler. Result’lar, Action’ın işi bittikten sonra kullanıcıya hangi kaynağın (genellikle bir JSP sayfası, başka bir Action veya bir yönlendirme) gösterileceğini tanımlar.

  • Yaygın Result Tipleri: dispatcher (JSP veya HTML sayfasına yönlendirir), redirect (istemci tarafında yeni bir URL’ye yönlendirme yapar), chain (başka bir Action’ı çağırır), stream (dosya indirme için), json (JSON verisi döndürmek için).

4. Value Stack ve OGNL (Object-Graph Navigation Language)

Value Stack: Her HTTP isteği için oluşturulan, Action nesnesi ve diğer ilgili nesneleri (örneğin ModelDriven arayüzünü uygulayan nesneler) içeren geçici bir veri yapısıdır. View katmanında (JSP) Action özelliklerine erişmek için kullanılır.

OGNL: Value Stack üzerindeki verilere erişmek, manipüle etmek ve ifade değerlendirmesi yapmak için kullanılan güçlü bir ifade dilidir. Struts2 etiketleri (, vb.) OGNL kullanarak Value Stack’ten veri çeker.

Örnek OGNL Kullanımı (JSP içinde):



Merhaba, !

Kullanıcı Adı:

Ürün Adı: , Fiyat:

Struts2 Konfigürasyonu ve İstek Yaşam Döngüsü

Struts2’nin çalışması, web.xml ve struts.xml dosyalarındaki konfigürasyonlara bağlıdır. İstek yaşam döngüsü, bir talebin gelmesinden yanıtın dönmesine kadar geçen süreci açıklar.

1. web.xml Konfigürasyonu

Her Struts2 uygulamasının web.xml dosyasında StrutsPrepareAndExecuteFilter filtresi tanımlanmalıdır. Bu filtre, tüm gelen istekleri yakalar ve Struts2 framework’üne yönlendirir.

Örnek web.xml:



    
        struts2
        org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
    
    
        struts2
        /*
    
    ...

2. struts.xml Konfigürasyonu

struts.xml, Struts2 uygulamasının ana konfigürasyon dosyasıdır. Action’lar, Result’lar, Interceptor’lar ve paketler burada tanımlanır.

  • Package: Benzer Action’ları ve Result’ları gruplamak için kullanılır. extends="struts-default" ifadesi, Struts2’nin sağladığı varsayılan Interceptor’lar ve Result tiplerini miras almayı sağlar.
  • Namespace: Action’ları mantıksal olarak ayırmak için kullanılır (örn. /admin, /user).
  • Action Mapping: Bir URL’yi bir Action sınıfına eşler ve o Action için hangi Result’ların hangi görünümlere gideceğini tanımlar.

Örnek struts.xml:






    
        
            /WEB-INF/jsp/merhaba.jsp
            /WEB-INF/jsp/merhabaFormu.jsp
        
    

    
        
            /WEB-INF/jsp/admin/kullaniciListesi.jsp
        
    

3. Struts2 İstek Yaşam Döngüsü:

  1. İstek Gelmesi: Kullanıcı bir web isteği gönderir (örn. http://localhost:8080/app/merhaba.action).
  2. Filtre Tarafından Yakalanma: web.xml‘de tanımlanan StrutsPrepareAndExecuteFilter, isteği yakalar.
  3. Action Mapping Bulma: Filter, struts.xml‘e bakarak gelen URL’ye karşılık gelen Action mapping’ini bulur.
  4. Interceptor Zincirinin Çalıştırılması (Ön İşleme): Tanımlanmış Interceptor’lar sırayla çalışır (örn. parametreleri Action özelliklerine eşleme, doğrulama, kimlik doğrulama).
  5. Action Metodunun Çağrılması: Action sınıfının ilgili metodu (genellikle execute()) çağrılır.
  6. Interceptor Zincirinin Çalıştırılması (Son İşleme): Action metodu döndükten sonra Interceptor’lar ters sırada tekrar çalışır (örn. loglama, kaynak temizleme).
  7. Result’ın Çalıştırılması: Action metodundan dönen String değerine karşılık gelen Result tanımlanır ve çalıştırılır (örn. bir JSP sayfasına yönlendirme).
  8. Yanıt Gönderme: Sonuç olarak oluşturulan web sayfası veya veri kullanıcıya geri gönderilir.

Pratik Konular ve İleri Seviye Özellikler

1. Form Doğrulama (Validation)

Struts2, form verilerini doğrulamak için güçlü mekanizmalar sunar. Hem XML tabanlı hem de programatik doğrulama yöntemleri mevcuttur.

  • XML Tabanlı Doğrulama: Action sınıfının bulunduğu pakette ActionClassName-validation.xml adında bir dosya oluşturularak yapılır. En yaygın ve basit doğrulama yöntemidir.
  • Programatik Doğrulama: Action sınıfında validate() metodunu override ederek veya ValidationAware arayüzünü uygulayarak yapılır. Daha karmaşık iş mantığı gerektiren doğrulamalar için idealdir.

Örnek XML Tabanlı Doğrulama (MerhabaAction-validation.xml):




    
        
            Kullanıcı adı boş bırakılamaz.
        
        
            3
            20
            Kullanıcı adı 3 ile 20 karakter arasında olmalıdır.
        
    

2. Uluslararasılaşma (Internationalization – I18N)

Struts2, farklı dillerde içerik sunmak için kapsamlı bir I18N desteği sağlar. Resource bundle’lar (.properties dosyaları) kullanarak metinleri yönetir.

  • Kullanım: ApplicationResources.properties (varsayılan), ApplicationResources_tr.properties (Türkçe), ApplicationResources_en.properties (İngilizce) gibi dosyalar oluşturulur. JSP’lerde veya Action’larda getText("anahtar") ile metinlere erişilir.

3. Dosya Yükleme (File Upload)

Struts2, fileUpload interceptor’ı sayesinde dosya yükleme işlemlerini kolaylaştırır. Formda enctype="multipart/form-data" ayarının yapılması ve Action sınıfında File tipi özellikler tanımlanması gerekir.

Örnek Action’da Dosya Yükleme Özellikleri:


public class DosyaYukleAction extends ActionSupport {
    private File yuklenenDosya;
    private String yuklenenDosyaContentType;
    private String yuklenenDosyaFileName;

    // Getter ve Setter metotları
    // ...

    public String execute() {
        // Dosya işleme mantığı
        if (yuklenenDosya != null) {
            System.out.println("Dosya Adı: " + yuklenenDosyaFileName);
            System.out.println("Dosya Tipi: " + yuklenenDosyaContentType);
            System.out.println("Dosya Boyutu: " + yuklenenDosya.length());
            // Dosyayı sunucuya kaydetme vb. işlemler
            return SUCCESS;
        }
        return INPUT;
    }
}

4. Struts2 Plugin’leri

Struts2’nin modüler yapısı sayesinde, birçok ek özellik plugin’ler aracılığıyla sisteme entegre edilebilir. En popüler plugin’lerden bazıları:

  • Struts2 JSON Plugin: Action’lardan kolayca JSON yanıtları döndürmeyi sağlar.
  • Struts2 REST Plugin: RESTful web servisleri geliştirmeyi kolaylaştırır.
  • Struts2 Spring Plugin: Spring framework ile entegrasyonu sağlar, Action’ların Spring bean’leri olarak yönetilmesine olanak tanır.

Sonuç ve Sıkça Sorulan Sorular (SSS)

Struts2, Java tabanlı web uygulamaları geliştirmek için güçlü ve olgun bir MVC framework’üdür. Özellikle Interceptor mimarisi, Value Stack ve OGNL gibi özellikleri, geliştiricilere esneklik ve kontrol sağlar. Günümüzde yeni projelerde Spring MVC, Spring Boot gibi daha modern framework’ler tercih edilse de, Struts2 hala birçok mevcut kurumsal uygulamada kullanılmaktadır ve bu nedenle hakkında bilgi sahibi olmak önemlidir.

Sıkça Sorulan Struts2 Mülakat Soruları:

İşte Struts2 mülakatlarında sıkça karşılaşılan sorular ve kısa yanıtları:

1. Struts2 ve Struts1 arasındaki temel farklar nelerdir?

  • Action Sınıfları: Struts1’de Action sınıfından miras alma zorunluluğu varken, Struts2’de POJO Action’lar kullanılır.
  • Interceptor’lar: Struts2’de Interceptor mimarisi vardır, Struts1’de ise Request Processor kullanılırdı.
  • Value Stack/OGNL: Struts2’de Value Stack ve OGNL, veri akışını kolaylaştırırken, Struts1’de ActionForm ve Request nesnesi kullanılırdı.
  • View Katmanı: Struts2’de daha esnek view teknolojisi entegrasyonu varken, Struts1’de genellikle JSP’ler ve Struts Tag Library kullanılırdı.

2. Value Stack nedir ve neden önemlidir?

Value Stack, her istek için oluşturulan, Action nesnesi ve diğer ilgili nesneleri içeren geçici bir veri yapısıdır. View katmanında (JSP) OGNL kullanarak bu yığın üzerindeki verilere kolayca erişilmesini sağlar. Struts2’deki veri akışının temelini oluşturur.

3. Interceptor’ların rolü nedir? Bir örnek verin.

Interceptor’lar, bir Action çağrılmadan önce veya çağrıldıktan sonra belirli görevleri yerine getiren bileşenlerdir. Action’ları tekrar eden görevlerden (doğrulama, loglama, güvenlik) arındırarak kod tekrarını azaltır ve modülerliği artırır. Örneğin, validation interceptor’ı, bir Action’ın iş mantığına girmeden önce form verilerini doğrular.

4. Struts2’de form verilerini Action’a nasıl aktarırsınız?

HTTP parametreleri, Action sınıfındaki uygun adlandırılmış özelliklere otomatik olarak eşlenir. Bu işlem params interceptor’ı tarafından yapılır. Örneğin, bir formda varsa, Action sınıfında private String kullaniciAdi; ve buna karşılık gelen getter/setter metotları olmalıdır.

5. Struts2’de package ve namespace kavramları ne işe yarar?

  • Package: Benzer Action’ları, Interceptor’ları ve Result’ları gruplamak için kullanılır. Konfigürasyonu düzenli tutmaya yardımcı olur.
  • Namespace: Action’ları mantıksal olarak ayırmak ve URL çakışmalarını önlemek için kullanılır. Örneğin, /admin namespace’i altındaki Action’lar sadece /admin/ ile başlayan URL’ler aracılığıyla erişilebilir.

6. Struts2’de devMode ne anlama gelir?

struts.properties dosyasında struts.devMode = true olarak ayarlandığında, Struts2 geliştirme moduna geçer. Bu modda, konfigürasyon değişiklikleri (örn. struts.xml‘de yapılanlar) otomatik olarak yeniden yüklenir, daha detaylı hata mesajları görüntülenir ve bazı performans optimizasyonları devre dışı bırakılır. Üretim ortamında false olarak ayarlanmalıdır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.