Merhabalar arkadaşlar. Bu yazıda size Apache Tiles kütüphanesi hakkında bilgi vereceğim.
Başlamadan önce belirtmek isterim ki bu yazıyı yazarken http://websystique.com/springmvc/spring-4-mvc-apache-tiles-3-annotation-based-example/ adresinden faydalandım.
Apache Tiles Nedir?
Apache Tiles en sade tabiri ile bir yerleşim düzeni (layout) kütüphanesidir arkadaşlar. Eğer projeniz içerisinde sabit ve sade bir yerleşim düzeni kullanacaksanız Apache Tiles tam istediğiniz bir yerleşim düzeni olacaktır.
Örnek Uygulama
Şimdi Apache Tiles ile bir örnek uygulama yapalım. Bu uygulamanın kaynak kodlarına https://github.com/ilkgunel/ApacheTilesDemoProject adresinden erişebilirsiniz.
Öncelikle örneği yaptığımız uygulama Maven tabanlı bir Spring Boot projesi olacak ve Spring MVC ile beraber Apache Tiles kullanımını örnekleyeceğiz. İlk olarak tiles.xml dosyasına göz gezdirelim:
tiles.xml dosyası sizin yerleşim düzeninizi tanımladığınız bir dosya. tiles-definitions tag’i ile yerleşişim düzenine ait tanımlamalara başlıyoruz.
- definition tag’i ile sayfalarımızı tanımlama işlemini yapıyoruz. base-definition olarak tanımlanmış alan default yerleşim düzenini temsil eden alandır. definition tag’inin template özelliği içerisinde o sayfaya ait jsp dosyasının ataması yapılır. Burada da base-definition default yerleşim düzeninini temsil ettiğim için defaultLayout.jsp template özelliğine atandı. definition tag’inin içerisinde ise defaultLayout.jsp içerisinde insert’leri yapılmış alanları put-attribute tag’i jsp sayfalarına bağlıyoruz. Yani örneğin defaultLayout.jsp içerisinde insert edilmiş header diye bir alan var ve biz tiles.xml içerisinde de bu header alanına karşılık gelen sayfa defaultHeader.jsp’dir diyoruz. Aynı şekilde menu ve footer için de tanımlamalar yapılıyor.
- base-definition dışında tiles.xml içerisinde 3 adet daha tanım görüyoruz. Bunlar home, drivers ve contactus sayfaları için yapılmış tanımlamalar. Örneğin bir kullanıcı drivers sayfasına karşılık gelen path’e istekte bulundu. Bu durumda Apache Tiles drivers path’ine yapılan istek için drivers şeklinde bir tanım var mı diye XML dosyasına bakıyor ve eğer tanım varsa mevcut şablon içerisinde onu gösteriyor, eğer yoksa direk sayfanın kendisini ekrana yazdırıyor. Aynı durum home ve contactus sayfaları için de geçerli.
defaultLayout.jsp
defaultLayout.jsp dosyası içerisinde header’ımız, menu’müz, body’miz ve footer’ımız tanımlı. İşte bu dosya içerisinde az önce tiles.xml’de tanımı yapılmış alanlar insert ediliyor. Örneğin tiles.xml içerisinde base-definition ile tanımlı definition’da menu name’i ile defaultMenu.jsp alanı defaultLayout.jsp için kullanıma hazır hale gelmişti. Burada da tiles:insertAttribute name=”menu” ile defaultMenu.jsp dosyası defaultLayout.jsp dosyası içerisinde yerini almış oluyor. Aynı şekilde header ve footer alanları da ekli vaziyette.
Burada body özelliğine ayrıca değinmek gerekiyor. Projemizde sol taraftaki menü ile alt ve üst kısımlar sabit dururken body alanı yani içerik alanı değişecek. Bu durumda buraya farklı farklı alanlar gelecek. Bunun sağlanması da şu şekilde oluyor:
tiles.xml içerisinde 3 adet alan tanımlamıştık: home,drivers,contact. Kullanıcı bu alanlara istekte bulunduğunda Apache Tiles bakıyor ve eğer istekte bulunulan alan ben de tanımlı diyorsa o zaman definition içerisindeki name alanını alıp uygun şekilde kullanıyor. Burada örneğin kullanıcı drivers sayfasına karşılık gelen path’e istekte bulunduğunda Apache Tiles içerisinde tanımlı olduğu için ve put-attribute name=”body” denildiği için defaultLayout.jsp içerisindeki body insert’üne drivers.jsp alanı gelecektir. Yine aynı şekilde kullanıcı home sayfasına karşılık gelen path’e bir istekte bulunduğunda bu kez home.jsp defaultLayout.jsp’nin body alanı içerisine yerleşecektir. home, drivers, contact sayfalarına hangi jsp’lerin karşılık geleceği yani path tanımlamaları Spring MVC’nin controller’ı içerisinde tanımlanmaktadır.
AppController.java
AppController.java sınıfımız içerisinde hangi paht’e istekte bulunulursa hangi jsp dosyası devreye girsin bunun tanımı yapılıyor arkadaşlar. Eğer kullanıcı kök dizine yani / dizinine istekte bulunursa homePage metodu devreye girer ve “home” String’ini döndürür. Aynı şekilde /drivers dizinine bir istekte bulunulursa driversPage metodu devreye girer ve “drivers” String’i döndürülür. Az sonra göreceğimiz application.properties dosyası içinde yapılan tanım gereğince Controller içinde bir RequestMapping’i karşılayan metod’un döndürdüğü String’in sonuna jsp eklenir ve ilgili sayfa çağırılır.
Burada şimdi bir kez daha üstünden geçelim. Yukarıdaki tanıma göre kullanıcı kök dizine istekte bulunduğunda home.jsp dosyası döndürülür. Bu döndürme işlemi sırasında Apache Tiles devreye girer ve kendisinde “home” şeklinde bir tanım olup olmadığına bakar. home tanımı olduğu için ilgili yerleşim düzenine göre home.jsp’yi ekrana basar.
Şimdi Apache Tiles’ın proje içerisinde kayda geçirilmesinden bahsedelim.
AppConfig.java
AppConfig.java sınıfı içerisinde öncelikle tiles.xml dosyasının devreye alınabilmesi için @Bean notasyonu ile işaretli olan ve TilesConfigurer tipinde bir nesne döndüren metot yazıyoruz. @Bean notasyonu Spring context’ine bir bean kaydeder. Biz burada minimum seviyede XML kullandığımız için notasyon ile bean tanımladık.
tilesConfigurer metodu içinde bir TilesConfigurer nesnesi oluşturup setDefinitions metodunu bu nesne üzerinden çağırarak metouda tiles.xml dosyasını parametre olarak veriyoruz. setCheckRefresh metodu da değişiklikleri algılaması için yazılan bir metot ve true parametresi geçirilerek değişiklikleri çabuk algılaması söyleniyor. Döndürülen tilesConfigurer nesnesi spring’in context’ine kayıt oluyor ve Apache Tiles kullanıma hazır hale geliyor. Bu işlemin yanında bir viewResolver kaydedilmesine ve bir de static dosyaların yer aldığı yerin tanımlanması gerekir. configureViewResolvers metoud içerisinde sadece bir TilesViewResolver nesnesi oluşturup onu registry.viewResolver şeklinde kayıt etmemiz yeterlidir. addResourceHandlers metodu içerisinde resim gibi, css dosyaları gibi static dosyaların yerl aldığı kısmı kayda geçiriyoruz.
SpringBootClass.java
SpringBootClass sınıfı Spring Boot projelerini başlatmak için kullanılan bir sınıf. Burada dikkat edilmesi gereken noktalar
- Bu sınıf @SpringBootApplication notasyonu ile işaretli olmalı
- @ComponentScan notasyonu ile AppConfig ve AppController sınıflarının yer aldığı paketlerde de tarama işlemi yapılsın denilmeli.
- Klasik java’daki gibi içeride yer alan bir metodu SpringApplication.run(SpringBootClass.class, args); şeklindeki satırdaki gibi run metoduna kendi class’ını parametre olarak geçirmeli.
Demo, Ekran Görüntüleri
Şimdi SpringBootClass sınıfına sağ tıklayıp Run As -> Java Application diyelim ve konsolda Tomcat started yazısını gördükten sonra localhost:8080/ApacheTilesDemoProject/ adresine gidelim.
Adrese gittiğimizde bizi şu şekilde bir ekran karşılıyor:
Şimdi ben sol menüdeki Drivers’a tıklıyorum.
Gördüğünüz gibi içerik kısmı değişirken ekranın geri kalanı sabit kaldı, yani yerleşim düzenine uygun hareket etti. Şimdi Contact Us’a tıklıyorum.
Orada da düzene bir zarar vermeden işleyiş hakim.
Bu yazıda anlatacaklarım da bu kadar arkadaşlar. Apache Tiles kullanımı hakkında en azından temel bir bilgi verebildiğimi düşünüyorum. Başka yazıda görüşenece kadar sağlıcakla kalın.
Selam ve Sevgilerimle