14 Haziran 2015 Pazar

Spring - Apache Tiles Entegrasyonu (Template Oluşturma)

Merhaba,
şuana kadarki yazılarımdaki örnekleri incelediğinizde işlemlerin tamamını  tek bir Jsp  sayfasında  yaptığımı göreceksiniz. Bu yazımda ise bir Jsp sayfası içerisine başka sayfalarında dahil edilmesi işleminden bahsedeceğim. Template oluşturma yapısından bahsediyorum(alttaki görüntü)

Aslında bütün web ve yazılım  projelerinde ortak kullanılan alanlar(Header,Footer,Menu) belirlenerek ilgili sayfada çağrılır. Bu şekilde her sayfada aynı kodların yazılmasının önüne geçilmiş olur. Esasında her sayfa için aynı kodları yazarak ta sonuca gidebilirsiniz ancak bakım,tutum ve yeni eklenecek özellikleri de(geliştirme) göz önünde bulundurursak bu yazımda anlatacağım yöntem ilginizi çekecektir diye düşünüyorum. Evet anahtar kelimeyi paylaşıyorum : Apache tiles (Döşeme)

Öncelikle bu yapıyı kullanmak için illede Apache Tiles kullanmak durumunda değilsiniz.
<jsp:include page="WEB-INF/common/header.jsp" /> 
 Şeklinde ki direktiflerle de ortak kullanılan kısımları tek sayfada toplayabilirsiniz.  Güzel ama daha  iyi bir yolu yok mu bu işin diye soracağınızı düşünerek sizlere Apache Tiles Kullanmanızı tavsiye ediyorum. Nasıl kullanacağız sorusuna cevaben  bu yazıda Spring ile entegre ederek bu işlemi gerçekleştireceğiz.

1-  Projemize intelliJ ile bir web projesi oluşturarak başlıyoruz.

2-  log4j yi  pom.xml'e  ekleyin.


<!-- Logging -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${org.slf4j-version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
</dependency>


3- tiles'ı  pom.xml e ekleyin
<!-- Tiles -->
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>${tiles-version}</version>
</dependency>



4- mvc-dispatcher-servlet.xml    üzerinden spring/apache-tiles bağlantısını yapın
<!-- Tiles configuration -->
<bean id="tilesConfigurer"
      class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/tiles/tiles-definitions.xml</value>
        </list>
    </property>
</bean>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
</bean>



5- tiles-definitions.xml  dosyasında layout yapısını tasarlıyoruz.
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
        "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
        "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>

    <definition name="singleLayout" template="/WEB-INF/template/singleLayout.jsp" />


    <definition name="mainLayout" template="/WEB-INF/template/mainLayout.jsp">
        <put-attribute name="header" value="/WEB-INF/template/fragments/header.jsp" />
        <put-attribute name="menu" value="/WEB-INF/template/fragments/menu.jsp" />
        <put-attribute name="footer" value="/WEB-INF/template/fragments/footer.jsp" />
    </definition>

</tiles-definitions>



burada singleLayout ve mainLayout diye iki tanım yaptım. Birinde sade bir sayfa yapısı olacak diğerinde üst menü ve footer bilgileri de gelecek.

Ben bu projede header ve footer alanlarına bootstrap kaynaklarını ekledim. Yavaş yavaş görsel tarafada ağırlık verelim istedim.

Sayfalarda yukarıda tanımladığımız layout-tiles çağrısı yapıldıktan sonra içerik sayfaya özgü olarak girilir.

örnek sayfa içeriği  aşağıdaki gibidir:
about.jsp:
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>

<tiles:insertDefinition name="mainLayout">
    <tiles:putAttribute name="body">


        <h1>About page !</h1>

        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
            magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
            commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
            nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
            anim id est laborum.</P>


    </tiles:putAttribute>
</tiles:insertDefinition>


AboutController.java
package com.company.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * Created by root on 6/14/15.
 */
@Controller
public class AboutController {

    private static final Logger logger = LoggerFactory.getLogger(AboutController.class);

    @RequestMapping(value = "/about", method = RequestMethod.GET)
    public ModelAndView about(){
        ModelAndView mv = new ModelAndView("about");
        return mv;
    }

}


NOT: log4j kütüphanesi apache tiles ın gereksinimlerinden biridir. projenize log4j yi dahil etmeniz gerekmektedir.

NOT2: Tiles versiyonları önemlidir. Burada ben tiles3 kullandım. Diğer versiyonlarda ki  ufak tefek farklılıklar başlangıç aşamasında  kafanızı karıştırabilir. ilk aşamada benimle aynı spring versiyonunu ve apache-tiles versiyonunu kullanmanızı tavsiye ediyorum

kaynak dosyalar(github) : indirmek için tıklayın

4 yorum:

  1. merhaba. anlatım için teşekkürler. ancak ben her şeyi uygulamama rağmen 404 hatası alıyorum. galiba controller class a istek hiç düşmüyor. Daha önce böyle bir hata ile karşılaştınız mı veya aklınıza gelen bir çözüm var mı?

    YanıtlaSil
  2. merhaba, kodunuzda aşağıdaki kısımları kontrol eder misiniz ?
    projede urlBasedViewResolver resolver tanımlı mı? evetse içinde Tiles tanımlaması da yapılmış mı ? (mvc-dispatcher-servlet.xml dsoyasından bahsediyorum).

    Spring ve Tiles versiyonları üstte paylaştığım projede ki gibimi?

    Bu kontrolleri yaptıktan sonra bir sonuca varamazsanız projeinizin loglarını yada yazdığınız kaynak kodu(özel değilse) paylaşın akşam inceleyip yardımcı olmaya çalışayım.

    YanıtlaSil
  3. Son olarak daha fazla yorumları doldurmadan Tiles dışında piyasada Spring mvc için sizin önerebileceğiniz başka template var mı?

    YanıtlaSil