{"id":35119,"date":"2025-11-25T22:40:54","date_gmt":"2025-11-25T19:40:54","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35119"},"modified":"2025-11-25T22:40:54","modified_gmt":"2025-11-25T19:40:54","slug":"struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/","title":{"rendered":"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan"},"content":{"rendered":"<p><body><\/p>\n<h2>Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Java tabanl\u0131 web uygulamas\u0131 geli\u015ftirme d\u00fcnyas\u0131nda, Model-View-Controller (MVC) mimarisi, uygulaman\u0131n farkl\u0131 katmanlar\u0131n\u0131 ay\u0131rarak geli\u015ftirme ve bak\u0131m\u0131 kolayla\u015ft\u0131ran standart bir yakla\u015f\u0131md\u0131r. Struts 2, Apache Software Foundation taraf\u0131ndan geli\u015ftirilen g\u00fc\u00e7l\u00fc ve esnek bir MVC \u00e7er\u00e7evesidir. Geli\u015ftiricilere, web uygulamalar\u0131 olu\u015fturmak i\u00e7in sa\u011flam bir yap\u0131, zengin \u00f6zellikler ve geni\u015fletilebilir bir mimari sunar. Geleneksel olarak, Struts 2 uygulamalar\u0131n\u0131n yap\u0131land\u0131rmas\u0131 <code>struts.xml<\/code> ad\u0131 verilen XML tabanl\u0131 bir dosya arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131rd\u0131. Bu dosya, hangi URL&#8217;lerin hangi Action s\u0131n\u0131flar\u0131na e\u015flenece\u011fini, Action&#8217;lar\u0131n hangi Interceptor&#8217;lar\u0131 kullanaca\u011f\u0131n\u0131 ve sonu\u00e7 olarak hangi g\u00f6r\u00fcn\u00fcm dosyalar\u0131n\u0131n (JSP gibi) d\u00f6nd\u00fcr\u00fclece\u011fini tan\u0131mlard\u0131. Ancak, modern Java geli\u015ftirme pratikleri, XML tabanl\u0131 yap\u0131land\u0131rmalar\u0131n getirdi\u011fi ek y\u00fck\u00fc azaltma ve yap\u0131land\u0131rmay\u0131 kodun yan\u0131na ta\u015f\u0131ma e\u011filimindedir. Bu noktada, Java Annotasyonlar\u0131 devreye girer.<\/p>\n<p>Struts 2, 2.1 s\u00fcr\u00fcm\u00fcnden itibaren, <code>struts2-convention-plugin<\/code> sayesinde annotasyon tabanl\u0131 yap\u0131land\u0131rmay\u0131 desteklemeye ba\u015flam\u0131\u015ft\u0131r. Bu eklenti, Action s\u0131n\u0131flar\u0131ndaki \u00f6zel annotasyonlar\u0131 okuyarak ve belirli adland\u0131rma kurallar\u0131n\u0131 (convention over configuration) izleyerek, <code>struts.xml<\/code> dosyas\u0131na ihtiya\u00e7 duymadan uygulaman\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131 yap\u0131land\u0131rma yetene\u011fi sunar. Bu yakla\u015f\u0131m, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r, kod taban\u0131n\u0131 temizler ve XML karma\u015fas\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<p>Bu makalede, Struts 2&#8217;nin annotasyon tabanl\u0131 yap\u0131land\u0131rma yeteneklerini kullanarak, geleneksel <code>struts.xml<\/code> dosyas\u0131na hi\u00e7 dokunmadan basit bir &#8220;Hello World&#8221; uygulamas\u0131 olu\u015fturmay\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, Struts 2&#8217;nin temel ak\u0131\u015f\u0131n\u0131 anlamakla kalmay\u0131p, ayn\u0131 zamanda modern geli\u015ftirme yakla\u015f\u0131mlar\u0131n\u0131n sundu\u011fu esneklik ve sadeli\u011fi deneyimlemektir. Maven kullanarak proje kurulumundan ba\u015flayarak, Action s\u0131n\u0131f\u0131 olu\u015fturmaya, g\u00f6r\u00fcn\u00fcm katman\u0131n\u0131 tasarlamaya ve uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmaya kadar t\u00fcm s\u00fcreci detayland\u0131raca\u011f\u0131z.<\/p>\n<h3>Struts 2&#8217;nin Temelleri<\/h3>\n<p>Struts 2, Servlet API \u00fczerine in\u015fa edilmi\u015f bir \u00e7er\u00e7evedir ve bir web iste\u011finin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmek i\u00e7in bir dizi bile\u015fen kullan\u0131r. Temel bile\u015fenleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>FilterDispatcher (veya StrutsPrepareAndExecuteFilter):<\/strong> T\u00fcm Struts 2 isteklerini yakalayan ve i\u015fleyen ana servlet filtresidir. \u0130stekleri Struts 2 \u00e7er\u00e7evesine y\u00f6nlendirir.<br \/>\n*   <strong>Interceptors:<\/strong> Action&#8217;lar \u00e7a\u011fr\u0131lmadan \u00f6nce veya \u00e7a\u011fr\u0131ld\u0131ktan sonra belirli g\u00f6revleri ger\u00e7ekle\u015ftiren mod\u00fcllerdir. \u00d6rne\u011fin, do\u011frulama, dosya y\u00fckleme, modelden veri alma gibi i\u015flemler Interceptor&#8217;lar arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r.<br \/>\n*   <strong>Actions:<\/strong> \u0130\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7eren s\u0131n\u0131flard\u0131r. Bir web iste\u011fine yan\u0131t olarak \u00e7a\u011fr\u0131l\u0131rlar ve genellikle <code>execute()<\/code> gibi bir metotlar\u0131 vard\u0131r. Action&#8217;lar, iste\u011fi i\u015fler, modelle etkile\u015fime girer ve bir sonu\u00e7 kodu d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <strong>Results:<\/strong> Action taraf\u0131ndan d\u00f6nd\u00fcr\u00fclen sonu\u00e7 koduna g\u00f6re hangi g\u00f6r\u00fcn\u00fcm\u00fcn (JSP, FreeMarker, Velocity vb.) g\u00f6r\u00fcnt\u00fclenece\u011fini veya hangi HTTP y\u00f6nlendirmesinin yap\u0131laca\u011f\u0131n\u0131 belirler.<\/p>\n<p>Geleneksel Struts 2&#8217;de, t\u00fcm bu bile\u015fenlerin nas\u0131l bir araya gelece\u011fi <code>struts.xml<\/code> dosyas\u0131nda tan\u0131mlan\u0131rd\u0131. \u00d6rne\u011fin, bir Action&#8217;\u0131n ad\u0131, s\u0131n\u0131f\u0131, kulland\u0131\u011f\u0131 Interceptor&#8217;lar ve farkl\u0131 sonu\u00e7 kodlar\u0131na kar\u015f\u0131l\u0131k gelen g\u00f6r\u00fcn\u00fcm dosyalar\u0131 bu XML&#8217;de belirtilirdi. Ancak annotasyonlarla, bu yap\u0131land\u0131rma bilgileri do\u011frudan Action s\u0131n\u0131flar\u0131n\u0131n i\u00e7ine ta\u015f\u0131n\u0131r.<\/p>\n<h3>Neden struts.xml Olmadan Annotasyonlar\u0131 Kullanmal\u0131y\u0131z?<\/h3>\n<p><code>struts.xml<\/code> dosyas\u0131n\u0131n olmamas\u0131, geli\u015ftirme s\u00fcrecine bir dizi \u00f6nemli avantaj getirir:<\/p>\n<p>1.  <strong>Daha Az XML Yap\u0131land\u0131rmas\u0131:<\/strong> XML dosyalar\u0131, \u00f6zellikle b\u00fcy\u00fck projelerde, olduk\u00e7a karma\u015f\u0131k ve y\u00f6netilmesi zor hale gelebilir. Annotasyonlar, bu karma\u015fay\u0131 azalt\u0131r ve yap\u0131land\u0131rmay\u0131 daha okunabilir hale getirir.<br \/>\n2.  <strong>Kod ve Yap\u0131land\u0131rman\u0131n Birlikteli\u011fi:<\/strong> Action s\u0131n\u0131f\u0131n\u0131n i\u015flevselli\u011fi ile ilgili yap\u0131land\u0131rma bilgileri (\u00f6rne\u011fin, hangi URL&#8217;ye yan\u0131t verdi\u011fi veya hangi JSP&#8217;yi d\u00f6nd\u00fcrd\u00fc\u011f\u00fc) do\u011frudan s\u0131n\u0131f\u0131n i\u00e7inde bulunur. Bu, ilgili bilgileri tek bir yerde tutarak kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n3.  <strong>Geli\u015ftirme H\u0131z\u0131nda Art\u0131\u015f:<\/strong> Daha az XML yazmak ve y\u00f6netmek, \u00f6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r. Geli\u015ftiriciler, yap\u0131land\u0131rma dosyalar\u0131 aras\u0131nda gidip gelmek yerine do\u011frudan i\u015f mant\u0131\u011f\u0131na odaklanabilirler.<br \/>\n4.  <strong>Convention Over Configuration:<\/strong> <code>struts2-convention-plugin<\/code>, belirli adland\u0131rma kurallar\u0131na uyuldu\u011funda otomatik olarak yap\u0131land\u0131rma yapar. Bu, geli\u015ftiricinin her \u015feyi manuel olarak tan\u0131mlama ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve standart bir proje yap\u0131s\u0131n\u0131 te\u015fvik eder.<br \/>\n5.  <strong>Modern Geli\u015ftirme Yakla\u015f\u0131mlar\u0131yla Uyum:<\/strong> Spring Boot, JAX-RS gibi modern Java \u00e7er\u00e7eveleri de annotasyon tabanl\u0131 yap\u0131land\u0131rmay\u0131 yayg\u0131n olarak kullan\u0131r. Struts 2&#8217;nin bu yakla\u015f\u0131m\u0131 benimsemesi, ekosistemdeki genel trendlerle uyum sa\u011flar.<\/p>\n<p>Elbette, b\u00fcy\u00fck ve karma\u015f\u0131k projelerde, merkezi bir <code>struts.xml<\/code> dosyas\u0131n\u0131n genel bir bak\u0131\u015f sunma potansiyeli olabilir. Ancak <code>struts2-convention-plugin<\/code>, bu t\u00fcr senaryolar i\u00e7in de esneklik sunar ve gerekti\u011finde belirli annotasyonlar\u0131 veya adland\u0131rma kurallar\u0131n\u0131 ge\u00e7ersiz k\u0131lma imkan\u0131 tan\u0131r.<\/p>\n<h3>Proje Kurulumu ve Gerekli Ba\u011f\u0131ml\u0131l\u0131klar<\/h3>\n<p>Struts 2 projemizi Maven kullanarak kuraca\u011f\u0131z. Maven, ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimini ve proje derleme s\u00fcre\u00e7lerini otomatikle\u015ftiren g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<p>\u0130lk olarak, yeni bir Maven web projesi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">mvn archetype:generate -DgroupId=com.example -DartifactId=Struts2AnnotationHelloWorld -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false<\/code><\/pre>\n<p>Bu komut, <code>Struts2AnnotationHelloWorld<\/code> ad\u0131nda bir web uygulamas\u0131 iskeleti olu\u015fturacakt\u0131r. Proje dizinine girdikten sonra (<code>cd Struts2AnnotationHelloWorld<\/code>), <code>pom.xml<\/code> dosyas\u0131n\u0131 d\u00fczenlememiz gerekecek.<\/p>\n<p><code>pom.xml<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekleyin:<\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0<\/modelVersion>\n\n    <groupId>com.example<\/groupId>\n    <artifactId>Struts2AnnotationHelloWorld<\/artifactId>\n    <version>1.0-SNAPSHOT<\/version>\n    <packaging>war<\/packaging>\n\n    <properties>\n        <maven.compiler.source>1.8<\/maven.compiler.source>\n        <maven.compiler.target>1.8<\/maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8<\/project.build.sourceEncoding>\n        <struts2.version>2.5.30<\/struts2.version> <!-- G\u00fcncel Struts 2 s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131n -->\n    <\/properties>\n\n    <dependencies>\n        <!-- Struts 2 Core -->\n        <dependency>\n            <groupId>org.apache.struts<\/groupId>\n            <artifactId>struts2-core<\/artifactId>\n            <version>${struts2.version}<\/version>\n        <\/dependency>\n\n        <!-- Struts 2 Convention Plugin (Annotasyonlar i\u00e7in gerekli) -->\n        <dependency>\n            <groupId>org.apache.struts<\/groupId>\n            <artifactId>struts2-convention-plugin<\/artifactId>\n            <version>${struts2.version}<\/version>\n        <\/dependency>\n\n        <!-- Servlet API (Tomcat gibi bir servlet container taraf\u0131ndan sa\u011flan\u0131r) -->\n        <dependency>\n            <groupId>javax.servlet<\/groupId>\n            <artifactId>javax.servlet-api<\/artifactId>\n            <version>3.1.0<\/version>\n            <scope>provided<\/scope>\n        <\/dependency>\n\n        <!-- JSP API (Tomcat gibi bir servlet container taraf\u0131ndan sa\u011flan\u0131r) -->\n        <dependency>\n            <groupId>javax.servlet.jsp<\/groupId>\n            <artifactId>javax.servlet.jsp-api<\/artifactId>\n            <version>2.3.1<\/version>\n            <scope>provided<\/scope>\n        <\/dependency>\n\n        <!-- JSTL (JSP Standard Tag Library) -->\n        <dependency>\n            <groupId>javax.servlet<\/groupId>\n            <artifactId>jstl<\/artifactId>\n            <version>1.2<\/version>\n        <\/dependency>\n\n        <!-- Log4j2 (Opsiyonel ama iyi bir pratik) -->\n        <dependency>\n            <groupId>org.apache.logging.log4j<\/groupId>\n            <artifactId>log4j-core<\/artifactId>\n            <version>2.17.1<\/version>\n        <\/dependency>\n        <dependency>\n            <groupId>org.apache.logging.log4j<\/groupId>\n            <artifactId>log4j-api<\/artifactId>\n            <version>2.17.1<\/version>\n        <\/dependency>\n\n        <!-- JUnit (Test i\u00e7in, opsiyonel) -->\n        <dependency>\n            <groupId>junit<\/groupId>\n            <artifactId>junit<\/artifactId>\n            <version>4.13.2<\/version>\n            <scope>test<\/scope>\n        <\/dependency>\n    <\/dependencies>\n\n    <build>\n        <finalName>Struts2AnnotationHelloWorld<\/finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins<\/groupId>\n                <artifactId>maven-compiler-plugin<\/artifactId>\n                <version>3.8.1<\/version>\n                <configuration>\n                    <source>${maven.compiler.source}<\/source>\n                    <target>${maven.compiler.target}<\/target>\n                <\/configuration>\n            <\/plugin>\n            <!-- Tomcat i\u00e7in maven plugin (opsiyonel, ancak kolay test i\u00e7in kullan\u0131\u015fl\u0131) -->\n            <plugin>\n                <groupId>org.apache.tomcat.maven<\/groupId>\n                <artifactId>tomcat7-maven-plugin<\/artifactId>\n                <version>2.2<\/version>\n                <configuration>\n                    <port>8080<\/port>\n                    <path>\/${project.build.finalName}<\/path>\n                <\/configuration>\n            <\/plugin>\n        <\/plugins>\n    <\/build>\n<\/project><\/code><\/pre>\n<p><strong>\u00d6nemli Notlar:<\/strong><br \/>\n*   <code>struts2-core<\/code>: Struts 2&#8217;nin temel i\u015flevselli\u011fini sa\u011flar.<br \/>\n*   <code>struts2-convention-plugin<\/code>: Bu eklenti, annotasyon tabanl\u0131 yap\u0131land\u0131rmay\u0131 ve &#8220;convention over configuration&#8221; prensibini m\u00fcmk\u00fcn k\u0131lar. <code>struts.xml<\/code> kullanmadan Action&#8217;lar\u0131 ve sonu\u00e7lar\u0131 yap\u0131land\u0131rman\u0131n anahtar\u0131d\u0131r.<br \/>\n*   <code>javax.servlet-api<\/code> ve <code>javax.servlet.jsp-api<\/code>: Bu API&#8217;ler, uygulaman\u0131n bir Servlet kapsay\u0131c\u0131s\u0131nda (\u00f6rne\u011fin, Tomcat) \u00e7al\u0131\u015f\u0131rken zaten mevcut oldu\u011fundan <code>provided<\/code> kapsam\u0131yla eklenir.<br \/>\n*   <code>log4j-core<\/code> ve <code>log4j-api<\/code>: Struts 2, dahili olarak Log4j gibi bir g\u00fcnl\u00fckleme mekanizmas\u0131 kullan\u0131r. Bu ba\u011f\u0131ml\u0131l\u0131klar, uygulaman\u0131zda g\u00fcnl\u00fckleme yapabilmenizi sa\u011flar.<\/p>\n<h3>Web Uygulamas\u0131 Yap\u0131land\u0131rmas\u0131: web.xml<\/h3>\n<p>T\u00fcm Struts 2 uygulamalar\u0131nda oldu\u011fu gibi, web uygulamam\u0131z\u0131n ana yap\u0131land\u0131rma dosyas\u0131 olan <code>web.xml<\/code>&#8216;i d\u00fczenlememiz gerekiyor. Bu dosya, Struts 2&#8217;nin ana filtresi olan <code>StrutsPrepareAndExecuteFilter<\/code>&#8216;\u0131 tan\u0131mlar ve t\u00fcm istekleri bu filtreye y\u00f6nlendirir.<\/p>\n<p><code>src\/main\/webapp\/WEB-INF\/web.xml<\/code> dosyas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app xmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\/web-app_3_1.xsd\"\n         version=\"3.1\">\n\n    <display-name>Struts2AnnotationHelloWorld<\/display-name>\n\n    <!-- Struts 2 Ana Filtresi -->\n    <filter>\n        <filter-name>struts2<\/filter-name>\n        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter<\/filter-class>\n    <\/filter>\n\n    <!-- T\u00fcm istekleri Struts 2 filtresine y\u00f6nlendir -->\n    <filter-mapping>\n        <filter-name>struts2<\/filter-name>\n        <url-pattern>\/*<\/url-pattern>\n    <\/filter-mapping>\n\n    <!-- Varsay\u0131lan ho\u015f geldiniz dosyas\u0131 (iste\u011fe ba\u011fl\u0131) -->\n    <welcome-file-list>\n        <welcome-file>index.jsp<\/welcome-file>\n    <\/welcome-file-list>\n\n<\/web-app><\/code><\/pre>\n<p>Bu <code>web.xml<\/code> yap\u0131land\u0131rmas\u0131, gelen t\u00fcm web isteklerinin (<code>\/*<\/code>) <code>struts2<\/code> filtresi taraf\u0131ndan i\u015flenmesini sa\u011flar. <code>StrutsPrepareAndExecuteFilter<\/code>, Struts 2 \u00e7er\u00e7evesinin kalbidir ve gelen iste\u011fi uygun Action&#8217;a y\u00f6nlendirmekten, Interceptor&#8217;lar\u0131 uygulamaktan ve sonucu i\u015flemeye kadar t\u00fcm s\u00fcreci y\u00f6netir.<\/p>\n<h3>Action S\u0131n\u0131f\u0131 Olu\u015fturma: Annotasyonlar\u0131n G\u00fcc\u00fc<\/h3>\n<p>\u015eimdi, &#8220;Hello World&#8221; mesaj\u0131n\u0131 \u00fcretecek olan Action s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m. Bu s\u0131n\u0131f\u0131 <code>src\/main\/java\/com\/example\/action<\/code> dizini alt\u0131nda <code>HelloAction.java<\/code> olarak kaydedece\u011fiz.<\/p>\n<pre><code class=\"language-java\">package com.example.action;\n\nimport com.opensymphony.xwork2.ActionSupport;\nimport org.apache.struts2.convention.annotation.Action;\nimport org.apache.struts2.convention.annotation.Result;\nimport org.apache.struts2.convention.annotation.Namespace;\n\n\/\/ @Namespace(\"\/\") annotation'\u0131, bu Action'\u0131n k\u00f6k namespace alt\u0131nda oldu\u011funu belirtir.\n\/\/ E\u011fer belirtilmezse, paket ad\u0131na g\u00f6re otomatik bir namespace atanabilir.\n@Namespace(\"\/\")\npublic class HelloAction extends ActionSupport {\n\n    \/\/ Action'dan JSP'ye g\u00f6nderilecek veri i\u00e7in bir \u00f6zellik tan\u0131ml\u0131yoruz.\n    private String userName;\n\n    \/\/ Getter metodu, Struts 2'nin OGNL (Object-Graph Navigation Language) kullanarak\n    \/\/ JSP'den bu \u00f6zelli\u011fe eri\u015fmesini sa\u011flar.\n    public String getUserName() {\n        return userName;\n    }\n\n    \/\/ Setter metodu, formdan veya URL parametresinden gelen veriyi\n    \/\/ bu \u00f6zelli\u011fe set etmesini sa\u011flar.\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    \/<em><\/em>\n     * @Action annotasyonu, bu metodun bir Struts 2 Action'\u0131 oldu\u011funu belirtir.\n     * value = \"hello\" Action'\u0131n URL'deki ad\u0131n\u0131 tan\u0131mlar (\u00f6rn: \/hello).\n     * @Result annotasyonu, Action ba\u015far\u0131l\u0131 oldu\u011funda (varsay\u0131lan \"success\" sonucu i\u00e7in)\n     * hangi JSP dosyas\u0131n\u0131n g\u00f6r\u00fcnt\u00fclenece\u011fini belirtir.\n     * name = \"success\" varsay\u0131lan ActionSupport.SUCCESS sonucunu ifade eder.\n     * location = \"\/WEB-INF\/content\/hello.jsp\" g\u00f6r\u00fcnt\u00fclenecek JSP dosyas\u0131n\u0131n yolunu belirtir.\n     * Convention plugin varsay\u0131lan olarak sonu\u00e7 dosyalar\u0131n\u0131 WEB-INF\/content alt\u0131nda arar.\n     *\/\n    @Action(value = \"hello\", results = {\n        @Result(name = \"success\", location = \"\/WEB-INF\/content\/hello.jsp\")\n    })\n    public String execute() {\n        \/\/ E\u011fer userName bo\u015fsa veya null ise, varsay\u0131lan bir de\u011fer atayal\u0131m.\n        if (userName == null || userName.trim().isEmpty()) {\n            userName = \"D\u00fcnya\";\n        }\n        \/\/ \u0130\u015f mant\u0131\u011f\u0131 burada y\u00fcr\u00fct\u00fcl\u00fcr.\n        \/\/ Ba\u015far\u0131l\u0131 bir \u015fekilde tamamland\u0131\u011f\u0131n\u0131 belirten \"success\" d\u00f6nd\u00fcr\u00fcyoruz.\n        return SUCCESS;\n    }\n}<\/code><\/pre>\n<p>Bu Action s\u0131n\u0131f\u0131ndaki annotasyonlar\u0131 detayl\u0131ca inceleyelim:<\/p>\n<p>*   <strong><code>@Namespace(\"\/\")<\/code><\/strong>: Bu annotasyon, <code>HelloAction<\/code> s\u0131n\u0131f\u0131n\u0131n k\u00f6k namespace alt\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 belirtir. Yani, bu Action&#8217;a <code>\/hello<\/code> URL&#8217;si ile eri\u015filebilir. E\u011fer bu annotasyon olmasayd\u0131, <code>struts2-convention-plugin<\/code> varsay\u0131lan olarak paketin ad\u0131na g\u00f6re bir namespace olu\u015fturabilirdi (\u00f6rne\u011fin, <code>com.example.action<\/code> paketi i\u00e7in <code>\/example\/action<\/code>).<br \/>\n*   <strong><code>@Action(value = \"hello\", results = { ... })<\/code><\/strong>: Bu, en kritik annotasyondur.<br \/>\n    *   <code>value = \"hello\"<\/code>: Bu Action&#8217;a eri\u015fmek i\u00e7in kullan\u0131lacak URL yolunu tan\u0131mlar. Yani, web uygulamas\u0131n\u0131n k\u00f6k dizininden sonra <code>\/hello<\/code> yaz\u0131ld\u0131\u011f\u0131nda bu Action tetiklenecektir.<br \/>\n    *   <code>results = { ... }<\/code>: Action&#8217;\u0131n farkl\u0131 sonu\u00e7 kodlar\u0131na kar\u015f\u0131l\u0131k gelen g\u00f6r\u00fcn\u00fcm dosyalar\u0131n\u0131 tan\u0131mlar. Burada sadece bir <code>Result<\/code> tan\u0131mlad\u0131k:<br \/>\n        *   <code>@Result(name = \"success\", location = \"\/WEB-INF\/content\/hello.jsp\")<\/code>: <code>execute()<\/code> metodu <code>SUCCESS<\/code> (ki bu <code>ActionSupport<\/code> s\u0131n\u0131f\u0131ndan gelen bir sabittir ve de\u011feri &#8220;success&#8221; dizesidir) d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnde, <code>\/WEB-INF\/content\/hello.jsp<\/code> dosyas\u0131n\u0131n g\u00f6r\u00fcnt\u00fclenece\u011fini belirtir. <code>struts2-convention-plugin<\/code> varsay\u0131lan olarak JSP dosyalar\u0131n\u0131 <code>WEB-INF\/content<\/code> dizininde arar.<br \/>\n*   <strong><code>userName<\/code> \u00f6zelli\u011fi ve Getter\/Setter Metotlar\u0131<\/strong>: Struts 2, Action s\u0131n\u0131f\u0131ndaki public getter ve setter metotlar\u0131n\u0131 kullanarak form verilerini veya URL parametrelerini Action \u00f6zelliklerine otomatik olarak ba\u011flar (model driven design). Bu \u00f6rnekte, URL&#8217;den <code>?userName=Ali<\/code> \u015feklinde bir parametre gelirse, <code>setUserName(\"Ali\")<\/code> metodu \u00e7a\u011fr\u0131lacak ve <code>userName<\/code> \u00f6zelli\u011fi &#8220;Ali&#8221; de\u011ferini alacakt\u0131r. Getter metodu ise JSP&#8217;de bu \u00f6zelli\u011fe eri\u015fmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><code>execute()<\/code> metodu, Action&#8217;\u0131n ana i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7erir. Bu \u00f6rnekte, <code>userName<\/code> bo\u015fsa &#8220;D\u00fcnya&#8221; olarak ayarlar ve her zaman <code>SUCCESS<\/code> dizesini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h3>G\u00f6r\u00fcn\u00fcm Katman\u0131: JSP Dosyas\u0131<\/h3>\n<p>Action s\u0131n\u0131f\u0131m\u0131zdan d\u00f6nen <code>SUCCESS<\/code> sonucuna kar\u015f\u0131l\u0131k gelen JSP dosyas\u0131n\u0131 olu\u015ftural\u0131m. <code>struts2-convention-plugin<\/code> varsay\u0131lan olarak g\u00f6r\u00fcn\u00fcm dosyalar\u0131n\u0131 <code>WEB-INF\/content<\/code> dizininde arad\u0131\u011f\u0131 i\u00e7in, bu dizini olu\u015fturup i\u00e7ine <code>hello.jsp<\/code> dosyam\u0131z\u0131 yerle\u015ftirece\u011fiz.<\/p>\n<p><code>src\/main\/webapp\/WEB-INF\/content\/hello.jsp<\/code> dosyas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi olu\u015fturun:<\/p>\n<pre><code class=\"language-jsp\"><%@ page language=\"java\" contentType=\"text\/html; charset=UTF-8\" pageEncoding=\"UTF-8\"%>\n<%@ taglib prefix=\"s\" uri=\"\/struts-tags\"%>\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Struts 2 Hello World<\/title>\n    <style>\n        body {\n            font-family: Arial, sans-serif;\n            margin: 40px;\n            background-color: #f4f4f4;\n            color: #333;\n        }\n        h1 {\n            color: #0056b3;\n        }\n        p {\n            font-size: 1.1em;\n        }\n        .container {\n            background-color: #fff;\n            padding: 30px;\n            border-radius: 8px;\n            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n            max-width: 600px;\n            margin: auto;\n            text-align: center;\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        \n        \n        <p>Merhaba, <s:property value=\"userName\"\/>!<\/p>\n        \n        <p>Bu mesaj, Struts 2 Action s\u0131n\u0131f\u0131n\u0131zdan annotasyonlar kullan\u0131larak dinamik olarak \u00fcretildi. \n           <code>struts.xml<\/code> dosyas\u0131na ihtiya\u00e7 duymadan yap\u0131land\u0131rman\u0131n ne kadar kolay oldu\u011funu g\u00f6sterir.<\/p>\n           \n        <p>URL'ye <code>?userName=Ad\u0131n\u0131z<\/code> ekleyerek farkl\u0131 bir isimle deneyin!<\/p>\n    <\/div>\n<\/body>\n<\/html><\/code><\/pre>\n<p><strong>JSP Dosyas\u0131ndaki \u00d6nemli Noktalar:<\/strong><\/p>\n<p>*   <strong><code><%@ taglib prefix=\"s\" uri=\"\/struts-tags\"%><\/code><\/strong>: Bu sat\u0131r, Struts 2&#8217;nin \u00f6zel etiket k\u00fct\u00fcphanesini (tag library) JSP&#8217;ye dahil eder. Bu k\u00fct\u00fcphane, Action \u00f6zelliklerine eri\u015fmek, form \u00f6\u011feleri olu\u015fturmak ve di\u011fer Struts 2 \u00f6zelliklerini kullanmak i\u00e7in <code>s:<\/code> \u00f6nekli etiketler sa\u011flar.<br \/>\n*   <strong><code><s:property value=\"userName\"\/><\/code><\/strong>: Bu Struts 2 etiketi, <code>HelloAction<\/code> s\u0131n\u0131f\u0131ndaki <code>userName<\/code> \u00f6zelli\u011finin de\u011ferini al\u0131r ve JSP&#8217;de g\u00f6r\u00fcnt\u00fcler. Struts 2&#8217;nin OGNL (Object-Graph Navigation Language) yetene\u011fi sayesinde Action&#8217;\u0131n \u00f6zelliklerine do\u011frudan eri\u015febiliriz.<\/p>\n<h3>Uygulaman\u0131n \u00c7al\u0131\u015ft\u0131r\u0131lmas\u0131 ve Test Edilmesi<\/h3>\n<p>Projemizi bir Servlet kapsay\u0131c\u0131s\u0131nda (\u00f6rne\u011fin Apache Tomcat) \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Maven&#8217;\u0131 kullanabiliriz. <code>pom.xml<\/code> dosyam\u0131za ekledi\u011fimiz <code>tomcat7-maven-plugin<\/code> sayesinde bu i\u015flem olduk\u00e7a basittir.<\/p>\n<p>Proje k\u00f6k dizininde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">mvn clean install tomcat7:run<\/code><\/pre>\n<p>Bu komut, projenizi derleyecek, <code>.war<\/code> dosyas\u0131n\u0131 olu\u015fturacak ve g\u00f6m\u00fcl\u00fc Tomcat sunucusunu ba\u015flatacakt\u0131r. Sunucu ba\u015far\u0131yla ba\u015flat\u0131ld\u0131\u011f\u0131nda, taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki URL&#8217;leri ziyaret edin:<\/p>\n<p>1.  <strong>Varsay\u0131lan Hello World:<\/strong> <code>http:\/\/localhost:8080\/Struts2AnnotationHelloWorld\/hello<\/code><br \/>\n    *   Bu URL&#8217;yi ziyaret etti\u011finizde, <code>HelloAction<\/code> s\u0131n\u0131f\u0131n\u0131n <code>execute()<\/code> metodu \u00e7al\u0131\u015facak ve <code>userName<\/code> \u00f6zelli\u011fi varsay\u0131lan olarak &#8220;D\u00fcnya&#8221; de\u011ferini alacakt\u0131r. JSP, &#8220;Merhaba, D\u00fcnya!&#8221; mesaj\u0131n\u0131 g\u00f6sterecektir.<\/p>\n<p>2.  <strong>Ki\u015fiselle\u015ftirilmi\u015f Hello World:<\/strong> <code>http:\/\/localhost:8080\/Struts2AnnotationHelloWorld\/hello?userName=Ali<\/code><br \/>\n    *   Bu URL&#8217;yi ziyaret etti\u011finizde, URL&#8217;deki <code>userName<\/code> parametresi <code>HelloAction<\/code> s\u0131n\u0131f\u0131ndaki <code>setUserName()<\/code> metodunu tetikleyecek ve <code>userName<\/code> \u00f6zelli\u011fini &#8220;Ali&#8221; olarak ayarlayacakt\u0131r. JSP, &#8220;Merhaba, Ali!&#8221; mesaj\u0131n\u0131 g\u00f6sterecektir.<\/p>\n<p><strong>Ak\u0131\u015f\u0131n \u00d6zeti:<\/strong><\/p>\n<p>1.  Kullan\u0131c\u0131 <code>http:\/\/localhost:8080\/Struts2AnnotationHelloWorld\/hello<\/code> URL&#8217;sine bir istek g\u00f6nderir.<br \/>\n2.  <code>web.xml<\/code>&#8216;de yap\u0131land\u0131r\u0131lan <code>StrutsPrepareAndExecuteFilter<\/code>, bu iste\u011fi yakalar.<br \/>\n3.  Filtre, <code>struts2-convention-plugin<\/code>&#8216;i tetikler. Convention plugin, Action s\u0131n\u0131flar\u0131n\u0131 tarar ve <code>@Action(value=\"hello\")<\/code> annotasyonuna sahip <code>HelloAction<\/code> s\u0131n\u0131f\u0131n\u0131 bulur.<br \/>\n4.  Struts 2, <code>HelloAction<\/code> s\u0131n\u0131f\u0131n\u0131n bir \u00f6rne\u011fini olu\u015fturur. E\u011fer URL&#8217;de <code>userName<\/code> parametresi varsa, <code>setUserName()<\/code> metodu \u00e7a\u011fr\u0131larak bu \u00f6zellik set edilir.<br \/>\n5.  <code>execute()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r.<br \/>\n6.  <code>execute()<\/code> metodu <code>SUCCESS<\/code> dizesini d\u00f6nd\u00fcr\u00fcr.<br \/>\n7.  <code>@Result(name=\"success\", location=\"\/WEB-INF\/content\/hello.jsp\")<\/code> annotasyonu sayesinde, Struts 2 <code>\/WEB-INF\/content\/hello.jsp<\/code> dosyas\u0131n\u0131 g\u00f6r\u00fcnt\u00fcler.<br \/>\n8.  JSP i\u00e7inde <code><s:property value=\"userName\"\/><\/code> etiketi, <code>HelloAction<\/code> nesnesindeki <code>userName<\/code> \u00f6zelli\u011finin de\u011ferini al\u0131r ve ekranda g\u00f6sterir.<\/p>\n<h3>Convention Plugin&#8217;in Derinlikleri<\/h3>\n<p><code>struts2-convention-plugin<\/code>, Struts 2&#8217;nin annotasyon tabanl\u0131 yap\u0131land\u0131rmas\u0131n\u0131n kalbinde yer al\u0131r. Bu eklenti, belirli adland\u0131rma kurallar\u0131na (&#8220;convention&#8221;) uyuldu\u011funda, geli\u015ftiricinin manuel yap\u0131land\u0131rma (&#8220;configuration&#8221;) yapma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. \u0130\u015fte baz\u0131 temel kurallar:<\/p>\n<p>*   <strong>Action S\u0131n\u0131f\u0131 Konumu:<\/strong> Varsay\u0131lan olarak, eklenti <code>action<\/code> veya <code>actions<\/code> gibi paketlerdeki s\u0131n\u0131flar\u0131 Action olarak kabul eder. Ancak <code>@Action<\/code> annotasyonu kullan\u0131ld\u0131\u011f\u0131nda bu kural ge\u00e7ersiz k\u0131l\u0131nabilir.<br \/>\n*   <strong>Action Adlar\u0131:<\/strong> E\u011fer bir s\u0131n\u0131f <code>Action<\/code> ile bitiyorsa (\u00f6rne\u011fin <code>HelloAction<\/code>), varsay\u0131lan olarak Action ad\u0131 s\u0131n\u0131f ad\u0131n\u0131n k\u00fc\u00e7\u00fck harfli ve &#8220;Action&#8221; k\u0131sm\u0131 at\u0131lm\u0131\u015f hali olur (yani <code>hello<\/code>). <code>@Action(value=\"...\")<\/code> ile bu da ge\u00e7ersiz k\u0131l\u0131nabilir.<br \/>\n*   <strong>Namespace&#8217;ler:<\/strong> <code>@Namespace<\/code> annotasyonu kullan\u0131lmazsa, eklenti Action s\u0131n\u0131f\u0131n\u0131n paket yolunu (\u00f6rne\u011fin <code>com.example.action<\/code> i\u00e7in <code>\/example\/action<\/code>) bir namespace olarak kullan\u0131r.<br \/>\n*   <strong>Sonu\u00e7 (Result) Konumlar\u0131:<\/strong> <code>struts2-convention-plugin<\/code> varsay\u0131lan olarak JSP dosyalar\u0131n\u0131 <code>WEB-INF\/content<\/code>, <code>WEB-INF\/pages<\/code> veya <code>WEB-INF\/views<\/code> gibi dizinlerde arar. <code>@Result(location=\"...\")<\/code> ile bu da \u00f6zelle\u015ftirilebilir.<br \/>\n*   <strong>Varsay\u0131lan Sonu\u00e7 Adlar\u0131:<\/strong> <code>execute()<\/code> metodu gibi bir Action metodunun d\u00f6nd\u00fcrd\u00fc\u011f\u00fc string (\u00f6rne\u011fin &#8220;success&#8221;, &#8220;input&#8221;, &#8220;error&#8221;) do\u011frudan bir sonu\u00e7 ad\u0131yla e\u015fle\u015ftirilir. E\u011fer <code>@Result<\/code> annotasyonu kullan\u0131lmazsa, eklenti d\u00f6nd\u00fcr\u00fclen string ile ayn\u0131 ada sahip bir JSP dosyas\u0131n\u0131 (<code>\/WEB-INF\/content\/success.jsp<\/code> gibi) otomatik olarak bulmaya \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>Bu kurallar, projenin standart bir yap\u0131da kalmas\u0131n\u0131 te\u015fvik eder ve yeni geli\u015ftiricilerin projeye adaptasyonunu kolayla\u015ft\u0131r\u0131r. Ayn\u0131 zamanda, h\u0131zl\u0131 prototipleme ve geli\u015ftirme i\u00e7in b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n<h3>Geli\u015fmi\u015f Annotasyon Kullan\u0131mlar\u0131<\/h3>\n<p><code>struts2-convention-plugin<\/code>, temel Action ve Result tan\u0131mlamalar\u0131n\u0131n \u00f6tesinde daha geli\u015fmi\u015f yap\u0131land\u0131rmalar i\u00e7in de annotasyonlar sunar:<\/p>\n<p>*   <strong><code>@Actions<\/code><\/strong>: Birden fazla <code>@Action<\/code> annotasyonunu ayn\u0131 s\u0131n\u0131f veya metot \u00fczerinde kullanmak i\u00e7in bir kapsay\u0131c\u0131 annotasyondur. Bir Action s\u0131n\u0131f\u0131n\u0131n birden fazla URL&#8217;ye yan\u0131t vermesini sa\u011flayabilir.<br \/>\n*   <strong><code>@Results<\/code><\/strong>: Birden fazla <code>@Result<\/code> annotasyonunu ayn\u0131 Action \u00fczerinde kullanmak i\u00e7in bir kapsay\u0131c\u0131 annotasyondur. \u00d6rne\u011fin, <code>success<\/code>, <code>input<\/code>, <code>error<\/code> gibi farkl\u0131 sonu\u00e7lara farkl\u0131 JSP&#8217;ler atamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>@ResultPath<\/code><\/strong>: E\u011fer Action&#8217;lar\u0131n\u0131z i\u00e7in varsay\u0131lan sonu\u00e7 dosya yolunu (\u00f6rn. <code>\/WEB-INF\/content\/<\/code>) de\u011fi\u015ftirmek isterseniz, bu annotasyonu Action s\u0131n\u0131f\u0131n\u0131n \u00fczerine koyabilirsiniz.<br \/>\n*   <strong><code>@ExceptionMapping<\/code><\/strong>: Belirli istisnalar (exceptions) meydana geldi\u011finde hangi g\u00f6r\u00fcn\u00fcm dosyas\u0131n\u0131n g\u00f6sterilece\u011fini veya hangi Action&#8217;a y\u00f6nlendirilece\u011fini tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. Bu, hata y\u00f6netimini Action s\u0131n\u0131f\u0131n\u0131n i\u00e7ine ta\u015f\u0131maya olanak tan\u0131r.<br \/>\n*   <strong><code>@InterceptorRef<\/code><\/strong>: Bir Action&#8217;a veya bir Action metoduna belirli Interceptor&#8217;lar\u0131 uygulamak i\u00e7in kullan\u0131l\u0131r. Bu, <code>struts.xml<\/code>&#8216;deki <code><interceptor-ref><\/code> etiketinin annotasyon kar\u015f\u0131l\u0131\u011f\u0131d\u0131r. \u00d6rne\u011fin, <code>params<\/code> veya <code>validation<\/code> Interceptor&#8217;lar\u0131n\u0131 uygulamak i\u00e7in kullan\u0131labilir.<br \/>\n*   <strong><code>@ParentPackage<\/code><\/strong>: Bir Action&#8217;\u0131n hangi Struts paketini (ve dolay\u0131s\u0131yla o pakette tan\u0131ml\u0131 olan Interceptor stack&#8217;lerini) miras alaca\u011f\u0131n\u0131 belirtmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>Bu annotasyonlar, <code>struts.xml<\/code> dosyas\u0131n\u0131n sundu\u011fu esnekli\u011fi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde annotasyon tabanl\u0131 yap\u0131land\u0131rmaya ta\u015f\u0131r ve \u00e7o\u011fu senaryoda XML&#8217;e olan ihtiyac\u0131 tamamen ortadan kald\u0131r\u0131r.<\/p>\n<h3>Annotasyon Yakla\u015f\u0131m\u0131n\u0131n Avantajlar\u0131 ve Dezavantajlar\u0131<\/h3>\n<p>Annotasyon tabanl\u0131 Struts 2 geli\u015ftirmesinin sundu\u011fu avantajlar ve potansiyel dezavantajlar bulunmaktad\u0131r:<\/p>\n<h4>Avantajlar:<\/h4>\n<p>1.  <strong>Daha Az XML Karma\u015fas\u0131:<\/strong> En belirgin avantaj, XML yap\u0131land\u0131rma dosyalar\u0131n\u0131n say\u0131s\u0131n\u0131n ve karma\u015f\u0131kl\u0131\u011f\u0131n\u0131n azalmas\u0131d\u0131r. Bu, proje boyutunu k\u00fc\u00e7\u00fclt\u00fcr ve geli\u015ftiricinin daha az &#8220;yap\u0131land\u0131rma dili&#8221; ile u\u011fra\u015fmas\u0131n\u0131 sa\u011flar.<br \/>\n2.  <strong>Geli\u015ftirme H\u0131z\u0131:<\/strong> Convention over configuration prensibi sayesinde, bir\u00e7ok standart yap\u0131land\u0131rma otomatik olarak yap\u0131l\u0131r. Bu, \u00f6zellikle yeni bir proje ba\u015flat\u0131rken veya basit Action&#8217;lar eklerken geli\u015ftirme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r.<br \/>\n3.  <strong>Kodun Okunabilirli\u011fi ve Bak\u0131m\u0131:<\/strong> Yap\u0131land\u0131rma bilgileri do\u011frudan Action s\u0131n\u0131f\u0131n\u0131n i\u00e7inde veya \u00fczerinde yer ald\u0131\u011f\u0131 i\u00e7in, bir Action&#8217;\u0131n ne yapt\u0131\u011f\u0131n\u0131, hangi URL&#8217;ye yan\u0131t verdi\u011fini ve hangi sonu\u00e7lar\u0131 d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc anlamak daha kolayd\u0131r. \u0130lgili bilgiler tek bir yerde toplanm\u0131\u015ft\u0131r.<br \/>\n4.  <strong>Modern Geli\u015ftirme Pratikleriyle Uyum:<\/strong> Annotasyonlar, Spring, JAX-RS gibi di\u011fer modern Java \u00e7er\u00e7evelerinde de yayg\u0131n olarak kullan\u0131l\u0131r. Struts 2&#8217;nin bu yakla\u015f\u0131m\u0131 benimsemesi, Java geli\u015ftiricileri i\u00e7in \u00f6\u011frenme e\u011frisini azaltabilir ve ekosistemdeki genel trendlere uyum sa\u011flar.<br \/>\n5.  <strong>Refactoring Kolayl\u0131\u011f\u0131:<\/strong> IDE&#8217;ler, annotasyonlar\u0131 daha iyi anlayabilir ve Action s\u0131n\u0131flar\u0131n\u0131 veya metotlar\u0131n\u0131 yeniden d\u00fczenlerken (refactor) ilgili annotasyonlar\u0131 da g\u00fcncelleyebilir.<\/p>\n<h4>Dezavantajlar:<\/h4>\n<p>1.  <strong>Da\u011f\u0131lm\u0131\u015f Yap\u0131land\u0131rma:<\/strong> \u00c7ok b\u00fcy\u00fck ve karma\u015f\u0131k projelerde, t\u00fcm yap\u0131land\u0131rma bilgilerinin Action s\u0131n\u0131flar\u0131na da\u011f\u0131lmas\u0131, projenin genel yap\u0131s\u0131n\u0131 anlamay\u0131 zorla\u015ft\u0131rabilir. Merkezi bir XML dosyas\u0131n\u0131n sundu\u011fu &#8220;b\u00fcy\u00fck resim&#8221; bazen eksik kalabilir.<br \/>\n2.  <strong>Convention Kurallar\u0131n\u0131 Anlama \u0130htiyac\u0131:<\/strong> <code>struts2-convention-plugin<\/code>&#8216;in &#8220;sihirli&#8221; yap\u0131s\u0131, yani hangi adland\u0131rma kurallar\u0131n\u0131n hangi otomatik yap\u0131land\u0131rmay\u0131 tetikledi\u011fini anlamak, yeni ba\u015flayanlar i\u00e7in ba\u015flang\u0131\u00e7ta biraz zorlay\u0131c\u0131 olabilir. Ne zaman bir annotasyon kullanmak gerekti\u011fini, ne zaman convention&#8217;a g\u00fcvenebilece\u011fini bilmek pratik gerektirir.<br \/>\n3.  <strong>\u00c7ak\u0131\u015fma Potansiyeli:<\/strong> Hem annotasyonlar\u0131 hem de geleneksel <code>struts.xml<\/code>&#8216;i ayn\u0131 projede kullanmak m\u00fcmk\u00fcnd\u00fcr, ancak bu durum yap\u0131land\u0131rma \u00e7ak\u0131\u015fmalar\u0131na ve beklenmedik davran\u0131\u015flara yol a\u00e7abilir. Genellikle tek bir yakla\u015f\u0131m\u0131 benimsemek daha iyidir.<br \/>\n4.  <strong>S\u00fcr\u00fcm Ba\u011f\u0131ml\u0131l\u0131\u011f\u0131:<\/strong> Annotasyonlar ve Convention Plugin, Struts 2&#8217;nin belirli s\u00fcr\u00fcmlerinden itibaren tam olarak desteklenmektedir. Eski projeleri y\u00fckseltirken veya farkl\u0131 s\u00fcr\u00fcmlerle \u00e7al\u0131\u015f\u0131rken uyumluluk sorunlar\u0131 ya\u015fanabilir.<\/p>\n<p>Genel olarak, annotasyon tabanl\u0131 yakla\u015f\u0131m, modern Struts 2 projeleri i\u00e7in \u00f6nerilen ve tercih edilen bir y\u00f6ntemdir. Dezavantajlar\u0131, genellikle dikkatli tasar\u0131m ve iyi dok\u00fcmantasyon ile y\u00f6netilebilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Struts 2 \u00e7er\u00e7evesini kullanarak annotasyonlar arac\u0131l\u0131\u011f\u0131yla ve geleneksel <code>struts.xml<\/code> dosyas\u0131na ihtiya\u00e7 duymadan basit bir &#8220;Hello World&#8221; web uygulamas\u0131 olu\u015fturmay\u0131 ad\u0131m ad\u0131m inceledik. Maven ile proje kurulumundan ba\u015flayarak, <code>pom.xml<\/code>&#8216;e gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 eklemeyi, <code>web.xml<\/code>&#8216;i yap\u0131land\u0131rmay\u0131, <code>@Action<\/code> ve <code>@Result<\/code> annotasyonlar\u0131n\u0131 kullanarak Action s\u0131n\u0131f\u0131m\u0131z\u0131 yazmay\u0131 ve son olarak JSP g\u00f6r\u00fcn\u00fcm\u00fcm\u00fcz\u00fc olu\u015fturmay\u0131 g\u00f6sterdik.<\/p>\n<p><code>struts2-convention-plugin<\/code> sayesinde, Struts 2&#8217;nin ne kadar esnek ve modern geli\u015ftirme pratikleriyle uyumlu oldu\u011funu g\u00f6rm\u00fc\u015f olduk. Annotasyonlar, XML tabanl\u0131 yap\u0131land\u0131rman\u0131n getirdi\u011fi ek y\u00fck\u00fc azaltarak, geli\u015ftiricilerin daha temiz, daha okunabilir kod yazmalar\u0131na ve geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131rmalar\u0131na olanak tan\u0131r. \u00d6zellikle yeni projeler i\u00e7in veya XML karma\u015fas\u0131ndan ka\u00e7\u0131nmak isteyenler i\u00e7in annotasyon tabanl\u0131 yakla\u015f\u0131m g\u00fc\u00e7l\u00fc bir alternatiftir.<\/p>\n<p>Uygulamam\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rarak, bir web iste\u011finin Struts 2 filtresi taraf\u0131ndan nas\u0131l yakaland\u0131\u011f\u0131n\u0131, Convention Plugin&#8217;in Action s\u0131n\u0131f\u0131m\u0131z\u0131 nas\u0131l buldu\u011funu, Action&#8217;\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 nas\u0131l y\u00fcr\u00fctt\u00fc\u011f\u00fcn\u00fc ve son olarak uygun JSP&#8217;yi nas\u0131l g\u00f6r\u00fcnt\u00fcledi\u011fini deneyimledik. Bu temel &#8220;Hello World&#8221; \u00f6rne\u011fi, Struts 2&#8217;nin annotasyonlarla nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na dair sa\u011flam bir temel sunmaktad\u0131r. Buradan hareketle, form i\u015fleme, veritaban\u0131 entegrasyonu, do\u011frulama ve daha karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131 gibi Struts 2&#8217;nin di\u011fer g\u00fc\u00e7l\u00fc \u00f6zelliklerini ke\u015ffetmek i\u00e7in bir ba\u015flang\u0131\u00e7 noktas\u0131 olarak kullan\u0131labilir. Struts 2, hala g\u00fc\u00e7l\u00fc ve aktif olarak geli\u015ftirilen bir \u00e7er\u00e7eve olup, web uygulamalar\u0131 geli\u015ftirmek i\u00e7in ge\u00e7erli bir se\u00e7enektir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan\nGiri\u015f\nJava tabanl\u0131 web uygulamas\u0131 geli\u015ftirme d\u00fcnyas\u0131nda, Model-View-Contro","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-35119","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>Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan - 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\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan\" \/>\n<meta property=\"og:description\" content=\"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan Giri\u015f Java tabanl\u0131 web uygulamas\u0131 geli\u015ftirme d\u00fcnyas\u0131nda, Model-View-Contro\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-25T19:40:54+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan\",\"datePublished\":\"2025-11-25T19:40:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/\"},\"wordCount\":3088,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/\",\"name\":\"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-25T19:40:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan\"}]},{\"@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":"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan - 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\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/","og_locale":"tr_TR","og_type":"article","og_title":"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan","og_description":"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan Giri\u015f Java tabanl\u0131 web uygulamas\u0131 geli\u015ftirme d\u00fcnyas\u0131nda, Model-View-Contro","og_url":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-25T19:40:54+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan","datePublished":"2025-11-25T19:40:54+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/"},"wordCount":3088,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/","url":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/","name":"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-25T19:40:54+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/struts-2-hello-world-ornegi-annotasyonlarla-ve-struts-xml-olmadan\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Struts 2 Hello World \u00d6rne\u011fi: Annotasyonlarla ve struts.xml Olmadan"}]},{"@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\/35119","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=35119"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35119\/revisions"}],"predecessor-version":[{"id":35120,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35119\/revisions\/35120"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}