Eğitim Portalı/Spring Boot/Spring Boot Thymeleaf (Sunucu Tarafı Şablonlar)
Spring Boot03-spring-boot/41-thymeleaf

Spring Boot Thymeleaf (Sunucu Tarafı Şablonlar)

> ⚠️ Bu konuda çalıştırılabilir örnek yoktur. spring-boot-starter-thymeleaf bağımlılığı > gerektirir (portal classpath'inde yok); portalda çalışmaz. Kod tanıtım amaçlıdır.

Spring Boot Thymeleaf (Sunucu Tarafı Şablonlar)

⚠️ Bu konuda çalıştırılabilir örnek yoktur. spring-boot-starter-thymeleaf bağımlılığı gerektirir (portal classpath'inde yok); portalda çalışmaz. Kod tanıtım amaçlıdır.

Bir uygulama her zaman REST API (JSON) sunmaz; bazen sunucuda HTML üretip tarayıcıya tam sayfa göndermek istersin (klasik web uygulaması, yönetim paneli, e-posta şablonu). Thymeleaf, Spring Boot'un önerdiği modern şablon motorudur. JSP'nin (topic 66) yerini almıştır; en büyük avantajı "doğal şablon" (natural template) olmasıdır: şablonlar geçerli HTML'dir, tarayıcıda doğrudan açılabilir.

REST vs sunucu tarafı render

REST API (@RestController)Sunucu render (@Controller + Thymeleaf)
DöndürürJSON/veriTam HTML sayfa
ArayüzAyrı frontend (React/Vue) çizerSunucu çizer, tarayıcı gösterir
KullanımSPA, mobil, mikroservisKlasik web app, admin panel, e-posta

Bu eğitim portalının kendisi REST + React mimarisini kullanır (sunucu JSON döner, React çizer). Thymeleaf, "sunucu HTML üretsin" istediğin senaryolar içindir.

Kurulum ve temel akış

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
@Controller                          // @RestController DEĞİL — view adı döndürür
class UrunWebController {
    @GetMapping("/urunler")
    String urunler(Model model) {
        model.addAttribute("urunler", urunServisi.hepsi());  // şablona veri aktar
        return "urunler";            // -> templates/urunler.html
    }
}

@Controller metodu bir view adı ("urunler") döndürür; Spring bunu src/main/resources/templates/urunler.html ile eşler ve Model'deki verilerle render eder.

Thymeleaf söz dizimi

Şablon geçerli HTML'dir; th:* öznitelikleriyle dinamikleşir:

<!-- templates/urunler.html -->
<table>
  <tr th:each="u : ${urunler}">              <!-- döngü -->
    <td th:text="${u.ad}">Örnek Ad</td>      <!-- metin (tarayıcıda 'Örnek Ad' görünür, render'da gerçek) -->
    <td th:text="${u.fiyat} + ' TL'}">0 TL</td>
  </tr>
</table>

<p th:if="${urunler.isEmpty()}">Ürün yok.</p>   <!-- koşul -->
<a th:href="@{/urunler/{id}(id=${u.id})}">Detay</a>  <!-- URL üretimi -->
<div th:text="#{hosgeldin.mesaji}">...</div>     <!-- i18n mesajı (topic 18) -->
  • th:text: Elemanın içeriğini değiştir.
  • th:each: Döngü (liste → satırlar).
  • th:if / th:unless: Koşullu gösterim.
  • th:href / @{...}: Bağlam-farkında URL üretimi.
  • ${...} değişken, #{...} i18n mesajı, @{...} URL, *{...} form nesnesi.

Doğal şablon (natural template) avantajı

Thymeleaf şablonu geçerli HTML olduğundan, sunucu çalışmadan bile tarayıcıda açılır (th:text="${u.ad}">Örnek Ad'daki "Örnek Ad" tasarımcıya statik önizleme verir). Tasarımcı ve geliştirici aynı dosya üzerinde çalışabilir — JSP'nin (scriptlet/etiket karışıklığı) çözmediği bir sorun.

Form işleme

Thymeleaf, form binding ile güçlüdür: th:object + th:field ile form nesnesine iki yönlü bağ, BindingResult ile doğrulama hataları (th:errors) gösterilir — Spring MVC form akışıyla entegre.

Layout ve parçalar

Tekrarı önlemek için th:fragment ile ortak parçalar (header/footer) tanımlanır ve th:replace/th:insert ile sayfalara eklenir; Thymeleaf Layout Dialect ile şablon kalıtımı kurulur.

Özet

Thymeleaf'in Spring Boot'un sunucu tarafı HTML şablon motoru olduğunu (JSP'nin modern halefi); @Controller + Model + view-adı akışını, th:text/th:each/th:if/@{...} söz dizimini, "doğal şablon" avantajını ve form/layout yeteneklerini öğrendik; REST+SPA ile ne zaman ayrıldığını gördük. Sırada, güvenli iletişim: HTTPS etkinleştirme.