{"id":38554,"date":"2026-02-02T18:41:40","date_gmt":"2026-02-02T15:41:40","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38554"},"modified":"2026-02-02T18:41:40","modified_gmt":"2026-02-02T15:41:40","slug":"struts2-nedir-neden-kullanilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/","title":{"rendered":"Struts2 Nedir? Neden Kullan\u0131l\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<h2>Struts2 Nedir? Neden Kullan\u0131l\u0131r?<\/h2>\n<p>Struts2, Apache Yaz\u0131l\u0131m Vakf\u0131 taraf\u0131ndan geli\u015ftirilen, Java tabanl\u0131 bir web uygulama \u00e7at\u0131s\u0131 (framework) olup, Model-View-Controller (MVC) tasar\u0131m desenini temel al\u0131r. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k kurumsal uygulamalar\u0131n geli\u015ftirilmesinde, i\u015f mant\u0131\u011f\u0131n\u0131 sunum katman\u0131ndan ay\u0131rarak kodun daha d\u00fczenli, s\u00fcrd\u00fcr\u00fclebilir ve test edilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Struts2&#8217;nin Temel Avantajlar\u0131:<\/h3>\n<ul>\n<li><b>MVC Mimarisi:<\/b> \u0130\u015f mant\u0131\u011f\u0131 (Model), g\u00f6r\u00fcn\u00fcm (View) ve kontrolc\u00fc (Controller) aras\u0131nda net bir ayr\u0131m sa\u011flar.<\/li>\n<li><b>POJO Tabanl\u0131 Action&#8217;lar:<\/b> Struts1&#8217;in aksine, Action s\u0131n\u0131flar\u0131n\u0131n belirli bir aray\u00fcz\u00fc uygulamas\u0131na veya bir temel s\u0131n\u0131ftan miras almas\u0131na gerek yoktur. Bu, daha esnek ve test edilebilir kod yaz\u0131m\u0131na olanak tan\u0131r.<\/li>\n<li><b>Interceptor Mimarisi:<\/b> \u0130stek i\u015fleme ya\u015fam d\u00f6ng\u00fcs\u00fcne m\u00fcdahale etmek i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizma sunar. Kimlik do\u011frulama, yetkilendirme, loglama, dosya y\u00fckleme, do\u011frulama gibi ortak g\u00f6revleri Action&#8217;lardan ay\u0131rarak kod tekrar\u0131n\u0131 azalt\u0131r.<\/li>\n<li><b>Value Stack ve OGNL:<\/b> Verilerin Action&#8217;lar ve View&#8217;ler aras\u0131nda kolayca aktar\u0131lmas\u0131n\u0131 sa\u011flayan g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r. OGNL (Object-Graph Navigation Language) ile Value Stack \u00fczerindeki verilere kolayca eri\u015filir.<\/li>\n<li><b>Plugin Deste\u011fi:<\/b> JSON, REST, Spring entegrasyonu gibi bir\u00e7ok ek \u00f6zellik plugin&#8217;ler arac\u0131l\u0131\u011f\u0131yla kolayca eklenebilir.<\/li>\n<li><b>Form Do\u011frulama:<\/b> Hem XML tabanl\u0131 hem de programatik olarak g\u00fc\u00e7l\u00fc ve esnek form do\u011frulama mekanizmalar\u0131 sunar.<\/li>\n<\/ul>\n<h2>Struts2&#8217;nin Temel Bile\u015fenleri ve \u00c7al\u0131\u015fma Prensibi<\/h2>\n<p>Struts2&#8217;nin mimarisi, bir dizi bile\u015fenin uyumlu \u00e7al\u0131\u015fmas\u0131na dayan\u0131r. Bu bile\u015fenleri anlamak, framework&#8217;\u00fcn nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kavraman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>1. Action<\/h3>\n<p>Struts2&#8217;deki Action&#8217;lar, kullan\u0131c\u0131 isteklerini i\u015fleyen ve i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7eren POJO (Plain Old Java Object) s\u0131n\u0131flar\u0131d\u0131r. Genellikle, iste\u011fi i\u015fleyen ve bir sonu\u00e7 kodu (\u00f6rn. &#8220;success&#8221;, &#8220;error&#8221;, &#8220;input&#8221;) d\u00f6nd\u00fcren bir <code>execute()<\/code> metodu i\u00e7erirler. Bu sonu\u00e7 kodu, hangi g\u00f6r\u00fcn\u00fcm\u00fcn g\u00f6sterilece\u011fine karar verir.<\/p>\n<h4>\u00d6rnek Action S\u0131n\u0131f\u0131:<\/h4>\n<pre><code class=\"language-java\">\npackage com.example.actions;\n\nimport com.opensymphony.xwork2.ActionSupport;\n\npublic class MerhabaAction extends ActionSupport {\n\n    private String kullaniciAdi; \/\/ Formdan gelecek veri\n\n    public String getKullaniciAdi() {\n        return kullaniciAdi;\n    }\n\n    public void setKullaniciAdi(String kullaniciAdi) {\n        this.kullaniciAdi = kullaniciAdi;\n    }\n\n    @Override\n    public String execute() throws Exception {\n        if (kullaniciAdi != null && !kullaniciAdi.isEmpty()) {\n            \/\/ \u0130\u015f mant\u0131\u011f\u0131 burada y\u00fcr\u00fct\u00fclebilir\n            addActionMessage(\"Merhaba, \" + kullaniciAdi + \"!\");\n            return SUCCESS; \/\/ Ba\u015far\u0131l\u0131 sonu\u00e7\n        }\n        addActionError(\"Kullan\u0131c\u0131 ad\u0131 bo\u015f b\u0131rak\u0131lamaz.\");\n        return INPUT; \/\/ Formu tekrar g\u00f6ster\n    }\n}\n<\/code><\/pre>\n<h3>2. Interceptor (Araya Girici)<\/h3>\n<p>Interceptor&#8217;lar, bir Action \u00e7a\u011fr\u0131lmadan \u00f6nce veya \u00e7a\u011fr\u0131ld\u0131ktan sonra belirli g\u00f6revleri yerine getiren nesnelerdir. Zincirleme bir yap\u0131ya sahiptirler ve her istek i\u00e7in bir dizi Interceptor s\u0131rayla \u00e7al\u0131\u015f\u0131r. Bu yap\u0131, Action&#8217;lar\u0131 tekrar eden veya \u00e7apraz kesen endi\u015felerden (cross-cutting concerns) ar\u0131nd\u0131rmaya yard\u0131mc\u0131 olur.<\/p>\n<ul>\n<li><b>\u00d6rnek Interceptor&#8217;lar:<\/b> <code>workflow<\/code> (Action&#8217;\u0131n <code>validate()<\/code> metodunu \u00e7al\u0131\u015ft\u0131r\u0131r), <code>validation<\/code> (XML tabanl\u0131 do\u011frulamay\u0131 yapar), <code>params<\/code> (HTTP parametrelerini Action \u00f6zelliklerine e\u015fler), <code>fileUpload<\/code> (dosya y\u00fckleme i\u015flemini y\u00f6netir).<\/li>\n<\/ul>\n<h4>struts.xml&#8217;de Interceptor Tan\u0131m\u0131:<\/h4>\n<pre><code class=\"language-xml\">\n<package name=\"default\" namespace=\"\/\" extends=\"struts-default\">\n    <action name=\"kaydet\" class=\"com.example.actions.KayitAction\">\n        <interceptor-ref name=\"defaultStack\"\/> <!-- Varsay\u0131lan interceptor y\u0131\u011f\u0131n\u0131 -->\n        <interceptor-ref name=\"validation\"\/>   <!-- Do\u011frulama interceptor'\u0131 -->\n        <interceptor-ref name=\"workflow\"\/>     <!-- validate() metodunu \u00e7al\u0131\u015ft\u0131r\u0131r -->\n        <result name=\"success\">\/WEB-INF\/jsp\/basarili.jsp<\/result>\n        <result name=\"input\">\/WEB-INF\/jsp\/kayitFormu.jsp<\/result>\n    <\/action>\n<\/package>\n<\/code><\/pre>\n<h3>3. Result (Sonu\u00e7)<\/h3>\n<p>Bir Action&#8217;\u0131n <code>execute()<\/code> metodu taraf\u0131ndan d\u00f6nd\u00fcr\u00fclen String de\u011feri, hangi Result&#8217;\u0131n \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 belirler. Result&#8217;lar, Action&#8217;\u0131n i\u015fi bittikten sonra kullan\u0131c\u0131ya hangi kayna\u011f\u0131n (genellikle bir JSP sayfas\u0131, ba\u015fka bir Action veya bir y\u00f6nlendirme) g\u00f6sterilece\u011fini tan\u0131mlar.<\/p>\n<ul>\n<li><b>Yayg\u0131n Result Tipleri:<\/b> <code>dispatcher<\/code> (JSP veya HTML sayfas\u0131na y\u00f6nlendirir), <code>redirect<\/code> (istemci taraf\u0131nda yeni bir URL&#8217;ye y\u00f6nlendirme yapar), <code>chain<\/code> (ba\u015fka bir Action&#8217;\u0131 \u00e7a\u011f\u0131r\u0131r), <code>stream<\/code> (dosya indirme i\u00e7in), <code>json<\/code> (JSON verisi d\u00f6nd\u00fcrmek i\u00e7in).<\/li>\n<\/ul>\n<h3>4. Value Stack ve OGNL (Object-Graph Navigation Language)<\/h3>\n<p><b>Value Stack:<\/b> Her HTTP iste\u011fi i\u00e7in olu\u015fturulan, Action nesnesi ve di\u011fer ilgili nesneleri (\u00f6rne\u011fin ModelDriven aray\u00fcz\u00fcn\u00fc uygulayan nesneler) i\u00e7eren ge\u00e7ici bir veri yap\u0131s\u0131d\u0131r. View katman\u0131nda (JSP) Action \u00f6zelliklerine eri\u015fmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><b>OGNL:<\/b> Value Stack \u00fczerindeki verilere eri\u015fmek, manip\u00fcle etmek ve ifade de\u011ferlendirmesi yapmak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir ifade dilidir. Struts2 etiketleri (<code><s:property><\/code>, <code><s:textfield><\/code> vb.) OGNL kullanarak Value Stack&#8217;ten veri \u00e7eker.<\/p>\n<h4>\u00d6rnek OGNL Kullan\u0131m\u0131 (JSP i\u00e7inde):<\/h4>\n<pre><code class=\"language-html\">\n<!-- Action'daki \"kullaniciAdi\" \u00f6zelli\u011fine eri\u015fim -->\n<p>Merhaba, <s:property value=\"kullaniciAdi\"\/>!<\/p>\n\n<!-- Bir nesnenin \u00f6zelli\u011fine eri\u015fim (\u00f6rne\u011fin, Action'da bir \"kullanici\" nesnesi varsa) -->\n<p>Kullan\u0131c\u0131 Ad\u0131: <s:property value=\"kullanici.ad\"\/><\/p>\n\n<!-- Listeden ilk elemana eri\u015fim -->\n<s:iterator value=\"urunler\">\n    <p>\u00dcr\u00fcn Ad\u0131: <s:property value=\"ad\"\/>, Fiyat: <s:property value=\"fiyat\"\/><\/p>\n<\/s:iterator>\n<\/code><\/pre>\n<h2>Struts2 Konfig\u00fcrasyonu ve \u0130stek Ya\u015fam D\u00f6ng\u00fcs\u00fc<\/h2>\n<p>Struts2&#8217;nin \u00e7al\u0131\u015fmas\u0131, <code>web.xml<\/code> ve <code>struts.xml<\/code> dosyalar\u0131ndaki konfig\u00fcrasyonlara ba\u011fl\u0131d\u0131r. \u0130stek ya\u015fam d\u00f6ng\u00fcs\u00fc, bir talebin gelmesinden yan\u0131t\u0131n d\u00f6nmesine kadar ge\u00e7en s\u00fcreci a\u00e7\u0131klar.<\/p>\n<h3>1. web.xml Konfig\u00fcrasyonu<\/h3>\n<p>Her Struts2 uygulamas\u0131n\u0131n <code>web.xml<\/code> dosyas\u0131nda <code>StrutsPrepareAndExecuteFilter<\/code> filtresi tan\u0131mlanmal\u0131d\u0131r. Bu filtre, t\u00fcm gelen istekleri yakalar ve Struts2 framework&#8217;\u00fcne y\u00f6nlendirir.<\/p>\n<h4>\u00d6rnek web.xml:<\/h4>\n<pre><code class=\"language-xml\">\n<web-app ...>\n    <filter>\n        <filter-name>struts2<\/filter-name>\n        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter<\/filter-class>\n    <\/filter>\n    <filter-mapping>\n        <filter-name>struts2<\/filter-name>\n        <url-pattern>\/*<\/url-pattern>\n    <\/filter-mapping>\n    ...\n<\/web-app>\n<\/code><\/pre>\n<h3>2. struts.xml Konfig\u00fcrasyonu<\/h3>\n<p><code>struts.xml<\/code>, Struts2 uygulamas\u0131n\u0131n ana konfig\u00fcrasyon dosyas\u0131d\u0131r. Action&#8217;lar, Result&#8217;lar, Interceptor&#8217;lar ve paketler burada tan\u0131mlan\u0131r.<\/p>\n<ul>\n<li><b>Package:<\/b> Benzer Action&#8217;lar\u0131 ve Result&#8217;lar\u0131 gruplamak i\u00e7in kullan\u0131l\u0131r. <code>extends=\"struts-default\"<\/code> ifadesi, Struts2&#8217;nin sa\u011flad\u0131\u011f\u0131 varsay\u0131lan Interceptor&#8217;lar ve Result tiplerini miras almay\u0131 sa\u011flar.<\/li>\n<li><b>Namespace:<\/b> Action&#8217;lar\u0131 mant\u0131ksal olarak ay\u0131rmak i\u00e7in kullan\u0131l\u0131r (\u00f6rn. <code>\/admin<\/code>, <code>\/user<\/code>).<\/li>\n<li><b>Action Mapping:<\/b> Bir URL&#8217;yi bir Action s\u0131n\u0131f\u0131na e\u015fler ve o Action i\u00e7in hangi Result&#8217;lar\u0131n hangi g\u00f6r\u00fcn\u00fcmlere gidece\u011fini tan\u0131mlar.<\/li>\n<\/ul>\n<h4>\u00d6rnek struts.xml:<\/h4>\n<pre><code class=\"language-xml\">\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE struts PUBLIC\n    \"-\/\/Apache Software Foundation\/\/DTD Struts Configuration 2.5\/\/EN\"\n    \"http:\/\/struts.apache.org\/dtds\/struts-2.5.dtd\">\n\n<struts>\n    <package name=\"default\" namespace=\"\/\" extends=\"struts-default\">\n        <action name=\"merhaba\" class=\"com.example.actions.MerhabaAction\">\n            <result name=\"success\">\/WEB-INF\/jsp\/merhaba.jsp<\/result>\n            <result name=\"input\">\/WEB-INF\/jsp\/merhabaFormu.jsp<\/result>\n        <\/action>\n    <\/package>\n\n    <package name=\"admin\" namespace=\"\/admin\" extends=\"struts-default\">\n        <action name=\"kullaniciListele\" class=\"com.example.actions.admin.KullaniciListeleAction\">\n            <result>\/WEB-INF\/jsp\/admin\/kullaniciListesi.jsp<\/result>\n        <\/action>\n    <\/package>\n<\/struts>\n<\/code><\/pre>\n<h3>3. Struts2 \u0130stek Ya\u015fam D\u00f6ng\u00fcs\u00fc:<\/h3>\n<ol>\n<li><b>\u0130stek Gelmesi:<\/b> Kullan\u0131c\u0131 bir web iste\u011fi g\u00f6nderir (\u00f6rn. <code>http:\/\/localhost:8080\/app\/merhaba.action<\/code>).<\/li>\n<li><b>Filtre Taraf\u0131ndan Yakalanma:<\/b> <code>web.xml<\/code>&#8216;de tan\u0131mlanan <code>StrutsPrepareAndExecuteFilter<\/code>, iste\u011fi yakalar.<\/li>\n<li><b>Action Mapping Bulma:<\/b> Filter, <code>struts.xml<\/code>&#8216;e bakarak gelen URL&#8217;ye kar\u015f\u0131l\u0131k gelen Action mapping&#8217;ini bulur.<\/li>\n<li><b>Interceptor Zincirinin \u00c7al\u0131\u015ft\u0131r\u0131lmas\u0131 (\u00d6n \u0130\u015fleme):<\/b> Tan\u0131mlanm\u0131\u015f Interceptor&#8217;lar s\u0131rayla \u00e7al\u0131\u015f\u0131r (\u00f6rn. parametreleri Action \u00f6zelliklerine e\u015fleme, do\u011frulama, kimlik do\u011frulama).<\/li>\n<li><b>Action Metodunun \u00c7a\u011fr\u0131lmas\u0131:<\/b> Action s\u0131n\u0131f\u0131n\u0131n ilgili metodu (genellikle <code>execute()<\/code>) \u00e7a\u011fr\u0131l\u0131r.<\/li>\n<li><b>Interceptor Zincirinin \u00c7al\u0131\u015ft\u0131r\u0131lmas\u0131 (Son \u0130\u015fleme):<\/b> Action metodu d\u00f6nd\u00fckten sonra Interceptor&#8217;lar ters s\u0131rada tekrar \u00e7al\u0131\u015f\u0131r (\u00f6rn. loglama, kaynak temizleme).<\/li>\n<li><b>Result&#8217;\u0131n \u00c7al\u0131\u015ft\u0131r\u0131lmas\u0131:<\/b> Action metodundan d\u00f6nen String de\u011ferine kar\u015f\u0131l\u0131k gelen Result tan\u0131mlan\u0131r ve \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r (\u00f6rn. bir JSP sayfas\u0131na y\u00f6nlendirme).<\/li>\n<li><b>Yan\u0131t G\u00f6nderme:<\/b> Sonu\u00e7 olarak olu\u015fturulan web sayfas\u0131 veya veri kullan\u0131c\u0131ya geri g\u00f6nderilir.<\/li>\n<\/ol>\n<h2>Pratik Konular ve \u0130leri Seviye \u00d6zellikler<\/h2>\n<h3>1. Form Do\u011frulama (Validation)<\/h3>\n<p>Struts2, form verilerini do\u011frulamak i\u00e7in g\u00fc\u00e7l\u00fc mekanizmalar sunar. Hem XML tabanl\u0131 hem de programatik do\u011frulama y\u00f6ntemleri mevcuttur.<\/p>\n<ul>\n<li><b>XML Tabanl\u0131 Do\u011frulama:<\/b> Action s\u0131n\u0131f\u0131n\u0131n bulundu\u011fu pakette <code>ActionClassName-validation.xml<\/code> ad\u0131nda bir dosya olu\u015fturularak yap\u0131l\u0131r. En yayg\u0131n ve basit do\u011frulama y\u00f6ntemidir.<\/li>\n<li><b>Programatik Do\u011frulama:<\/b> Action s\u0131n\u0131f\u0131nda <code>validate()<\/code> metodunu override ederek veya <code>ValidationAware<\/code> aray\u00fcz\u00fcn\u00fc uygulayarak yap\u0131l\u0131r. Daha karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 gerektiren do\u011frulamalar i\u00e7in idealdir.<\/li>\n<\/ul>\n<h4>\u00d6rnek XML Tabanl\u0131 Do\u011frulama (MerhabaAction-validation.xml):<\/h4>\n<pre><code class=\"language-xml\">\n<!DOCTYPE validators PUBLIC\n    \"-\/\/Apache Struts Project\/\/DTD Struts Validator 1.0.1\/\/EN\"\n    \"http:\/\/struts.apache.org\/dtds\/xwork-validator-1.0.1.dtd\">\n<validators>\n    <field name=\"kullaniciAdi\">\n        <field-validator type=\"requiredstring\">\n            <message>Kullan\u0131c\u0131 ad\u0131 bo\u015f b\u0131rak\u0131lamaz.<\/message>\n        <\/field-validator>\n        <field-validator type=\"stringlength\">\n            <param name=\"minLength\">3<\/param>\n            <param name=\"maxLength\">20<\/param>\n            <message>Kullan\u0131c\u0131 ad\u0131 3 ile 20 karakter aras\u0131nda olmal\u0131d\u0131r.<\/message>\n        <\/field-validator>\n    <\/field>\n<\/validators>\n<\/code><\/pre>\n<h3>2. Uluslararas\u0131la\u015fma (Internationalization &#8211; I18N)<\/h3>\n<p>Struts2, farkl\u0131 dillerde i\u00e7erik sunmak i\u00e7in kapsaml\u0131 bir I18N deste\u011fi sa\u011flar. Resource bundle&#8217;lar (<code>.properties<\/code> dosyalar\u0131) kullanarak metinleri y\u00f6netir.<\/p>\n<ul>\n<li><b>Kullan\u0131m:<\/b> <code>ApplicationResources.properties<\/code> (varsay\u0131lan), <code>ApplicationResources_tr.properties<\/code> (T\u00fcrk\u00e7e), <code>ApplicationResources_en.properties<\/code> (\u0130ngilizce) gibi dosyalar olu\u015fturulur. JSP&#8217;lerde <code><s:text name=\"anahtar\"\/><\/code> veya Action&#8217;larda <code>getText(\"anahtar\")<\/code> ile metinlere eri\u015filir.<\/li>\n<\/ul>\n<h3>3. Dosya Y\u00fckleme (File Upload)<\/h3>\n<p>Struts2, <code>fileUpload<\/code> interceptor&#8217;\u0131 sayesinde dosya y\u00fckleme i\u015flemlerini kolayla\u015ft\u0131r\u0131r. Formda <code>enctype=\"multipart\/form-data\"<\/code> ayar\u0131n\u0131n yap\u0131lmas\u0131 ve Action s\u0131n\u0131f\u0131nda <code>File<\/code> tipi \u00f6zellikler tan\u0131mlanmas\u0131 gerekir.<\/p>\n<h4>\u00d6rnek Action&#8217;da Dosya Y\u00fckleme \u00d6zellikleri:<\/h4>\n<pre><code class=\"language-java\">\npublic class DosyaYukleAction extends ActionSupport {\n    private File yuklenenDosya;\n    private String yuklenenDosyaContentType;\n    private String yuklenenDosyaFileName;\n\n    \/\/ Getter ve Setter metotlar\u0131\n    \/\/ ...\n\n    public String execute() {\n        \/\/ Dosya i\u015fleme mant\u0131\u011f\u0131\n        if (yuklenenDosya != null) {\n            System.out.println(\"Dosya Ad\u0131: \" + yuklenenDosyaFileName);\n            System.out.println(\"Dosya Tipi: \" + yuklenenDosyaContentType);\n            System.out.println(\"Dosya Boyutu: \" + yuklenenDosya.length());\n            \/\/ Dosyay\u0131 sunucuya kaydetme vb. i\u015flemler\n            return SUCCESS;\n        }\n        return INPUT;\n    }\n}\n<\/code><\/pre>\n<h3>4. Struts2 Plugin&#8217;leri<\/h3>\n<p>Struts2&#8217;nin mod\u00fcler yap\u0131s\u0131 sayesinde, bir\u00e7ok ek \u00f6zellik plugin&#8217;ler arac\u0131l\u0131\u011f\u0131yla sisteme entegre edilebilir. En pop\u00fcler plugin&#8217;lerden baz\u0131lar\u0131:<\/p>\n<ul>\n<li><b>Struts2 JSON Plugin:<\/b> Action&#8217;lardan kolayca JSON yan\u0131tlar\u0131 d\u00f6nd\u00fcrmeyi sa\u011flar.<\/li>\n<li><b>Struts2 REST Plugin:<\/b> RESTful web servisleri geli\u015ftirmeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><b>Struts2 Spring Plugin:<\/b> Spring framework ile entegrasyonu sa\u011flar, Action&#8217;lar\u0131n Spring bean&#8217;leri olarak y\u00f6netilmesine olanak tan\u0131r.<\/li>\n<\/ul>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Struts2, Java tabanl\u0131 web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve olgun bir MVC framework&#8217;\u00fcd\u00fcr. \u00d6zellikle Interceptor mimarisi, Value Stack ve OGNL gibi \u00f6zellikleri, geli\u015ftiricilere esneklik ve kontrol sa\u011flar. G\u00fcn\u00fcm\u00fczde yeni projelerde Spring MVC, Spring Boot gibi daha modern framework&#8217;ler tercih edilse de, Struts2 hala bir\u00e7ok mevcut kurumsal uygulamada kullan\u0131lmaktad\u0131r ve bu nedenle hakk\u0131nda bilgi sahibi olmak \u00f6nemlidir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Struts2 M\u00fclakat Sorular\u0131:<\/h3>\n<p>\u0130\u015fte Struts2 m\u00fclakatlar\u0131nda s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan sorular ve k\u0131sa yan\u0131tlar\u0131:<\/p>\n<h4>1. Struts2 ve Struts1 aras\u0131ndaki temel farklar nelerdir?<\/h4>\n<ul>\n<li><b>Action S\u0131n\u0131flar\u0131:<\/b> Struts1&#8217;de <code>Action<\/code> s\u0131n\u0131f\u0131ndan miras alma zorunlulu\u011fu varken, Struts2&#8217;de POJO Action&#8217;lar kullan\u0131l\u0131r.<\/li>\n<li><b>Interceptor&#8217;lar:<\/b> Struts2&#8217;de Interceptor mimarisi vard\u0131r, Struts1&#8217;de ise Request Processor kullan\u0131l\u0131rd\u0131.<\/li>\n<li><b>Value Stack\/OGNL:<\/b> Struts2&#8217;de Value Stack ve OGNL, veri ak\u0131\u015f\u0131n\u0131 kolayla\u015ft\u0131r\u0131rken, Struts1&#8217;de ActionForm ve Request nesnesi kullan\u0131l\u0131rd\u0131.<\/li>\n<li><b>View Katman\u0131:<\/b> Struts2&#8217;de daha esnek view teknolojisi entegrasyonu varken, Struts1&#8217;de genellikle JSP&#8217;ler ve Struts Tag Library kullan\u0131l\u0131rd\u0131.<\/li>\n<\/ul>\n<h4>2. Value Stack nedir ve neden \u00f6nemlidir?<\/h4>\n<p>Value Stack, her istek i\u00e7in olu\u015fturulan, Action nesnesi ve di\u011fer ilgili nesneleri i\u00e7eren ge\u00e7ici bir veri yap\u0131s\u0131d\u0131r. View katman\u0131nda (JSP) OGNL kullanarak bu y\u0131\u011f\u0131n \u00fczerindeki verilere kolayca eri\u015filmesini sa\u011flar. Struts2&#8217;deki veri ak\u0131\u015f\u0131n\u0131n temelini olu\u015fturur.<\/p>\n<h4>3. Interceptor&#8217;lar\u0131n rol\u00fc nedir? Bir \u00f6rnek verin.<\/h4>\n<p>Interceptor&#8217;lar, bir Action \u00e7a\u011fr\u0131lmadan \u00f6nce veya \u00e7a\u011fr\u0131ld\u0131ktan sonra belirli g\u00f6revleri yerine getiren bile\u015fenlerdir. Action&#8217;lar\u0131 tekrar eden g\u00f6revlerden (do\u011frulama, loglama, g\u00fcvenlik) ar\u0131nd\u0131rarak kod tekrar\u0131n\u0131 azalt\u0131r ve mod\u00fclerli\u011fi art\u0131r\u0131r. \u00d6rne\u011fin, <code>validation<\/code> interceptor&#8217;\u0131, bir Action&#8217;\u0131n i\u015f mant\u0131\u011f\u0131na girmeden \u00f6nce form verilerini do\u011frular.<\/p>\n<h4>4. Struts2&#8217;de form verilerini Action&#8217;a nas\u0131l aktar\u0131rs\u0131n\u0131z?<\/h4>\n<p>HTTP parametreleri, Action s\u0131n\u0131f\u0131ndaki uygun adland\u0131r\u0131lm\u0131\u015f \u00f6zelliklere otomatik olarak e\u015flenir. Bu i\u015flem <code>params<\/code> interceptor&#8217;\u0131 taraf\u0131ndan yap\u0131l\u0131r. \u00d6rne\u011fin, bir formda <code><input type=\"text\" name=\"kullaniciAdi\"><\/code> varsa, Action s\u0131n\u0131f\u0131nda <code>private String kullaniciAdi;<\/code> ve buna kar\u015f\u0131l\u0131k gelen getter\/setter metotlar\u0131 olmal\u0131d\u0131r.<\/p>\n<h4>5. Struts2&#8217;de <code>package<\/code> ve <code>namespace<\/code> kavramlar\u0131 ne i\u015fe yarar?<\/h4>\n<ul>\n<li><b>Package:<\/b> Benzer Action&#8217;lar\u0131, Interceptor&#8217;lar\u0131 ve Result&#8217;lar\u0131 gruplamak i\u00e7in kullan\u0131l\u0131r. Konfig\u00fcrasyonu d\u00fczenli tutmaya yard\u0131mc\u0131 olur.<\/li>\n<li><b>Namespace:<\/b> Action&#8217;lar\u0131 mant\u0131ksal olarak ay\u0131rmak ve URL \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nlemek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, <code>\/admin<\/code> namespace&#8217;i alt\u0131ndaki Action&#8217;lar sadece <code>\/admin\/<\/code> ile ba\u015flayan URL&#8217;ler arac\u0131l\u0131\u011f\u0131yla eri\u015filebilir.<\/li>\n<\/ul>\n<h4>6. Struts2&#8217;de <code>devMode<\/code> ne anlama gelir?<\/h4>\n<p><code>struts.properties<\/code> dosyas\u0131nda <code>struts.devMode = true<\/code> olarak ayarland\u0131\u011f\u0131nda, Struts2 geli\u015ftirme moduna ge\u00e7er. Bu modda, konfig\u00fcrasyon de\u011fi\u015fiklikleri (\u00f6rn. <code>struts.xml<\/code>&#8216;de yap\u0131lanlar) otomatik olarak yeniden y\u00fcklenir, daha detayl\u0131 hata mesajlar\u0131 g\u00f6r\u00fcnt\u00fclenir ve baz\u0131 performans optimizasyonlar\u0131 devre d\u0131\u015f\u0131 b\u0131rak\u0131l\u0131r. \u00dcretim ortam\u0131nda <code>false<\/code> olarak ayarlanmal\u0131d\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Struts2 Nedir? Neden Kullan\u0131l\u0131r?\nStruts2, Apache Yaz\u0131l\u0131m Vakf\u0131 taraf\u0131ndan geli\u015ftirilen, Java tabanl\u0131 bir web uygulama \u00e7at\u0131s\u0131 (framework)","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-38554","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Struts2 Nedir? Neden Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Struts2 Nedir? Neden Kullan\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Struts2 Nedir? Neden Kullan\u0131l\u0131r? Struts2, Apache Yaz\u0131l\u0131m Vakf\u0131 taraf\u0131ndan geli\u015ftirilen, Java tabanl\u0131 bir web uygulama \u00e7at\u0131s\u0131 (framework)\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-02T15:41:40+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Struts2 Nedir? Neden Kullan\u0131l\u0131r?\",\"datePublished\":\"2026-02-02T15:41:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/\"},\"wordCount\":1769,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/\",\"name\":\"Struts2 Nedir? Neden Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-02T15:41:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Struts2 Nedir? Neden Kullan\u0131l\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Struts2 Nedir? Neden Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Struts2 Nedir? Neden Kullan\u0131l\u0131r?","og_description":"Struts2 Nedir? Neden Kullan\u0131l\u0131r? Struts2, Apache Yaz\u0131l\u0131m Vakf\u0131 taraf\u0131ndan geli\u015ftirilen, Java tabanl\u0131 bir web uygulama \u00e7at\u0131s\u0131 (framework)","og_url":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-02T15:41:40+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"10 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Struts2 Nedir? Neden Kullan\u0131l\u0131r?","datePublished":"2026-02-02T15:41:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/"},"wordCount":1769,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/","url":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/","name":"Struts2 Nedir? Neden Kullan\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-02T15:41:40+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/struts2-nedir-neden-kullanilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Struts2 Nedir? Neden Kullan\u0131l\u0131r?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38554","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=38554"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38554\/revisions"}],"predecessor-version":[{"id":38555,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38554\/revisions\/38555"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38554"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38554"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38554"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}