<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Apache_Tapestry</id>
	<title>Apache Tapestry - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Apache_Tapestry"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Apache_Tapestry&amp;action=history"/>
	<updated>2026-06-10T19:39:53Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Apache_Tapestry&amp;diff=302023&amp;oldid=prev</id>
		<title>imported&gt;SchlurcherBot: Bot: http → https</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Apache_Tapestry&amp;diff=302023&amp;oldid=prev"/>
		<updated>2026-02-12T14:57:57Z</updated>

		<summary type="html">&lt;p&gt;Bot: http → https&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox Software&lt;br /&gt;
|Name                  = Apache Tapestry&lt;br /&gt;
|Logo                  = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|Screenshot            = &lt;br /&gt;
|Beschreibung          = &amp;lt;!-- Beschreibung des Screenshots! --&amp;gt;&lt;br /&gt;
|Maintainer            = &lt;br /&gt;
|Hersteller            = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|Erscheinungsjahr      = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|Management            = &lt;br /&gt;
|AktuelleVersion       = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|AktuelleVersionFreigabeDatum = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|AktuelleVorabVersion  = &lt;br /&gt;
|AktuelleVorabVersionFreigabeDatum = &lt;br /&gt;
|Betriebssystem        = [[Plattformunabhängig]]&lt;br /&gt;
|Programmiersprache    = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|Kategorie             = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|Lizenz                = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|Deutsch               = &lt;br /&gt;
|Website               = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
|Dateien               = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Apache Tapestry&amp;#039;&amp;#039;&amp;#039; ist ein Open-Source-[[Framework]] für die Programmiersprache [[Java (Programmiersprache)|Java]], mit dem Webanwendungen erstellt werden können. Es ist kein eigenständiger Server, sondern läuft im Kontext eines [[Servlet]]-Containers wie dem Web-Server [[Apache Tomcat|Tomcat]]. Tapestry ist seit 2006 ein Toplevel-Projekt der [[Apache Software Foundation]].&amp;lt;ref&amp;gt;[https://tapestryjava.blogspot.de/2006/02/tapestry-promoted-to-apache-top-level.html tapestryjava.blogspot.de]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tapestry-Anwendungen bestehen aus Seiten, wobei eine Seite aus wiederverwendbaren und konfigurierbaren Komponenten besteht. Komponenten wiederum können durch sogenannte [[Mixin]]s erweitert werden.&lt;br /&gt;
&lt;br /&gt;
In Tapestry besteht eine Seite aus zwei Bestandteilen: Eine [[Extensible Markup Language|XML]]-Vorlage (.tml) und eine Javaklasse (.java). Innerhalb der XML-Vorlage können sowohl [[Hypertext Markup Language|HTML]]-[[Tag (Informatik)|Tags]] als auch spezifische Tapestry-Tags für den dynamischen Inhalt verwendet werden. Diese Tapestry-Tags werden über den im Wurzelelement spezifizierten Namespace eingebunden. Die Javaklasse wird zur Verarbeitung von Ereignissen wie zum Beispiel den Klick auf einen Tapestry-Link oder das Absenden eines Formulars eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aufzurufenden Methoden können entweder über ein vorgegebenes Namensschema oder über eine [[Annotation (Java)|Annotation]] festgelegt werden. Die beiden im Folgenden aufgeführten Methoden würden so beispielsweise auf das Auslösen des Links mit der ID &amp;#039;&amp;#039;MyLink&amp;#039;&amp;#039; reagieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
void onActionFromMyLink(){...}&lt;br /&gt;
&lt;br /&gt;
@OnEvent(value=&amp;quot;action&amp;quot;, component=&amp;quot;myLink&amp;quot;)&lt;br /&gt;
void myMethod(){...}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit seiner komponentenbasierten Architektur, der Trennung von Darstellung (HTML, [[Extensible Markup Language|XML]]) und Code ähnelt Tapestry konzeptuell [[WebObjects]], ohne mit diesem kompatibel zu sein. Zusammen mit [[Apache Cayenne]] eingesetzt ist es durchaus als freier WebObjects-Ersatz verwendbar. Der Wechsel von einem Framework zum anderen sollte für mit einem der beiden Frameworks erfahrenen Entwickler aufgrund der Ähnlichkeiten reibungslos vonstattengehen.&lt;br /&gt;
&lt;br /&gt;
== Besondere Features ==&lt;br /&gt;
; Live Class Reloading&lt;br /&gt;
: Tapestry überwacht im Entwicklungsmodus alle Dateien und übernimmt Änderungen an Seiten, Komponenten, Service-Implementierungen sowie HTML Templates und Properties Dateien automatisch. Dadurch lässt sich die Produktivität von Entwicklern deutlich steigern, da die Anwendung nicht nach jeder Änderung neugestartet werden muss.&amp;lt;ref&amp;gt;[http://tapestry.apache.org/class-reloading.html tapestry.apache.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
; Komponenten-basiert&lt;br /&gt;
: Einzelne Seiten lassen sich in Tapestry aus kleinen, wiederverwendbaren Komponenten bauen. Jede Komponente hat dabei ihre eigene Java-Klasse und ihr eigenes Template. Tapestry lässt sich dabei leicht durch eigenen Komponenten erweitern.&amp;lt;ref&amp;gt;Drobiazko, 2012, S. 20&amp;lt;/ref&amp;gt;&lt;br /&gt;
; [[Konvention vor Konfiguration]]&lt;br /&gt;
: Tapestry nutzt, anstatt XML-Dateien, Namenskonventionen und [[Annotation]]s, um eine Anwendung zu konfigurieren.&amp;lt;ref name=&amp;quot;Drobiazko.7&amp;quot;&amp;gt;Drobiazko, 2012, S. 7&amp;lt;/ref&amp;gt;&lt;br /&gt;
; Geringer Einsatz der HttpSession&lt;br /&gt;
: Tapestry verzichtet weitestgehend auf den Einsatz der HttpSession, um auch im Clusterbetrieb möglichst effizient zu sein.&amp;lt;ref&amp;gt;[http://tapestry.apache.org/performance-and-clustering.html tapestry.apache.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
; Post/Redirect/Get&lt;br /&gt;
: Formulare in Tapestry folgen dem [[Post/Redirect/Get]]-Prinzip. Damit wird verhindert, dass Benutzer ein Formular aus Versehen mehrfach absenden. Darüber hinaus funktionieren die Vor- und Zurück-Button im Browser wie gewohnt und URLs lassen sich problemlos speichern.&amp;lt;ref&amp;gt;[http://tapestry.apache.org/forms-and-validation.html tapestry.apache.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
; Inversion of Control (IOC)&lt;br /&gt;
: Tapestry basiert auf seinem eigenen [[Inversion of Control]] Framework, ähnlich [[Google Guice]]. Es wurde jedoch mit dem Ziel entwickelt, alle Teile einer Anwendung ersetzbar und konfigurierbar zu machen und kann auch außerhalb von Webanwendungen verwendet werden.&amp;lt;ref name=&amp;quot;Drobiazko.7&amp;quot; /&amp;gt; Tapestry IoC kann gegebenenfalls auch durch [[Spring (Framework)|Spring IoC]] ersetzt werden.&amp;lt;ref&amp;gt;[http://tapestry.apache.org/integrating-with-spring-framework.html tapestry.apache.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
Tapestry ist dazu gedacht, die Entwicklung von Java-Web-Anwendungen zu vereinfachen. Das Framework wurde so entworfen, dass es einfacher möglich ist, [[Robustheit|robuste]] Anwendungen zu erzeugen, die wiederum einfacher zu installieren, zu [[debuggen]] und zu warten sind als herkömmliche Servlet-Anwendungen. Es nimmt dem Entwickler die Sorgen über [[Multithreading]] ab. Durch die klare Trennung von HTML- und Anwendungscode können Java- und HTML-Entwickler gemeinsam an einem Projekt arbeiten. Tapestry unterstützt darüber hinaus die [[Internationalisierung (Softwareentwicklung)|Internationalisierung]] von Anwendungen sowie die Validierung von Benutzereingaben und bietet eine Reihe von vorgefertigten GUI-Komponenten wie Kalender, sortierbare Tabellen und Bäume. Der Funktionsumfang kann über das Erstellen eigener Komponenten erweitert werden.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil von Tapestry ist die Tatsache, dass Java-Klassen zu Webseiten gewöhnlich einfache [[Plain Old Java Object|POJOs]] sind. Es ist also nicht nötig, von Superklassen zu erben oder vorgeschriebene Interfaces zu implementieren. Dafür werden Annotations verwendet, mit denen die Vererbung indirekt hergestellt wird. Ohne projektfremde Imports kommt auch Tapestry nicht aus.&lt;br /&gt;
&lt;br /&gt;
== Rewinding (nur bis Tapestry 4.x) ==&lt;br /&gt;
In Tapestry bis zur Version 4 findet die Übertragung von Daten mit Hilfe eines Formulars in drei Schritten statt: Im ersten Schritt wird die [[Hypertext Markup Language|HTML]]-Seite mit dem Formular gerendert. Der Nutzer editiert im zweiten Schritt die Eingabefelder des Formulars und startet schließlich die dritte Phase, indem er die Submit-Schaltfläche betätigt.&lt;br /&gt;
&lt;br /&gt;
Der Vorgang hat zwei [[Request Cycle|Request-Zyklen]] zur Folge. Im ersten Zyklus wird die HTML-Seite angefordert und das Formular wird in diesem Zyklus gerendert. Der zweite Request-Zyklus wird beim Betätigen der Submit-Schaltfläche angestoßen.&lt;br /&gt;
&lt;br /&gt;
In diesem Zyklus muss Tapestry die folgenden Aktionen ausführen:&lt;br /&gt;
* die Werte aus den Eingabefeldern sind zu extrahieren&lt;br /&gt;
* diese Werte sind manchmal zu konvertieren (String in Integer)&lt;br /&gt;
* die konvertierten Werte sind den richtigen Page/Componenten-Properties zuzuweisen&lt;br /&gt;
&lt;br /&gt;
Da in Tapestry die Zuordnung der Properties zu den Eingabefeldern während des Rendering erfolgt, nutzt Tapestry eine ungewöhnliche Herangehensweise: Es ermittelt genau diese Beziehungen, indem die Seite erneut gerendert wird. Diese Phase wird auch &amp;#039;&amp;#039;Rewind-Phase&amp;#039;&amp;#039; genannt.&lt;br /&gt;
&lt;br /&gt;
In dieser Phase wird jede Komponente in der Form in der gleichen Reihenfolge besucht, wie es beim initialen Rendern geschieht und es werden die oben beschriebenen Aktionen ausgeführt. Im Unterschied zum initialen Rendervorgang wird die Listener-Methode der Submit-Form nur in der Rewinding-Phase aufgerufen.&lt;br /&gt;
&lt;br /&gt;
In Tapestry 5 wurde der fragile Rewind Mechanismus durch generierte Hidden Fields abgelöst, diese beinhalten nun die Information die für die Submit Verarbeitung notwendig sind.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Eine einfache Tapestry-Webseite ===&lt;br /&gt;
&lt;br /&gt;
Im Folgenden ist eine einfache Tapestry-Webseite aufgeführt. Innerhalb dieser Seite wird ein globales Layout (t:layout) verwendet. Dieses hat den Parameter &amp;#039;&amp;#039;title&amp;#039;&amp;#039;. Um die Internationalisierung der Seite zu gewährleisten, wird in der Seitenbeschreibung nicht explizit der gewünschte Titel, sondern  ein Key für die jeweilige Übersetzungsdatei angegeben. Je nach gewählter Sprache wird die Variable &amp;#039;&amp;#039;${message:title}&amp;#039;&amp;#039; nun durch einen beliebigen Text ersetzt. Dieser wird in der zur Seite gehörigen &amp;#039;&amp;#039;&amp;#039;properties&amp;#039;&amp;#039;&amp;#039;-Datei festgelegt.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus wird hier ein einfacher Tapestry-Pagelink auf die Index-Seite eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Webseite About.tml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;t:layout title=&amp;quot;${message:title}&amp;quot;&lt;br /&gt;
      xmlns:t=&amp;quot;http://tapestry.apache.org/schema/tapestry_5_1_0.xsd&amp;quot;&lt;br /&gt;
      xmlns:p=&amp;quot;tapestry:parameter&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;${message:text}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;t:pagelink page=&amp;quot;index&amp;quot;&amp;gt;${message:index}&amp;lt;/t:pagelink&amp;gt;&lt;br /&gt;
&amp;lt;/t:layout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zugehörige Java-Klasse sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package org.examples.pages;&lt;br /&gt;
&lt;br /&gt;
public class About{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deutsche Properties-Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
title: Beispielseite&lt;br /&gt;
text: Dies ist eine einfache Beispielseite&lt;br /&gt;
index: Hauptseite&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Englische Properties-Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
title: my little example&lt;br /&gt;
text: This is only a test&lt;br /&gt;
index: Mainpage&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tapestry-Komponenten ===&lt;br /&gt;
&lt;br /&gt;
Mehrfach verwendeter Code kann in einzelne Komponenten ausgegliedert werden. Diese bestehen normalerweise wie eine gewöhnliche Webseite aus einer Java-Klasse, einer TML-Datei und den zugehörigen Übersetzungen.&lt;br /&gt;
&lt;br /&gt;
Die hier aufgeführte Komponente enthält einen Parameter und erstellt für diesen einen Link mit zugehörigen Text.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;t:container xmlns:t=&amp;quot;http://tapestry.apache.org/schema/tapestry_5_1_0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;t:pagelink page=${targetPage}&amp;gt;Link auf die Seite ${targetPage}&amp;lt;/t:pagelink&amp;gt;&lt;br /&gt;
&amp;lt;/t:container&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zugehörige Java-Klasse:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class myPageLink{&lt;br /&gt;
&lt;br /&gt;
   @Parameter(defaultPrefix = &amp;quot;literal&amp;quot;)&lt;br /&gt;
   @Property&lt;br /&gt;
   private String targetPage;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einsatz der Komponente:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;t:myPageLink targetPage=&amp;quot;index&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://tapestry.apache.org/ offizielle Webpräsenz]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=4793313-6}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Freies Webframework]]&lt;br /&gt;
[[Kategorie:Java-Bibliothek]]&lt;br /&gt;
[[Kategorie:Apache-Projekt|Tapestry]]&lt;/div&gt;</summary>
		<author><name>imported&gt;SchlurcherBot</name></author>
	</entry>
</feed>