<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Thymeleaf Archive | INOTEQ GmbH</title>
	<atom:link href="https://www.inoteq.com/tag/thymeleaf/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.inoteq.com/tag/thymeleaf/</link>
	<description>IT Unternehmensberatung, Software Entwicklung, IT Infrastruktur aus Karlsruhe</description>
	<lastBuildDate>Fri, 09 Feb 2024 10:51:44 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.5</generator>

<image>
	<url>https://www.inoteq.com/wp-content/uploads/2019/12/cropped-Inoteq_Logo_trans_icon-1-32x32.png</url>
	<title>Thymeleaf Archive | INOTEQ GmbH</title>
	<link>https://www.inoteq.com/tag/thymeleaf/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Entwicklung einer Spring Boot-Anwendung mit Thymeleaf und Tailwind CSS</title>
		<link>https://www.inoteq.com/2023/12/15/entwicklung-einer-spring-boot-anwendung-mit-thymeleaf-und-tailwind-css/</link>
					<comments>https://www.inoteq.com/2023/12/15/entwicklung-einer-spring-boot-anwendung-mit-thymeleaf-und-tailwind-css/#respond</comments>
		
		<dc:creator><![CDATA[Alexander Kusmin]]></dc:creator>
		<pubDate>Fri, 15 Dec 2023 09:47:55 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tailwind CSS]]></category>
		<category><![CDATA[Thymeleaf]]></category>
		<guid isPermaLink="false">https://www.inoteq.com/?p=1918</guid>

					<description><![CDATA[<p>Moderne Webentwicklung erfordert nicht nur eine robuste Backend-Infrastruktur, sondern auch leistungsstarke Werkzeuge für die Gestaltung ansprechender Benutzeroberflächen. Dieser Beitrag enthält eine Schritt-für-Schritt-Anleitung zur Entwicklung einer Web-Anwendung mit Spring Boot mit Thymeleaf und Tailwind CSS via Gradle-Node-Plugin. Diese Kombination ermöglicht die Implementierung dynamischer Inhalte sowie die Erstellung responsiver und modernen Benutzeroberflächen. Inhaltsverzeichnis Setup von Spring Boot Es [&#8230;]</p>
<p>Der Beitrag <a href="https://www.inoteq.com/2023/12/15/entwicklung-einer-spring-boot-anwendung-mit-thymeleaf-und-tailwind-css/">Entwicklung einer Spring Boot-Anwendung mit Thymeleaf und Tailwind CSS</a> erschien zuerst auf <a href="https://www.inoteq.com">INOTEQ GmbH</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="1918" class="elementor elementor-1918" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-f66b86b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="f66b86b" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8621065" data-id="8621065" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-1519bd7 elementor-widget elementor-widget-spacer" data-id="1519bd7" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-4077a37 elementor-widget elementor-widget-html" data-id="4077a37" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<!-- Only for Code Snippet Styles -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/themes/prism-coy.min.css" integrity="sha256-VcuSs+n31yebPlEcehu6PvnidJ808ScFBsK8+tJKX+Q=" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/components/prism-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.20.0/plugins/autoloader/prism-autoloader.min.js"></script>
<style>
    :not(pre) > code[class*=language-].inline {
        padding: 0 0.2rem;
        color: #000;
    }
</style>		</div>
				</div>
				<div class="elementor-element elementor-element-364bd83 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading" data-id="364bd83" data-element_type="widget" data-widget_type="theme-post-title.default">
				<div class="elementor-widget-container">
			<h1 class="elementor-heading-title elementor-size-default">Entwicklung einer Spring Boot-Anwendung mit Thymeleaf und Tailwind CSS</h1>		</div>
				</div>
				<div class="elementor-element elementor-element-ee9bfad elementor-widget elementor-widget-post-info" data-id="ee9bfad" data-element_type="widget" data-widget_type="post-info.default">
				<div class="elementor-widget-container">
					<ul class="elementor-inline-items elementor-icon-list-items elementor-post-info">
								<li class="elementor-icon-list-item elementor-repeater-item-251e497 elementor-inline-item" itemprop="datePublished">
						<a href="https://www.inoteq.com/2023/12/15/">
											<span class="elementor-icon-list-icon">
								<i aria-hidden="true" class="fas fa-calendar"></i>							</span>
									<span class="elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-date">
										Dezember 15, 2023					</span>
									</a>
				</li>
				<li class="elementor-icon-list-item elementor-repeater-item-7b70c4e elementor-inline-item" itemprop="author">
						<a href="https://www.inoteq.com/author/akusmin/">
											<span class="elementor-icon-list-icon">
								<i aria-hidden="true" class="far fa-user-circle"></i>							</span>
									<span class="elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-author">
										Alexander Kusmin					</span>
									</a>
				</li>
				<li class="elementor-icon-list-item elementor-repeater-item-42532e0 elementor-inline-item" itemprop="about">
										<span class="elementor-icon-list-icon">
								<i aria-hidden="true" class="fas fa-tags"></i>							</span>
									<span class="elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-terms">
										<span class="elementor-post-info__terms-list">
				<a href="https://www.inoteq.com/tag/spring/" class="elementor-post-info__terms-list-item">Spring</a>, <a href="https://www.inoteq.com/tag/tailwind-css/" class="elementor-post-info__terms-list-item">Tailwind CSS</a>, <a href="https://www.inoteq.com/tag/thymeleaf/" class="elementor-post-info__terms-list-item">Thymeleaf</a>				</span>
					</span>
								</li>
				</ul>
				</div>
				</div>
				<div class="elementor-element elementor-element-f0d808c elementor-widget elementor-widget-text-editor" data-id="f0d808c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Moderne Webentwicklung erfordert nicht nur eine robuste Backend-Infrastruktur, sondern auch leistungsstarke Werkzeuge für die Gestaltung ansprechender Benutzeroberflächen. Dieser Beitrag enthält eine Schritt-für-Schritt-Anleitung zur Entwicklung einer Web-Anwendung mit Spring Boot mit <a href="https://www.thymeleaf.org/">Thymeleaf</a> und <a href="https://tailwindcss.com/">Tailwind CSS</a> via <span style="color: var( --e-global-color-text ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight );"><a href="https://github.com/node-gradle/gradle-node-plugin">Gradle-Node-Plugin</a></span><span style="color: var( --e-global-color-text ); font-family: var( --e-global-typography-text-font-family ), Sans-serif; font-weight: var( --e-global-typography-text-font-weight );">. Diese Kombination ermöglicht die Implementierung dynamischer Inhalte sowie die Erstellung responsiver und modernen Benutzeroberflächen.</span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-f60e6cf elementor-widget elementor-widget-theme-post-featured-image elementor-widget-image" data-id="f60e6cf" data-element_type="widget" data-widget_type="theme-post-featured-image.default">
				<div class="elementor-widget-container">
										<figure class="wp-caption">
										<img fetchpriority="high" decoding="async" width="2000" height="1200" src="https://www.inoteq.com/wp-content/uploads/2023/11/wp2.png" class="attachment-full size-full wp-image-2921" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2023/11/wp2.png 2000w, https://www.inoteq.com/wp-content/uploads/2023/11/wp2-300x180.png 300w, https://www.inoteq.com/wp-content/uploads/2023/11/wp2-1024x614.png 1024w, https://www.inoteq.com/wp-content/uploads/2023/11/wp2-768x461.png 768w, https://www.inoteq.com/wp-content/uploads/2023/11/wp2-1536x922.png 1536w" sizes="(max-width: 2000px) 100vw, 2000px" />											<figcaption class="widget-image-caption wp-caption-text">KI generiertes Symbolbild: compelling, light-hearted tone, illustration, logo-style, thymeleaf being painted, symbolizing tailwindcss design</figcaption>
										</figure>
							</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-922a717 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="922a717" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5858cc2" data-id="5858cc2" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-6ac10c4 elementor-toc--minimized-on-desktop elementor-widget elementor-widget-table-of-contents" data-id="6ac10c4" data-element_type="widget" data-settings="{&quot;exclude_headings_by_selector&quot;:&quot;.exclude-from-toc&quot;,&quot;minimized_on&quot;:&quot;desktop&quot;,&quot;headings_by_tags&quot;:[&quot;h2&quot;,&quot;h3&quot;,&quot;h4&quot;,&quot;h5&quot;,&quot;h6&quot;],&quot;marker_view&quot;:&quot;numbers&quot;,&quot;minimize_box&quot;:&quot;yes&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}" data-widget_type="table-of-contents.default">
				<div class="elementor-widget-container">
					<div class="elementor-toc__header">
			<h4 class="elementor-toc__header-title">
				Inhaltsverzeichnis			</h4>
							<div class="elementor-toc__toggle-button elementor-toc__toggle-button--expand" role="button" tabindex="0" aria-controls="elementor-toc__6ac10c4" aria-expanded="true" aria-label="Open table of contents"><i aria-hidden="true" class="fas fa-chevron-down"></i></div>
				<div class="elementor-toc__toggle-button elementor-toc__toggle-button--collapse" role="button" tabindex="0" aria-controls="elementor-toc__6ac10c4" aria-expanded="true" aria-label="Close table of contents"><i aria-hidden="true" class="fas fa-chevron-up"></i></div>
					</div>
		<div id="elementor-toc__6ac10c4" class="elementor-toc__body">
			<div class="elementor-toc__spinner-container">
				<i class="elementor-toc__spinner eicon-animation-spin eicon-loading" aria-hidden="true"></i>			</div>
		</div>
				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-9099f1f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="9099f1f" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6b9b81a" data-id="6b9b81a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-3b727c9 elementor-widget elementor-widget-spacer" data-id="3b727c9" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-1c3df64 elementor-widget elementor-widget-heading" data-id="1c3df64" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Setup von Spring Boot</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-1ac048f elementor-widget elementor-widget-text-editor" data-id="1ac048f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							Es wird eine Spring Boot Anwendung mit folgender Konfiguration benötigt:
<ul>
 	<li>Spring Boot Version 3.2.0</li>
 	<li>Kotlin als Programmiersprache für Spring</li>
 	<li>Kotlin (Groovy) für das Build-Tool</li>
 	<li>Abhängigkeit <a href="https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web/3.2.0" target="_blank" rel="noopener">Spring Web v3.2.0</a></li>
</ul>
Diese Konfiguration kann <a href="https://start.spring.io/#!type=gradle-project&amp;language=kotlin&amp;platformVersion=3.2.1&amp;packaging=jar&amp;jvmVersion=21&amp;groupId=com.example&amp;artifactId=demo&amp;name=demo&amp;description=Demo%20project%20for%20Spring%20Boot&amp;packageName=com.example.demo&amp;dependencies=web" target="_blank" rel="noopener">hier über den Spring Initializr</a> direkt heruntergeladen werden.

Mit dem Befehl <code class="language-bash inline">./gradlew bootRun</code> wird die Anwendung gestartet und anschließend unter der Adresse <a href="http://localhost:8080" target="_blank" rel="noopener">http://localhost:8080</a> erreichbar.						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-05d6dc3 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="05d6dc3" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9bf3151" data-id="9bf3151" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-7d05a52 elementor-widget elementor-widget-spacer" data-id="7d05a52" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-6211f0b elementor-widget elementor-widget-heading" data-id="6211f0b" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Integration von Thymeleaf</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-0a15ec7 elementor-widget elementor-widget-text-editor" data-id="0a15ec7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<a href="https://www.thymeleaf.org/">Thymeleaf</a> ist eine leistungsfähige Template-Engine für die Webentwicklung und ermöglicht die Integration dynamischer Inhalte in Seiten.

In der Datei <strong><i>build.gradle</i></strong> wird die Thymeleaf-Abhängigkeit eingebunden:						</div>
				</div>
				<div class="elementor-element elementor-element-8e27b30 elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="8e27b30" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-1491" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1491" aria-expanded="false">./build.gradle</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1491" aria-expanded="false">./build.gradle</div>
					<div id="elementor-tab-content-1491" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-1491" tabindex="0" hidden="false"><pre><code class="“language-groovy”">...
dependencies {
    ...

    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.0'
}
...</code></pre></div>
							</div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-0e46026 elementor-widget elementor-widget-heading" data-id="0e46026" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Thymeleaf-Templates</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-85bc578 elementor-widget elementor-widget-text-editor" data-id="85bc578" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							Zu Beginn wird im Ressourcenverzeichnis ein neues Thymeleaf-Template <em><strong>src/main/resources/templates/index.html</strong></em> erstellt. Dieses Template zeigt einen Text als Überschrift an, der mithilfe von Thymeleaf aus den Ressourcen geladen wird. Dazu legen wir im Ressourcenverzeichnis eine Datei <em><strong>src/main/resources/messages.properties</strong></em> an, in der die Texte definiert werden. An sich mag dies für unser Beispiel etwas umständlich sein, jedoch ermöglicht dieser Ansatz später eine einfachere Übersetzung der Anwendung, indem der Inhalt der <em><strong>messages.properties</strong></em> pro Sprache vorliegt.						</div>
				</div>
				<div class="elementor-element elementor-element-cdae251 elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="cdae251" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-2151" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-2151" aria-expanded="false">index.html</div>
									<div id="elementor-tab-title-2152" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="2" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2152" aria-expanded="false">messages.properties</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-2151" aria-expanded="false">index.html</div>
					<div id="elementor-tab-content-2151" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-2151" tabindex="0" hidden="false"><pre><code class="“language-html”">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Index&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1 th:text="#{myIndexText}"&gt;ignored&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="2" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2152" aria-expanded="false">messages.properties</div>
					<div id="elementor-tab-content-2152" class="elementor-tab-content elementor-clearfix" data-tab="2" role="tabpanel" aria-labelledby="elementor-tab-title-2152" tabindex="0" hidden="hidden"><pre><code class="“language-properties”">myIndexText=This is index!</code></pre></div>
							</div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-32f0f89 elementor-widget elementor-widget-text-editor" data-id="32f0f89" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							Mit <code class="language-plain inline">th:</code> werden Thymeleaf-Anweisungen eingeleitet. In diesem Fall wird Thymeleaf angewiesen, den Text-Inhalt für das Element zu definieren. Mit <code class="language-plain inline">#{...}</code> werden Ressourcen über einen eindeutigen Schlüssel angefordert, hier der Text <code class="language-plain inline">This is index</code> mit dem Schlüssel <code  class="language-plain inline">myIndexText</code> aus der zuvor definierten <em><strong>messages.properties</strong></em>.

Auf der <a href="https://www.thymeleaf.org/documentation.html" target="_blank" rel="noopener">offiziellen Seite von Thymeleaf</a> sind alle Funktionen ausführlich und mit vielen Beispielen dokumentiert.						</div>
				</div>
				<div class="elementor-element elementor-element-c4eeac8 elementor-widget elementor-widget-heading" data-id="c4eeac8" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Spring Boot Controller</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-95cca38 elementor-widget elementor-widget-text-editor" data-id="95cca38" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Damit die Spring Boot Anwendung auch die Seite anzeigt, muss ein Controller erstellt werden, welcher das Template für den Endpunkt rendert.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a785e3e elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="a785e3e" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-1751" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1751" aria-expanded="false">./src/main/.../DemoController.kt</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1751" aria-expanded="false">./src/main/.../DemoController.kt</div>
					<div id="elementor-tab-content-1751" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-1751" tabindex="0" hidden="false"><pre><code class="“language-kotlin”">package com.example.demo

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping

@Controller
@RequestMapping
class DemoController {
    @GetMapping("/")
    fun myIndexEndpoint(model: Model): String {
        return "index"
    }
}
</code></pre></div>
							</div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-6ed8b84 elementor-widget elementor-widget-image" data-id="6ed8b84" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
										<figure class="wp-caption">
										<img decoding="async" width="768" height="373" src="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.17.41-2-1752x2048-1-768x373.png" class="attachment-medium_large size-medium_large wp-image-2631" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.17.41-2-1752x2048-1-768x373.png 768w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.17.41-2-1752x2048-1-300x146.png 300w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.17.41-2-1752x2048-1-1024x497.png 1024w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.17.41-2-1752x2048-1-1536x745.png 1536w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.17.41-2-1752x2048-1.png 1752w" sizes="(max-width: 768px) 100vw, 768px" />											<figcaption class="widget-image-caption wp-caption-text">Index-Seite auf http://localhost:8080</figcaption>
										</figure>
							</div>
				</div>
				<div class="elementor-element elementor-element-b48932f elementor-widget elementor-widget-heading" data-id="b48932f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Erweiterung des Beispiels mit weiteren Thymeleaf Funktionen</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-c1e23e8 elementor-widget elementor-widget-text-editor" data-id="c1e23e8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							Die Seite unter <a href="http://localhost:8080" target="_blank" rel="noopener">http://localhost:8080</a> wird nun wie folgt erweitert:
<ul>
 	<li>Dem Template wird eine Liste von Strings übergeben. Diese Strings stellen weitere Endpunkte namens <code class="language-plain inline">/foo</code>, <code class="language-plain inline">/bar</code> und <code class="language-plain inline">/baz</code> dar.</li>
 	<li>Der bisherige Controller wird für die weiteren Endpunkte entsprechend erweitert.</li>
 	<li>Die Endpunkte zeigen wie zuvor die Index-Seite nur einen Text an. Es werden dafür Templates erstellt.</li>
 	<li>Das aktuelle Index-Template verweist auf diese Endpunkte mit einer Navigation.</li>
</ul>						</div>
				</div>
				<div class="elementor-element elementor-element-1935e38 elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="1935e38" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-2641" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-2641" aria-expanded="false">DemoController.kt</div>
									<div id="elementor-tab-title-2642" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="2" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2642" aria-expanded="false">messages.properties</div>
									<div id="elementor-tab-title-2643" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="3" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2643" aria-expanded="false">index.html</div>
									<div id="elementor-tab-title-2644" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="4" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2644" aria-expanded="false">foo.html</div>
									<div id="elementor-tab-title-2645" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="5" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2645" aria-expanded="false">bar.html</div>
									<div id="elementor-tab-title-2646" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="6" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2646" aria-expanded="false">baz.html</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-2641" aria-expanded="false">DemoController.kt</div>
					<div id="elementor-tab-content-2641" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-2641" tabindex="0" hidden="false"><pre><code class="“language-kotlin”">...
@Controller
@RequestMapping
class DemoController {
    @GetMapping("/")
    fun myIndexEndpoint(model: Model): String {
        model.addAttribute("myEndpoints", listOf("foo", "bar", "baz"))
        return "index"
    }

    @GetMapping("/foo")
    fun fooEndpoint(): String = "foo"

    @GetMapping("/bar")
    fun barEndpoint(): String = "bar"

    @GetMapping("/baz")
    fun bazEndpoint(): String = "baz"
}
</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="2" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2642" aria-expanded="false">messages.properties</div>
					<div id="elementor-tab-content-2642" class="elementor-tab-content elementor-clearfix" data-tab="2" role="tabpanel" aria-labelledby="elementor-tab-title-2642" tabindex="0" hidden="hidden"><pre><code class=“language-properties”>myIndexText=This is index!
myNavigateText=Navigate to {0}
myFooText=This is foo!
myBarText=This is bar!
myBazText=This is baz!
</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="3" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2643" aria-expanded="false">index.html</div>
					<div id="elementor-tab-content-2643" class="elementor-tab-content elementor-clearfix" data-tab="3" role="tabpanel" aria-labelledby="elementor-tab-title-2643" tabindex="0" hidden="hidden"><pre><code class="“language-html”">...
&lt;body&gt;
...
&lt;nav&gt;
    &lt;a th:each="endpoint: ${myEndpoints}"
       th:text="#{myNavigateText(${endpoint})}"
       th:href="@{/{endpoint}(endpoint=${endpoint})}"&gt;ignored&lt;/a&gt;
&lt;/nav&gt;
&lt;/body&gt;
...
</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="4" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2644" aria-expanded="false">foo.html</div>
					<div id="elementor-tab-content-2644" class="elementor-tab-content elementor-clearfix" data-tab="4" role="tabpanel" aria-labelledby="elementor-tab-title-2644" tabindex="0" hidden="hidden"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Foo&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1 th:text="#{myFooText}"&gt;ignored&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="5" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2645" aria-expanded="false">bar.html</div>
					<div id="elementor-tab-content-2645" class="elementor-tab-content elementor-clearfix" data-tab="5" role="tabpanel" aria-labelledby="elementor-tab-title-2645" tabindex="0" hidden="hidden"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Bar&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1 th:text="#{myBarText}"&gt;ignored&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="6" role="tab" tabindex="-1" aria-controls="elementor-tab-content-2646" aria-expanded="false">baz.html</div>
					<div id="elementor-tab-content-2646" class="elementor-tab-content elementor-clearfix" data-tab="6" role="tabpanel" aria-labelledby="elementor-tab-title-2646" tabindex="0" hidden="hidden"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Baz&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1 th:text="#{myBazText}"&gt;ignored&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>
							</div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-763986f elementor-widget elementor-widget-text-editor" data-id="763986f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Unsere Anwendung sieht nun folgendermaßen aus:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-cdf0ee7 elementor-widget elementor-widget-image-carousel" data-id="cdf0ee7" data-element_type="widget" data-settings="{&quot;slides_to_show&quot;:&quot;2&quot;,&quot;autoplay&quot;:&quot;no&quot;,&quot;infinite&quot;:&quot;no&quot;,&quot;slides_to_scroll&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;none&quot;,&quot;speed&quot;:500}" data-widget_type="image-carousel.default">
				<div class="elementor-widget-container">
					<div class="elementor-image-carousel-wrapper swiper-container" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="polite">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 von 2"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.17.41-768x391.png" alt="Index-Seite auf http://localhost:8080" /><figcaption class="elementor-image-carousel-caption">Index-Seite auf http://localhost:8080</figcaption></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 von 2"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.18.36-1-768x391.png" alt="Seite &quot;foo&quot; auf http://localhost:8080/foo, Seite &quot;bar&quot; und &quot;baz&quot; analog dazu" /><figcaption class="elementor-image-carousel-caption">Seite "foo" auf http://localhost:8080/foo, Seite "bar" und "baz" analog dazu</figcaption></figure></div>			</div>
							
									</div>
				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-0035aa9 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="0035aa9" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bd27b30" data-id="bd27b30" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-c60ab59 elementor-widget elementor-widget-spacer" data-id="c60ab59" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-2c14b80 elementor-widget elementor-widget-heading" data-id="2c14b80" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Styling mittels Tailwind CSS</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-a8e32e4 elementor-widget elementor-widget-text-editor" data-id="a8e32e4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Die Integration von Tailwind CSS in die Spring Boot Anwendung bietet eine flexible und leistungsstarke Styling-Option für das Frontend. Dieses Kapitel beschreibt die Integration und Verwendung von Tailwind CSS.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-13810a2 elementor-widget elementor-widget-heading" data-id="13810a2" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Verwendung des Gradle Plugin für Node und Konfiguration von Tailwind CSS<span style="color: var( --e-global-color-primary ); font-family: var( --e-global-typography-primary-font-family ), Sans-serif; font-size: 1.75rem; font-weight: var( --e-global-typography-primary-font-weight );"></span><br></h3>		</div>
				</div>
				<div class="elementor-element elementor-element-0f1455e elementor-widget elementor-widget-text-editor" data-id="0f1455e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							Für die Integration von Tailwind CSS in die Spring Boot Anwendung wird das <a href="https://github.com/node-gradle/gradle-node-plugin">Gradle Node Plugin</a> verwendet. Dies ermöglicht eine Verwaltung der Node.js-Abhängigkeiten wie z.B. <a href="https://tailwindcss.com/">Tailwind CSS</a> direkt aus Gradle heraus.

Um das Plugin in das Projekt einzubinden, muss die Gradle-Konfiguration folgendermaßen angepasst werden:
<ul>
 	<li>Wir fügen das Plugin <code class="language-plain inline">gradle-node-plugin</code> hinzu.</li>
 	<li>Es wird ein neuer Gradle-Task registriert, die den Tailwind CSS zur Generierung der <em><strong>output.css</strong></em> ausführt.</li>
 	<li>Die Gradle-Task <code class="language-plain inline">npmInstall</code> wird so angepasst, dass npm die benötigten Pakete selbständig installiert.</li>
 	<li>Die Gradle-Task für die Kompilierung mit Kotlin wird so angepasst, dass Tailwind CSS immer vor der Kompilierung ausgeführt wird.</li>
</ul>
Zusätzlich müssen die beiden Dateien <em><strong>tailwind.config.js</strong></em> und <em><strong>package.json</strong></em> entsprechend angelegt werden.						</div>
				</div>
				<div class="elementor-element elementor-element-79ffe51 elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="79ffe51" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-1271" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1271" aria-expanded="false">build.gradle</div>
									<div id="elementor-tab-title-1272" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="2" role="tab" tabindex="-1" aria-controls="elementor-tab-content-1272" aria-expanded="false">tailwind.config.js</div>
									<div id="elementor-tab-title-1273" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="3" role="tab" tabindex="-1" aria-controls="elementor-tab-content-1273" aria-expanded="false">package.json</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1271" aria-expanded="false">build.gradle</div>
					<div id="elementor-tab-content-1271" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-1271" tabindex="0" hidden="false"><pre><code class="“language-groovy”">...
plugins {
    ...
    // Gradle plugin for Node
    id 'com.github.node-gradle.node' version '7.0.1'
}
...
// Necessary for node-gradle plugin
node {
    download = true
}

// This task will run `tailwindcss` command and generate the output.css file from styles.css
tasks.register('tailwind', NpxTask) {
    command = 'tailwindcss'
    args = ['-i', './src/main/resources/static/styles.css', '-o', './src/main/resources/static/output.css']

    // This task depends on npmInstall task
    dependsOn(tasks.npmInstall)
}

// Make npmInstall task depend on npmSetup task and adds package.json as input
tasks.npmInstall {
    inputs.file('package.json')
    dependsOn(tasks.npmSetup)
}

tasks.withType(KotlinCompile).configureEach {
    ...
    // Update the output.css file every time after compiling Kotlin code
    dependsOn(tasks.tailwind)
}
...
</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="2" role="tab" tabindex="-1" aria-controls="elementor-tab-content-1272" aria-expanded="false">tailwind.config.js</div>
					<div id="elementor-tab-content-1272" class="elementor-tab-content elementor-clearfix" data-tab="2" role="tabpanel" aria-labelledby="elementor-tab-title-1272" tabindex="0" hidden="hidden"><pre><code class="“language-js”">/** @type {import('tailwindcss').Config} */
module.exports = {
    content: ["./src/**/*.{html,js}"],
}</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="3" role="tab" tabindex="-1" aria-controls="elementor-tab-content-1273" aria-expanded="false">package.json</div>
					<div id="elementor-tab-content-1273" class="elementor-tab-content elementor-clearfix" data-tab="3" role="tabpanel" aria-labelledby="elementor-tab-title-1273" tabindex="0" hidden="hidden"><pre><code class="“language-json”">{
  "devDependencies": {
    "@tailwindcss/forms": "^0.5.7",
    "tailwindcss": "^3.3.6"
  }
}</code></pre></div>
							</div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-7b6cfc5 elementor-widget elementor-widget-text-editor" data-id="7b6cfc5" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							Der Gradle-Befehl <code class="language-bash inline">./gradlew tailwind</code> ist nun ausführbar und sollte bei korrekter Konfiguration folgende Ausgabe erzeugen:						</div>
				</div>
				<div class="elementor-element elementor-element-7a2e21c elementor-widget elementor-widget-image" data-id="7a2e21c" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
										<figure class="wp-caption">
										<img decoding="async" width="768" height="356" src="https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.28.01-768x356.png" class="attachment-medium_large size-medium_large wp-image-2637" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.28.01-768x356.png 768w, https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.28.01-300x139.png 300w, https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.28.01-1024x475.png 1024w, https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.28.01-1536x713.png 1536w, https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.28.01.png 2026w" sizes="(max-width: 768px) 100vw, 768px" />											<figcaption class="widget-image-caption wp-caption-text">Ausgabe der Gradle-Task für Tailwind</figcaption>
										</figure>
							</div>
				</div>
				<div class="elementor-element elementor-element-d8419a9 elementor-widget elementor-widget-heading" data-id="d8419a9" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Verwendung von Tailwind CSS</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-8d940f7 elementor-widget elementor-widget-text-editor" data-id="8d940f7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							Unser Beispiel wird nun mit Hilfe von Tailwind CSS erweitert. Dazu können die Tailwind CSS Klassen direkt im Template verwendet oder in der <em><b>styles.css</b></em> unter <strong><i>src/main/resources/static</i></strong> gesammelt werden. Die dort enthaltenen Klassen werden dann von Tailwind CSS in <em><b>output.css</b></em> gebündelt. Für dieses Beispiel wird auch die einfache Unterstützung von Responsive Design durch Tailwind CSS genutzt. So soll die Index-Seite auf einem kleineren Bildschirm die Menüpunkte zeilenweise auflisten, ansonsten spaltenweise. Wichtig ist, dass die <strong><em>output.css</em></strong> in den Thymeleaf-Templates korrekt verlinkt wird.						</div>
				</div>
				<div class="elementor-element elementor-element-a951778 elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="a951778" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-1771" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1771" aria-expanded="false">styles.css</div>
									<div id="elementor-tab-title-1772" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="false" data-tab="2" role="tab" tabindex="-1" aria-controls="elementor-tab-content-1772" aria-expanded="false">index.html</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1771" aria-expanded="false">styles.css</div>
					<div id="elementor-tab-content-1771" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-1771" tabindex="0" hidden="false"><pre><code class=“language-css”>@tailwind base;
@tailwind components;
@tailwind utilities;

body {
    @apply bg-gray-200 w-full p-4 flex flex-col gap-4 items-center justify-center;
}

.headline {
    @apply text-4xl font-extrabold leading-none tracking-tight;
}

.headline-white {
    @apply text-white;
}

.btn {
    @apply font-bold py-2 px-4 rounded;
}
.btn-blue {
    @apply bg-blue-500 text-white;
}
.btn-blue:hover {
    @apply bg-blue-700;
}
</code></pre></div>
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="false" data-tab="2" role="tab" tabindex="-1" aria-controls="elementor-tab-content-1772" aria-expanded="false">index.html</div>
					<div id="elementor-tab-content-1772" class="elementor-tab-content elementor-clearfix" data-tab="2" role="tabpanel" aria-labelledby="elementor-tab-title-1772" tabindex="0" hidden="hidden"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;Index&lt;/title&gt;
    &lt;link href=&quot;/output.css&quot;
          rel=&quot;stylesheet&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1 class=&quot;headline&quot;
    th:text=&quot;#{myIndexText}&quot;&gt;ignored&lt;/h1&gt;
&lt;nav class=&quot;flex flex-col sm:flex-row gap-1&quot;&gt;
    &lt;a class=&quot;btn btn-blue&quot;
       th:each=&quot;endpoint: ${myEndpoints}&quot;
       th:text=&quot;#{myNavigateText(${endpoint})}&quot;
       th:href=&quot;@{/{endpoint}(endpoint=${endpoint})}&quot;&gt;ignored&lt;/a&gt;
&lt;/nav&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>
							</div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-271304d elementor-widget elementor-widget-image-carousel" data-id="271304d" data-element_type="widget" data-settings="{&quot;slides_to_show&quot;:&quot;2&quot;,&quot;slides_to_scroll&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;none&quot;,&quot;autoplay&quot;:&quot;no&quot;,&quot;infinite&quot;:&quot;no&quot;,&quot;speed&quot;:500}" data-widget_type="image-carousel.default">
				<div class="elementor-widget-container">
					<div class="elementor-image-carousel-wrapper swiper-container" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="polite">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 von 2"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.15.59-768x475.png" alt="Index-Seite für Anzeigen mit einer horizontalen Auflösung größer als oder gleich 640px." /><figcaption class="elementor-image-carousel-caption">Index-Seite für Anzeigen mit einer horizontalen Auflösung größer als oder gleich 640px.</figcaption></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 von 2"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://www.inoteq.com/wp-content/uploads/2024/01/Screenshot-2024-01-10-at-15.16.15-768x584.png" alt="Index-Seite für Anzeigen mit einer horizontalen Auflösung kleiner als 640px." /><figcaption class="elementor-image-carousel-caption">Index-Seite für Anzeigen mit einer horizontalen Auflösung kleiner als 640px.</figcaption></figure></div>			</div>
							
									</div>
				</div>
				</div>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-f1225ad elementor-section-full_width elementor-section-content-middle elementor-section-height-default elementor-section-height-default" data-id="f1225ad" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-100da93" data-id="100da93" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-9282e45 elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="9282e45" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-1531" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1531" aria-expanded="false">foo.html</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1531" aria-expanded="false">foo.html</div>
					<div id="elementor-tab-content-1531" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-1531" tabindex="0" hidden="false"><pre><code class="“language-html”">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Foo&lt;/title&gt;
    &lt;link href="/output.css"
          rel="stylesheet"&gt;
&lt;/head&gt;
&lt;body class="bg-red-500"&gt;
&lt;h1 class="headline headline-white"
    th:text="#{myFooText}"&gt;ignored&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>
							</div>
		</div>
				</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-c717879" data-id="c717879" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-ea3be8f elementor-widget elementor-widget-spacer" data-id="ea3be8f" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-c30791e elementor-widget elementor-widget-image" data-id="c30791e" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="768" height="898" src="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.22-768x898.png" class="attachment-medium_large size-medium_large wp-image-2258" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.22-768x898.png 768w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.22-257x300.png 257w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.22-876x1024.png 876w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.22-1314x1536.png 1314w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.22-1752x2048.png 1752w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.22.png 2024w" sizes="(max-width: 768px) 100vw, 768px" />													</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-25fb55a elementor-section-full_width elementor-section-content-middle elementor-section-height-default elementor-section-height-default" data-id="25fb55a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-af1f7b6" data-id="af1f7b6" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-d9174fd elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="d9174fd" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-2271" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-2271" aria-expanded="false">bar.html</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-2271" aria-expanded="false">bar.html</div>
					<div id="elementor-tab-content-2271" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-2271" tabindex="0" hidden="false"><pre><code class="“language-html”">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Bar&lt;/title&gt;
    &lt;link href="/output.css"
          rel="stylesheet"&gt;
&lt;/head&gt;
&lt;body class="bg-green-500"&gt;
&lt;h1 class="headline headline-white"
    th:text="#{myBarText}"&gt;ignored&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>
							</div>
		</div>
				</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-f66614c" data-id="f66614c" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-578ef69 elementor-widget elementor-widget-spacer" data-id="578ef69" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-27b305f elementor-widget elementor-widget-image" data-id="27b305f" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="768" height="898" src="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.30-768x898.png" class="attachment-medium_large size-medium_large wp-image-2259" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.30-768x898.png 768w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.30-257x300.png 257w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.30-876x1024.png 876w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.30-1314x1536.png 1314w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.30-1752x2048.png 1752w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.30.png 2024w" sizes="(max-width: 768px) 100vw, 768px" />													</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-1a74e9a elementor-section-full_width elementor-section-content-middle elementor-section-height-default elementor-section-height-default" data-id="1a74e9a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-66 elementor-inner-column elementor-element elementor-element-706dac0" data-id="706dac0" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8b8b154 elementor-tabs-view-horizontal elementor-widget elementor-widget-tabs" data-id="8b8b154" data-element_type="widget" data-widget_type="tabs.default">
				<div class="elementor-widget-container">
					<div class="elementor-tabs">
			<div class="elementor-tabs-wrapper" role="tablist" >
									<div id="elementor-tab-title-1461" class="elementor-tab-title elementor-tab-desktop-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1461" aria-expanded="false">baz.html</div>
							</div>
			<div class="elementor-tabs-content-wrapper" role="tablist" aria-orientation="vertical">
									<div class="elementor-tab-title elementor-tab-mobile-title" aria-selected="true" data-tab="1" role="tab" tabindex="0" aria-controls="elementor-tab-content-1461" aria-expanded="false">baz.html</div>
					<div id="elementor-tab-content-1461" class="elementor-tab-content elementor-clearfix" data-tab="1" role="tabpanel" aria-labelledby="elementor-tab-title-1461" tabindex="0" hidden="false"><pre><code class="“language-html”">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;Baz&lt;/title&gt;
    &lt;link href=&quot;/output.css&quot;
          rel=&quot;stylesheet&quot;&gt;
&lt;/head&gt;
&lt;body class=&quot;bg-blue-500&quot;&gt;
&lt;h1 class=&quot;headline headline-white&quot;
    th:text=&quot;#{myBazText}&quot;&gt;ignored&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>
							</div>
		</div>
				</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-10285ae" data-id="10285ae" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-e571567 elementor-widget elementor-widget-spacer" data-id="e571567" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-e0d3894 elementor-widget elementor-widget-image" data-id="e0d3894" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="768" height="898" src="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.43-768x898.png" class="attachment-medium_large size-medium_large wp-image-2260" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.43-768x898.png 768w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.43-257x300.png 257w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.43-876x1024.png 876w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.43-1314x1536.png 1314w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.43-1752x2048.png 1752w, https://www.inoteq.com/wp-content/uploads/2023/12/Screenshot-2024-01-10-at-15.16.43.png 2024w" sizes="(max-width: 768px) 100vw, 768px" />													</div>
				</div>
					</div>
		</div>
					</div>
		</section>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-2607b93 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="2607b93" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-533c700" data-id="533c700" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-c5994da elementor-widget elementor-widget-spacer" data-id="c5994da" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-30dc1d7 elementor-widget elementor-widget-heading" data-id="30dc1d7" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Schlusswort</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-96fd2c9 elementor-widget elementor-widget-text-editor" data-id="96fd2c9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Es ist wichtig anzumerken, dass dieser Ansatz, wie jeder andere auch, Vor- und Nachteile hat. Thymeleaf ermöglicht eine nahtlose Integration von Backend- und Frontend-Logik, könnte aber bei komplexeren Frontend-Anforderungen an seine Grenzen stoßen. Tailwind CSS bietet eine unübertroffene Flexibilität beim Styling, aber die umfangreichen Klassen können zu überladenem HTML-Code führen.</p><p>Für weitere Details steht das <a href="https://github.com/inoteq/spring-boot-thymeleaf-tailwind-css" target="_blank" rel="noopener">GitHub Repository</a> zur Verfügung, das alle im Artikel beschriebenen Schritte und Konfigurationen enthält.</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-446d063 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="446d063" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2e6c8af" data-id="2e6c8af" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-d202c85 elementor-widget elementor-widget-spacer" data-id="d202c85" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div>
		<p>Der Beitrag <a href="https://www.inoteq.com/2023/12/15/entwicklung-einer-spring-boot-anwendung-mit-thymeleaf-und-tailwind-css/">Entwicklung einer Spring Boot-Anwendung mit Thymeleaf und Tailwind CSS</a> erschien zuerst auf <a href="https://www.inoteq.com">INOTEQ GmbH</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.inoteq.com/2023/12/15/entwicklung-einer-spring-boot-anwendung-mit-thymeleaf-und-tailwind-css/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
