4 result(s) in 1 page(s)
Previous Page
- 1 / 1 -
Next Page
Struts2 El Kitabı - 4. İlk Struts2 Uygulaması
15 September 08, Monday @ 00:00
Bu yazımızda, ilk Struts2 uygulamasını yapmaya çalışacağım. Aşağıdaki yazıda da anlatıldığı gibi Struts2 uygulaması yaratmanın 2 aşaması vardır: 1. yönetimselaşama, 2. kodlama aşaması.
Bu yazımız yönetimsel kısmı anlatmaktadır.
İlk Struts2 Uygulaması
Bir Struts2 uygulaması yapmanın 2 aşaması vardır: yönetim aşaması ve programlama aşaması.
Yönetim aşaması, web proje yaratma ve web projesine struts2 desteği eklemeden meydana gelir.
Programlama kısmı, struts.xml dosyasında bir action tanımlama, java clasını yaratma, JSP sayfasını yaratma ve dönüş kodlarını tanımlamadan oluşur.
İlk görünüşte, bu aşamaların ne olduğunu anlayamamış olabilirsiniz, okumaya devam edin hepsi açıklığa kavuşacak.
Struts2 uygulamasını Eclipse ile geliştireceğiz. Eclipse'i http://www.eclipse.org/downloads/ linkinden elde edebilirsiniz. Lütfen “Eclipse IDE for Java EE Developers” adlı eclipse uygulamasını indiriniz.
Şimdi Struts2 uygulamasına yönetim kısmı ile başlayalım.
Web Projesi Yaratmak
Eclipse'te Web projesi yaratmak çok kolaydır.
Öncelikle,FileMenu->New->Project... düğmesine tıklayın ve aşağıdaki adımları uygulayın.
“Web/Dynamic Web Project” Sekmesini seçiniz

Proje Adını Atayınız
Burada, proje adı “SimpleStruts2Application” olarak belirlenmiştir. “Target RunTime” seçeneğinin otomatik olarak seçili olduğunu fark etmeniz lazım. Eğer , eclipse'te ilk sefer bir proje yaratıyorsanız, eclipse'e bir çalıştırma ortamı(Runtime Environment) ayarlamanız gerekmektedir. “Window->Preferences->Server->Installed Runtime” sekmesine gidip, bir Runtime ortamı atayınız. Örneğin: Apache Tomcat 6.0
Ardından, “Next” düğmesine tıklayınız.

Proje Façetasını(Facet) Atayınız
Eğer eclipse'de Java SDK ve hedef çalıştırma ortamını (Runtime) atamışsanız, proje Façetası otomatik olarak sizin için ayarlanır. Varsayılan ayarları değiştirmeden, “Next” düğmesine tıklayınız.
Web Modüllerini Ayarlamak
Bu aşamda da birşey yapmanıza gerek yoktur. Varsayılan ayarları kabul edip “finish” düğmesine tıklayınız.

Web Projenize Struts2 Desteği Sağlamak
Eğer bir Struts2 uygulamak istiyorsanız, var olan bir Struts2 Web projesine Struts2 kütüphanelerini yüklemek ve gerekli ayarları yapmak zorundasınız.
Öncelikle, http://apache.karegen.com/struts/library/struts-2.0.11.2-lib.zip adresinden Struts2 kütüphanesini indiriniz. Arşiv dosyasını açtıktan sonra WEB-INF/lib dizini altındaki JAR dosyalarını kendi projenizdeki WEB-INF/lib dizinine kopyalayınız.
Bu kopyalama sonunda Projenizin WEB-INF/lib dizini aşağıdaki gibi olmalıdır.
Ardından, web.xml dosyanızı değiştirerek Web Projenize Struts2'yi tanıtmanız gerekmektedir.
Aşağıdaki satırları WEB-ING/web.xml dosyasına ekleyiniz.
| <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <!-- Add the filter mapping after all filters --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
Web Projesine Struts2'yi tanıttıktan sonra son olarak yapmanız gereken bir struts.xml dosyası oluşturmaktır. Bu dosya Struts2 kütüphanesinin ayar dosyasıdır.
Struts.xml dosyası src/ dizini altında yaratılmalıdır. Bu dosyayı yaratıp aşağıdaki tekst'i dosyaya yapıştırınız. Bu en basit struts.xml dosyasıdır.
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="SimpleStruts2ApplicationPackage1" namespace="/" extends="struts-default"> </package> </struts> |
Bu aşamada, struts.xml dosyasında herhangi bir Action tanımlanmamıştır. Bu yönetimsel aşamalar bittikten sonra ilk Action'ımızı tanımlayacağız.
Şimdilik herşey tamam, en azından öyle görünüyor, çünkü henüz test yapmadık.
Struts2 uygulamamızı ayağa kaldırmak için, Web Projemizi Apache Tomcat Sunucumuzz yüklememiz gerekmektedir.
Eclipse'te J2EE perspektivine geçip, aşağıdaki “Servers” tab'ında sağtıklayınız.

Yukarıdaki resimdeki gibi, new->Server sekmesine tıklayarak, Sunucu yaratımına başlayınız. Tıklamadan sonra ekranınızda aşağıdaki resim belirecektir. Burada Tomcat 6.0 sunucusunu seçerek “Next” düğmesine tıklayınız.
Bir sonraki ekranda, sol bölmedeki SimpleStruts2Application sırasına tıklayıp “Add” düğmesine tıklayınız. Bu işlem sonucunda SimpleStruts2Application uygulaması sağ bölmede görünecektir. “Finish” düğmesine tıklayarak ekranı sonlandırın. Böylelikle SimpleStruts2Application uygulamasını Apache sunucusuna yüklemiş oldunuz.
Şimdi test zamanı. Eclipse ekranında aşağıda yer alan “Servers” tabındaki sunucuya sağ tıklayıp, gelen menüde “start” düğmesi ile sunucuyu başlatın.
Şimdi, işin kötü kısmı başlıyor. Şanslı isek konsolda hiçbir hata görmeden sunucumuz çalışacak, eğer şansımız yoksa ekranımızda kırmızı kırmızı hata mesajları belirecek.
| SEVERE: Exception starting filter struts2 Unable to load bean: type:com.opensymphony.xwork2.ObjectFactory class:org.apache.struts2.spring.StrutsSpringObjectFactory - bean - jar:file:/home/halil/workspace_tvq/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/SimpleStruts2Application/WEB-INF/lib/struts2-spring-plugin-2.0.11.2.jar!/struts-plugin.xml:30:132 |
Maalesef ki şanslı değiliz. Yukarıdaki hata mesajı konsol ekranımızda belirdi. Eğer siz de böyle bir hata aldıysanız, bu şu demek: Sunucunuz org.apache.struts2.spring.StrutsSpringObjectFactory sınıfına ihtiyaç duyuyor ve onu herhangi bir yerde bulamıyor.
Bu problemi çözmek için bahsi geçen sınıfın hangi jar dosyası içinde bulunduğunu öğrenip, o jar dosyasını WEB-INF/ib dizinimize eklememiz gerekiyor.
Bu jar dosyası spring.jar. http://sourceforge.net/project/showfiles.php?group_id=73357&package_id=173644&release_id=608794 linkindeki Spring kütüphanelerini indirisek bir spring.jar dosyamız olacak.
Şimdi linkten arşiv dosyaını indirip, içini açıp spring.jar dosyasını WEB-INF/lib dizinine kopyalayınız. Ardından, Tomcat sunucunuzu tekrardan başlatınız.
Eğer yukarıda anlattığım yolların hepsini izlemişseniz, tekrar başlattıktan sonra aşağıdaki bir hata ile daha karşılaşmanız gerekmekte :).
| SEVERE: ********** FATAL ERROR STARTING UP STRUTS-SPRING INTEGRATION ********** Looks like the Spring listener was not configured for your web app! Nothing will work until WebApplicationContextUtils returns a valid ApplicationContext. You might need to add the following to web.xml: <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> |
İngilizce biliyorsanız, yukarıdaki hata gayet açık. Aşağıdaki yazıyı web.xml dosyanıza ekleyip, sunucunuzu tekrar başlatın diyor.
| <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> |
Tekrar başlattıktan sonra, işler maalesef bitmiyor. Yine benim gittiğim yoldan gitmişseniz :), aşağıdaki gibi bir hata ile karşılaşmanız gerekiyor.
| org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml] |
Yine İngilizce biliyorsanız, hata yine gayet yönlendirici. Diyor ki, /WEB-INF/applicationContenxt.xml dosyasını bulamıyorum. Yapmamız gereken böyle bir dosya yaratmak.
Bahsi geçen dosyayı yaratıp, aşağıdaki içeriği dosyaya yapıştırın. Ve tekrardan Tomcat'i baştan başlatın.
| <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> </beans> |
Maalesef hatalar bitmiyor. Bu sefer de aşağıdaki hata ile karşılaşıyoruz.
| WARNING: Unable to load config class org.apache.struts2.jsf.FacesSetupInterceptor at interceptor - jar:file:/home/halil/workspace_tvq/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/SimpleStruts2Application/WEB-INF/lib/struts2-jsf-plugin-2.0.11.2.jar!/struts-plugin.xml:36:97 probably due to a missing jar, which might be fine if you never plan to use the jsfSetup interceptor 26.Ağu.2008 11:01:17 com.opensymphony.xwork2.config.providers.InterceptorBuilder constructInterceptorReference SEVERE: Actual exception Could not load class org.apache.struts2.jsf.FacesSetupInterceptor. Perhaps it exists but certain dependencies are not available? - interceptor - jar:file:/home/halil/workspace_tvq/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/SimpleStruts2Application/WEB-INF/lib/struts2-jsf-plugin-2.0.11.2.jar!/struts-plugin.xml:36:97 |
Bu hata da aslında gayet açık. Eğer projenizde JSF desteği istiyorsanız, org.apache.struts2.jsf.FacesSetupInterceptor sınıfını ve bağlı olduğu jar dosyalarını sisteme yükleyiniz.
Ama biz projemizde JSF desteği istemiyoruz. Dolayısı ile Struts2 ile gelen JSF eklentisini de istemiyoruz. Zaten hataya sebep olan bu eklenti kütüphanesi. Yapmamız gereken, bu hataya sebep olan eklenti kütüphanesini yani struts2-jsf-plugin-2.0.11.2.jar dosyasını Web-INF/lib dizininden silmek.
Bunu jar dosyasını sildikten sonra sunucunuzu tekrardan başlatın. Yine eğer benim gittiğim yoldan gitmişseniz, bu sefer hata almamanız gerekiyor :).
Nihayet, Struts2 uygulamamızın ilk ayağı olan yönetim ayağı bitmiş oldu. Çünkü sistemimiz ayağa kalkarken(yani sunucu start olurken) hiçbir hata almıyor. Şimdi sıra Struts2 action'larımızı tanımlamada.
-halil agin.
Tags:
struts2
Struts2 uygulaması
Struts2 Projesi Yaratmak
,
Comments:
0
Struts2 El Kitabı - 3. İçerdeyiz
08 September 08, Monday @ 18:16
Önceki bölümde, kara kutunun dışında iken içindekinleri anlatmaya çalıştım. Şimdi içindeyiz! Ve içerde neler gördüğümüzü anlatacağım.

Yukarıdaki resim, Struts2 alt yapısını resmetmektedir.
Resimde, bir internet gezgininin talebi sunucuya ulaştığı zaman, karakter sırası olarak prezente edilen URL, Servlet sunucusu tarafında HttpServletRequest objesine dönüştürülür. Ardından, HttpServletRequest objesi bazı filtrelerden geçer. FilterDispatcher Filtresi web.xml dosyasında tanımlı olduğu için, HttpServletRequest objesi bu filtreden de geçer. FilterDispatcher objeis çalıştırıldığında, bu obje ActionMapper objesine istenilen URL'nin bir Action ile eşleşip eşleşmediğini sorar. Eğer bir action sınıfı ile eşleşiyor ise akış devam eder eğer eşleşmiyor ise, sunucuya ilgili URL'nin bulunmadığı bilgisi dönülür.
Eğer URL bir action sınıfı ile eşleşmiş ise, FilterDispatcher objesi sorumluluğu ActionProxy sınıfına delege eder. ActionProxy objesi eşleşen Action sınıfı ile ilgli bilgileri ConfigurationManager objesi aracılığı ile elde eder. Bu bilgiler ActionMapping sınıfında saklanır. Action ile ilgili bütün bilgiler toplandığında, ActionProxy objesi Action Sınıfını yaratmak ve çalıştırmak için ActionInvocation objesini yaratır. Bu aşamadan sonra ActionInvocation action Objesini çalıştırmaya başlar.
ActionInvocation objesi Action sınıfını çalıştırmadan önce, ilgili Interceptor'ları çalıştırır. Interceptor'ların çalışma sırası struts.xml'de tanımlanma sırası ile aynıdır. ActionInvocation objesi interceptor'lar ın çalışması bittikten sonra Action'ı çalıştırır. Action çalışması sonucunda bir Geri dönüş kodu döner. Bu kod String formatındadır. ActionInvocation objeis bu geri dönülen değerin struts.xml'de Action tanımlamalarında eşleşen bir geri dönüş kodu olup lomadığına bakar. Eğer Action Tanımlamasındaki bir geri dönüş kodu ile eşleşir ise, bu eşleştirmenin işaret ettiği JSP sayfasını üretir. JSP üretildikten sonra interceptorların struts.xml'de tanımlanma sırasının tersine göre tekrar interceptor'lar çalıştırılır ve en sonunda JSP HTML'ye dönüştürülüp sonuç istemciye gönderilir.
-halil agin
Tags:
struts2
,
Comments:
0
Struts2 El Kitabı - 2. Biraz Teori
05 September 08, Friday @ 12:35
Eğer bir Web Uygulaması geliştirmek istiyorsanız, bir sürü seçeneğiniz var. Bunlardan biri de Struts2'dir.
Struts1'in devemı olan Struts2, size MVC dizayn şablonunu uygulayan modern bir altyapı sağlar. Struts2 nin Struts1'den aldıklarının yanında ondan farklı olan bir çok yeni özelliği vardır.
Eğer geçimişte Struts2 ile uygulama geliştirmiş iseniz, Struts2 ile uygulama geliştirmeye başladığınızda bir çok yeni özelliği hemen farkedeceksiniz. Aslında Struts2, struts1 ile karşılaştırıldığında size tamamen yeni ve farklı bir altyapı sağlar. Tabii ki Struts1 ile bazı ortak noktaları vardır. Ama bu ortak noktalar Struts1'in devamı olduğu için değil, aynı MVC dizayn şablonunu uyguladığı içindir. Sonuç olarak şunu diyebiliriz: Struts2 MVC ve terminolojiyi Struts1'den kalıtsal olarak almıştır ama tamamen farklı bir altyapıdır.
Bu dokümanda, Struts1'den bahsetmeyeceğiz ama Struts1 ve Struts2'nin özelliklerini karşılaştırmak yerinde bir hareket olacaktır.
Aşağıdaki Struts1 ve Struts2 karşılaştırması yer almaktadır. Bu karşılaştırma http://www.roseindia.net/struts/struts1-vs-struts2.shtml adresinden alınmıştır.
| Özellik | Struts1 | Struts2 |
| Action Sınıfları | Struts1, Action sınıfını Ana sınıftan kalıtsal olarak yaratır. Struts1'deki problem, “Arayüzler” (İnterface) kullanmak yerine, ana sınıflar kullanmasınıdır. | Struts2'de Action sınıfı Action arayüzlerini uygular. Bunun yanında çoğunlukla kullanılan arayüzleri ActionSupport Sınıfında uygulatır. Action sınıfı için herhangi bir arayüz uygulamasına gerek yoktur. Basit bir POJO sınıfı da Action, execute metodu olmak şartı ile, olarak kullanılabilir. |
| Threadin Modeli | Struts1 Action sınıfları Tekil(Singleton) sınıflardır. Bu yüzden, Thread-safe olmak dumundadırlar. Çünkü, sınıfın tek bir yaratımı sınıfa ulaşan bütün talepleri yönetir. Tekil yaratım stratejisi, Struts1 i sınırlandıran bir özellik. Kod yazımı sırasında, sınıfı Thread-safe bırakabilmek için ekstra dikkat gerektiriyor. | Struts2'nin Thread-Safe olma gibi bir problemi yoktur. Her bir istemde, Actionsınıfları baştan yaratılır. Servlet sunucusu her bir talep için bir çok obje yaratır. Bu yaratılan objeler bir performans problemi yaratmaz. |
| Servlet Bağımlılıkları | Action sınıfları Servlet APIS'sine bağlıdırlar. Çünkü Her bir action Sınıfı metoduna HttpServletRequest ve HttpServletResponse objesi parametre olarak aktarılır. | Servlet Sunucusu, Struts2 Action sınıfına ve Servlet sınıflarını ay kefeye koyup ikisine de aynı davranışı sergilemez. Container does not treat the Struts 2 Actions as a couple. Servlet2 kontekst leri Struts2 Action sınıflarında basi Java Map'leri olarak yer bulurlar. Böylece Servlet Response ve Request objelerini hala ulaşılabilir durumda olurlar. Diğer yapısal sınıfların böyle bir ulaşım hakları mevcut değildir. |
| Test Edilebilirlik | Action sınıfları Servlet objelerine bağımlı olduğu için, Struts1 uygulamalarının test edilme aşamasında büyük problemleri vardır. Struts1 TestCase Objesi bu problemi Mock objeleri ile çözer. | Struts2 Action sınıflarını test edebilmek için onları yaratmanız, özelliklerini yüklemeniz ve metodları çalışıtmanız yeterlidir. Bağımlılık enejksiyonu mekanizması test edilebilirliği daha da kolaylaştırır. |
| Girdi Verilerini Toplamak | Struts1 istemciden gelen girdileri ActionForm Objesi aracılığı alır. Action sınıfları gibi ActionForm sınıfı da bi ana sınıfı kalıtsal olarak alır. Diğer JavaBean objeleri ActionForm olarak kullanılamaz. Bu durum, geliştiricilerin girdi değerlerini almak için daha fazla sınıf yaratmalarına sebep olur. DynaBean ActionForm yerine kullanılabilecek iyi bir alternatiftir. | Struts2 Action yerel değişkenlerini girdi değeri olarak kullanır. Bu durum gereksiz ikinci bir sınıf yaratımını engeller. Bu girdi değerleri, farklı girdi türlerinde olabilir. Geliştiriciler Action sınıfı yerel değişkenlerine Web Sayfasından Struts Tagleri ile ulaşabilirler. Struts2 ActionForm sistemini ve POJO Form objelerini de desteklemektedir. |
| Betik Dili | Struts1 JSTL ve JSTL-EL ile entegredir. EL basit düzeyde obje graf gezimini destekler. Ama yığınlarda ve indeksli değişkenlerde zayıftır. | Struts2 JSTL'yi destekler ama ondan daha güçlü olan OGNL'yi de destekler. |
| Değerleri görünüş'e(View) bağlama | Struts1 objeleri standart JSP mekniazması ile Sayfa içeriğine bağlar. | Struts2 değişken değerlerini Tag'lere bağlarken View aşamasına geçmeden ValueStack mekanizmasını kullanarak değerleri tag'lere bağlar. Bu durum, View'leri tekrar kullanılabilir duruma getirir. |
| Tür Dönüşümü | Struts1 ActionForm değişkenlerinin neredeyse tamamı String türündedir. Tür Dönüşümü için Commons-Beanutils kullanılır. Dönüştürücüler her sınıf için farklıdırve her bir yaratım Için ayarlanabilir değildir. | Struts2 tür dönüşümü için OGNL ve Dönüştürücüler kullanır. Basit genel ve primitiv türler için dönüşümler yapabilir. |
| Doğrulama(Validation) | Struts1 doğrulama işlemini ActionForm sınıfındaki validate metodu ile yapar veya Commons Validator kullanır. Aynı sınıf doğrulaması için farklı doğrulama kontekstleri kullanır. Alt objeler için doğrulama mümkün deildir. | Struts2, doğrulama işlemi için validate metodunu veya Xwork Doğrulama altyapısını kullanabilir. Xwork doğrulama altyapısı zindirleme bir şekilde obje ve alt objeler için doğrulama yapmanızz olanak sağlar. |
| Action çalıştırma Mekanizması | Struts1'de her modülün , istemcinin talebine istinaden ayrı bir hayat döngüsü vardır. Modül içindeki her Action sınıfı da ynı hayat döngüsünden geçmek zorundadır. | Struts2'de her bir Action sınıfı için interceptor Stack mekanizması aracılığı ile farklı hayat döngüleri yaratılabilir. |
Daha Derine!
Struts2'nin modern bir MVC uygulaması olduğunu belirtmiştik. Peki nedir MVC?
MVC, İş mantığı(Bussiness Logic,Model) ve prezentasyon tabakasını(Presentation Layer, View) birbirinden ayıran bir dizayn şablonudur. Tabi bu tabakalara bir de Yönlendirici(Controller) tabakasını eklemek gerekir.
MVC'nin (C)ontroller tabakası bir kavşakta duran Trafik Polisi gibidir. Nasıl Trafik Polisi gelen geçen arabaların hangi yöne gideceğine karar veriyorsa, Controller da istemciden gelen isteklerin hangi Action'a ulaşacağına karar verir. Aşağıdaki resim MVC'nin yukardan bakışını resmetmektedir.
MVC'nin en önemli özelliği İş Mantığı katmanı ile Prezentasyon Katmanını birbirinden tamamen ayırmasıdır. Struts2 altyapısına baktığınızda ilk fark edeceğiniz özellik budur.
Daha önce, Struts2'nin MVC yapısını uyguladığını söylemiştik. Bu demektir ki: Struts2 altyapısı da yukarda resmedilen MVC yapısına benzemelidir. Eğer aşağıda resmedilen Struts2 altyapısına baktığınızda, yukarıdaki MVC şemasına ne kadar benzediğini farketmeniz gerekir.
Yukarıdaki resim Struts2'nin çok çok çok basitleştirilmiş halidir. Resimde, internet gezgini bir istemde bulunduğunda, ilk olarak FilterDispatcher Objesi yaratılır. Bu objenin yaraılması ile MVC'nin C kısmı aktive olmuş olur. Bu obje, istenilen kaynağın yolunu bir Struts2 Action'ını ile eşleştirir.
Bahsi geçen Action objesi bir Java Objesidir. Bu Java Objesi çalışmaya başladığında MVC'nin M kısmı aktive olmuş olur. Model katmanında, istediğiniz şekilde Java kodu yazabilirsiniz. Ama en sonunda bu Obje String türünde bir Sonuç Değeri(Result Code) dönmek zorundadır. Dönüş değeri bir JSP sayfasına eşleştirilir. Dönüş değerini bir JSP sayfasına eşleştirme ile MVC'nin V kısmı aktive olmuş olur. JSP sayfası üretilemey başladığında Sunucu, istemciye bir sonuç dönüyor demektir. Bu sonuç HTML formatındadır. Yani View aşamasında JSP kodu HTML'ye dönüştürülür.
JSP'den HTML'ye dönüştürme işlemi JSP Betik Dili, JSTL, JSTL-EL, Struts2 tagleri ve/veya diğer genel amaçlı taglerle yapılır.
Güzel!!. Struts2 nin MVC şablonunu nasıl uyguladığını anladınız.
Şimdi aşağıdaki senaryoyu hayal edin:
Bir internet kullanıcısı, internet gezgini ile http://localhost:8080/TVQ/login.action adresine talepte bulunuyor. Bu sayfa TVQ Web Uygulamasının Giriş ekranı ve TVQ uygulaması bir Struts2 uygulaması. Talep sunucuya ulaştığında, Sunucu “TVQ” kelimesini bir Web uygulamasına eşleştirir. Bu eşleştirme sunucudan sunucuya değişir, bu sebeple burada bu seric anlatmak gereksiz. Web uygulaması eşleştikten sonra, sunucu ilk olarak TVQ web uygulamasının web.xml dosyasını okur .
Şu ana kadar, Sunucu TVQ uygulamasının bir Struts2 uygulaması olduğunda haberdar değildir. Aşağıdaki metin web.xml dosyaından alınmıştır.
| <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <!-- Add the filter mapping after all filters --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
Sunucu web.xml dosyasını okuduktan sonra http://localhost:8080/TVQ/login.action adresini hangi sınıfa eşleştirceğini öğrenmiş olur.
Yukarıdaki web.xml içeriği, http://localhost:8080/TVQ adresinden sonraki herhangi bir yazımın(/*) “struts2” ile adlandırılmış filtre tarafından yönlendirilmesini işaret eder. “struts2” adlı filtre web.xml dosyasında tanımlanmış ve org.apache.struts2.dispatcher.FilterDispatcher filtre objesine eşleştirilmiştir. Bu şu anlama geliyor: http://localhost:8080/TVQ/login.action adresi talep edildiğinde,ilk olarak FilterDispatcher sınıfı yaratılacak ve çalıştırılacak.
Bu aşamadan sonra Struts2 sistemi devrededir. FilterDispatcher objesi struts.xml dosyasını okur ve “login.action” yazısının hangi action'a (Java Sınıfına) eşleştirileceiğini öğrenir. Sonra, FilterDispatcher objesi, talep edilen java sınıfı yaratır. Bu, Login objesinin yaratılması ve çalıştırılması demek oluyor. Login objesinin çalışması sonucunda bir Dönüş kodu dönülür. Bu dönüş kodu bir JSP sayfasına eşleşmek durumundadır. Bu eşleştirme struts.xml dosyasında Action tanımlama kısmında mevcuttur. JSP sayfası eşleştikten sonra, JSP HTML'ye dönüştürülür ve istemciye cevap(response) olarak gönderilir.
-halil agin.
Tags:
struts2
altyapı
,
Comments:
0
Struts2 El Kitabı - 1.Biraz Tarih
01 September 08, Monday @ 19:11
Merhabalar;
Bir süredir Struts2 için yardımcı doküman hazırlamaktayın. Biraz zor, biraz da tedirgin edici. Ama ilk kısmını bitirdim.
İlk kısmı tarih ile alakalı. Umarım beğenirsiniz. Eleştirilerinizi bekliyorum.
Sevgiler;
Biraz Tarih
İlk Struts2 uygulamamızı geliştirmeden önce, http, Web Uyugulaması, Web Sunucusu gibi bazı terimleri bilmeniz gerekir. Bunları bilmek için de biraz tarih bilmelisiniz, web teknolojileri için sorulan ilk nasıl ortaya çıktı?, hangi ihtiyaçtan dolayı ortaya çıktı? gibi sorulara cevap verebiliyor olmalısınız.
Bu dokümanda, tarihsel süreci anlatabilmek için olaylar karikatürize edilmiştir. Yani birebir yazıldığı gibi bir süreç izlenmemiştir, ama bu tarihsel sürecin özü korunmaya çalışılmıştır. Bunu yapmamdaki amaç, büyük resmi görmenizi sağlamaktır.
Hadi başlayalım.
Şöyle bir senaryo hayal edin:
Yıl 1989. Smith bir yazılım firmasında C geliştiricisi olarak çalışmaktadır. A makinasında, kendi projesi için doküman yazmaktadır. Dokümanı yazabilmek için bazı istatistiksel verilere ihtiyaç duyar. Bu veriler B Makinasında tekst dosyası olarak saklanmaktadır. 1989 yılında, samba, uzak masaüstü veya diğer türden teknolojiler henüz yoktur. Veri aktarımı için tek sahip olduğu şey eski bir diskettir. B makinasındaki dosyaları almak için, her seferinde, B makinesinin önüne oturur, disketi yuvaya yerleştirir, mount eder, dosyayı diskete kopyalar ve tekrar kendi masasına geri döner. Tabiki B makinası bir Unix makinasıdır:)
Bir süre sonra, Smith sıkılır ve yorulur, çünkü dosyaları almak için her seferinde B makinasının olduğu yere yürür. En sonunda, bir istemci-sunucu mimarisine dayalı iki program yazmaya karar verir. Sunucu programını B makinasına, istemci programını ise A makinasıa yükler. Yazdığı programlar arasındaki protokol basittir. İstemci programı, sunucudan bir dosya talebinde bulunur, sunucu ise bu dosyanın içeriğini istemcinin konsoluna basar.
Örneğin, istemci program sunucudan aşağıdaki gibi bir dosya talebinde bulunur:
$>istemci-program dosyaAl /home/halil/abc.txt
İstemci programı yukarıdaki komut aracılığı ile, istek türünü (“dosyaAl”) ve talepte bulunduğu dosyanın tam yolunu sunucu programına gönderir.
Sunucu programı bu bilgileri alır ve istem türü ve dosya tam yolu yardımı ile kendi dosya sistemindeki istenilen dosyaya ulaşır, dosyayı açar ve içeriğini istemciye yollar.
Basitleştircek olursak; istemci programı bir internet gezgini gibi basit bir dosya istemcisinden başka birşey değildir, aynı şey sunucu programı için de geçerlidir. Sunucu programı, HTTP sunucusu gibi dosya içerik sağlayıcısından başka birşey değildir.
Yukarıdaki senaryoya göre, sunucu programı bizim ilk HTTP sunucumuz, istemci programı ise bizim ilk internet gezginimizdir.
Şimdi senaryoyu biraz daha geliştirelim:
Smith hala doküman yazıyor, bu sefer, tekst dosyası çıktılarına değil ama program çıktılarına ihtiyaç duymaktadır. Ve tabi bu programlarB yine B Makinasında d urmaktadır :). Smith'in bu programları diskete kopyalamasına izin verilmiyor. Smith, bu problemi çözmek için yazdığı programları geliştirme kararı alır.
Bu sefer, istemci programı sunucudan bir dosya talebinde bulunduğunda, eğer talep edilen dosya çalıştırılabilir bir dosya ise sunucu bu programı çalıştırıyor ve istemci konsoluna bu programın çıktısını gönderiyor.
Örneğin, istemci programı aşağıdaki gibi bir istekte bulunuyor.
$>istemci-program programCiktisiAl /home/halil/abc.exe
İstemci program istem türünü (“programCiktisiAl”) ve çalıştırılması istenilen pğrogramın tam yolunu sunucuya göndeirir.
Sunucu programı, istem türünü ve dosyanın tam yolunu elde eder, daha sonra talep edilen programı çalıştırır ve program çıktısını istemci programa gönderir.
Çok güzel. Az önce, Smith CGI mekanizmasını keşfetti!!.
Elimizde bir sunucu programı ve harici programlar var. İstemci sunucudan bir program talep ettiğinde, sunucu bu talebi değerlendirip, tam yolu bilinen programı çalıştırıyor ve programın çıktısını istemciye gönderiyor. Bu mekanizma CGI mekanizması ile birebir aynı.
İlk Web Sunucumuz neredeyse hazır. Ama henüz istemci tarafında bir geliştirmede bulunmadık. Şimdi bu kısmı geliştirelim.
İşte güzel bir senaryo daha:
Smith hala doküman yazıyor ve istemci-sunucu programlarını uzun bu süre zarfında kullandı. Ama bu seferki problemi daha büyük. B makinasında bazı tekst dosyaları var ve bu dosyaları bir şekilde birbiri ile içerik açısından ilişkilendirilmiş. Yani bir doküman diğer dokümana referansta bulunuyor. Bu durum sadece bir kaç doküman için değil, tüm dokümanlar için geçerli. Smith doküman yazarken, referansı verilen orjinal dosyayı bulabilmek için, tüm dokümanları açıp referansları takip edip, en dipteki ana dokümanı bulmak zorunda. Smith bu problemi çözebilmek için istemci programının geliştirilmesi gerektiğini düşünüyor.
Geliştirmeden sonra, artık istemci programı sade bir tekst tabanlı istemci olmaktan çıkıyor. Artık, bir grafik arayüzü ve menüsü mevcuttur. İstemci programı sunucudan bir dosya talebinde bulunduğunda, geri dönen teksti formatlıyor, formatlama aşamasında referans olarak işaret edilen dosya yollarını bir link ile değiştirip linki “tıklanabilir” yapıyor. Link, hedefteki dosyanın B makinasındaki tam yoluna işaret etmektedir. İstemci kullanıcısı linke tıkladığında, istemci, linkte saklı olan tam dosya yolunu sunucudan talep ediyor, talep sonunda bir tekst döndüğünde, istemci ekranını tazeleyip yeni teksti ekrana formatlı bir şekilde yapıştırıyor.
Şu hali ile, Smith'in geliştirmiş olduğu istemci ve sunucu programı size daha tanıdık geliyor olmalı. Artık, sunucu programı küçük bir HTTP sunucusu, istemci programı ise küçük bir internet gezginidir diyebiliriz. He ne kadar, programlar tam anlamı ile donanımlı olmasa bile, işleyiş mekanizmaları günümüzdeki muadilleri ile aynıdır.
CGI mekanizmasından bahsettik. CGI yardımı ile, HTTP sunucusu harici bir programı çalıştırıp, program çıktısını internet gezginine gönderebilmektedir.
İlk harici CGI programları derlenmiş C kodları idi ve bu çalıştırılabilir programlar cgi-bin dizininde saklanmakta idi. Bir süre C kodları ile CGI mekanızması uygulanır oldu. Ama C'nin bu şekilde kullanıcı uzun sürmedi. Yerini betik dilleri aldı. Çünkü C ile kod yazmak diğer dillere nazaran çok zordu, bunun yanında C'nin hazır veri yapıları(list, stack, hash ) mevcut değildi. Buna karşın, popüler bir betik dili olan Perl, bu yapılara sahipti. Dahası, kod yazımı C'ye nazaran çok kolaydı ve en güzel yanı C'deki gibi hafıza yönetim işlerini geliştiricinin kendisi yapmak zorunda değildi. Perl'ün bu avantajları, Cnin yerini almasını sağladı.
Bugün ise, durum biraz daha farklı, çok kullanılmamakla birlikte CGI mekanizması hala kullanımda. CGI'ın yerini web uygulamaları için geliştiriilmiş betik dilleri dilleri almış durumda. Örneğin: PHP, ASP.
Peki CGI'ın problemi ne idi de, PHP ve ASP onun yerini alabildi. CGI'ın bazı handikapları vardı. İnternet gezgini sunucudan her istemde bulunduğunda, HTTP sunucusu harici bir uygulama çalıştırmakta idi. Her bir uygulama, işletim sistemi için yeni hafıza alanı, yeni stack alanı ve yeni CPU izolasyonu demek idi. Her bir uygulamanın başlangıç düzeyinde çalışması için 100KB a ihtiyaç duyduğunu varsayarsak, istemci aynı anda 1000 talepte bulunduğunda Sunucunun 100MB lık hafıza alanı ayırması gerekecekti. Görüldüğü üzere bu kötü bir dizayndı. Her bir talepte sunucunun bu düzeyde hafıza ihtiyacı duyması büyük bir handikaptı. Ve tahmin edileceği üzere bu dizayndan vazgeçildi.
Ne şanski, CGI'ın tahtını elinden alan PHP ve ASP nin bu tür problemleri yoktu. Çünkü PHP ve ASPnin betik makinaları vardı ve bu makinalar Sunucuya gömülebiliyordu. Sunucuya yeni bir talep geldiğinde, sunucu yeni bir uygulama başlatmak zorunda değildi. Çünkü zaten gerekli uygulama olan PHP veya ASP betik makinaları sunucu uygulamasında çalışmakta idi. Yani PHP ve ASP betik makinaları sunucunun hafıza alanını, stack alanını kullanmakta ve CPU izolasyonu içinde yer almakta idi. Bu durum, her talepte sunucunun ayrı bir uygulama çalıştırma ihtiyacını ortadan kaldırıyordu. Bu durum CGI döneminin kapanmasına ve Betik dilleri döneminin açılmasına neden oldu.
Web teknolojilerindeki yenilikler burada son bulmadı. Betik dillerinin de dezavantajları vardı. Derlemesi yapılan dillerle karşılaştırıldığında, hafıza kullanımı ve CPU kullanımında yeterince iyi değillerdi. Dahası, doğasından kaynaklı, güvenlik açıklarına olanak sağlıyordu. Son olarak, nesne tabanlı değildiler ve yeniden kullanılabilirlik konusunda pek de başarılı değildiler.
Yıl 1997'ye geldiğinde, Sun MicroSystem bu bilinen problemlere çözüm olarak Servlet Teknolojisini tanıttı. Servlet teknolojisi ile betik dillerinin dezavantajları çözülmüş oldu. Servlet teknolojisi, nesne tabanlı kod yazımına olanak sağlıyordu, derlenebilen bir dile sahipti(Java), ve gelişkin güvenlik meknizmaları vardı. En önemlisi, HTTP protokolü üzerine sanki devamıymış gibi yerleşebiliyordu. Bu durum, geliştiricileri HTTP düzeyinde kod yazımından alıkoyuyor, yeniden kullanılabilir objeler geliştirebilmelerine olanak sağlıyordu. Özcesi, HTTP protokünü bir adım daha ileri götürüyordu.
Servlet Teknolojisinin bu özellikleri sayesinde, geliştiriciler kendi kütüphanelerini yazabilir duruma geldiler. Bu aşamanın bir ileri düzeyi ise framework'lerin doğuşu oldu. Ve en nihayetinde, geliştiriciler Servlet'i bir ileri seviyeye taşıyıp Struts adındaki ilk framework'ü anons ettiler.
Burdan sonrasını, sözü Struts geliştiricilerine verelim. Aşağıdaki alıntı http://struts.apache.org/1.x/userGuide/introduction.html adresinden alınmıştır.
Java Servlet teknolojisi icat edildiğinde, bir çok programcı bunun çok güzel bir şey olduğunu hemen fark etti. CGI mekanizması ile karşılaştırıldığında, daha hızlı ve daha güçlü idi, daha uyumlu ve geliştirilmeye açık idi.
Ama println() fonksiyonu ile sonu gelmez HTML çıktıları üretmek ve internet gezginine göndermek yorucu ve problemli idi. Cevap, Java kodları dışında çıktı üretimine olanak sağlayan JavaServerPage teknolojisi idi. Artık, geliştiriciler, HTML ve Java kodlarını iç-içe yazabiliyor, Servlet teknolojisinin imkanlarından sınırsızca yararlanabiliyordu. Tek sınır gökyüzü idi.
Kısa bir süre sonra Web Uygulamaları JSP-merkezli olmaya başladı. Bu yaklaşım kötü bir durum değildi, ama web uygulamasının iş akışına kötü etkileri vardı ve bu sıklanır bir durumdu.
Açıkçası, yeni bir paradigmaya ihtiyaç vardı...
Bir çok gelitirici JSP ve Servlet Web uygulamaları için beraber kullanılabilirdi. Servlet, web uygulamasının iş akışı kısmında, JSP ise HTML yazımında kirli işler için kullanılabilirdi. İleriki aşamalarda,JSP ve Servlet'i beraber kullanmak Model 2 olarak adlandırılmaya başlandı.(Sadece JSP kullanmak Model 1 olarak biliniyor.).
Tabii ki, Güneş altında yeni bir şey yoktur... ve çoğu kişi, JSP ve Sevlet'in Model2 yaklaşımının, Smalltalk MVC yapısının Model-View-Controller dizayn şablonundan miras alındığını işaret etti. Java Web geliştiricileri, şu anda Model 2 ve MVC paradigmasını aynı anlamda kullanmaya özen gösteriyor.
Apache Struts Projesi, Java toplumuna standart bir MVC altyapısı sağlamak için Craig R. McClanahan tarafından Mayıs 2000'de hayata geçirildi.
Haziran 2001'de versiyon 1.0 anons edildi ve alçak gönüllü bir tahmin ile Model 2 geliştirme süreci eskisi gibi olmayacak.
-halil agin.
Tags:
struts2
web teknolojileri tarihi
,
Comments:
1
Previous Page
- 1 / 1 -
Next Page