Apache Tapestry

Werbung
Apache Tapestry
Jan Diller
Java Architekt
Alternatives Konzept zur
Web-Anwendungsentwicklung
Nur eine Folie: Wer ist t&p?
gegründet 1991
60 MitarbeieterInnen
Bochum und Bern
2/47
Gliederung
Vortrag Tapestry
●
Wir haben nur 45min Zeit.
●
Wir machen keine Pause.
●
Wir haben eine Progress-Bar.
3/47
Einleitung
Alternative? Wozu?
●
'Verbreitung von Web-Frameworks'
–
Es gibt sehr viel mehr Frameworks als man denkt.
–
Wikipedia listet 105 Webframeworks.
–
Neben solchen in Java gesellen sich auch noch welche
in .net, PHP, Python und Perl dazu.
–
Immerhin noch 22 Frameworks in Java.
4/47
JSP
…
Wicket
Tapestry
…
Richfaces
Tobago
J4Fry
PrimeFaces
MyFaces
Mojarra
WebWork
Cocoon
Struts
Einleitung
Web-Applikation Techologien
JSF
<*.jsp>/<*.xhtml>
Servlets
5/47
Einleitung
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>tpy Tapestry 5 Application</display-name>
<context-param>
<param-name>tapestry.app-package</param-name>
<param-value>com.tp.doag2013</param-value>
</context-param>
....
6/47
Einleitung
web.xml
....
<context-param>
<param-name>tapestry.development-modules</param-name>
<param-value>
com.tp.doag2013.services.DevelopmentModule
</param-value>
</context-param>
<context-param>
<param-name>tapestry.qa-modules</param-name>
<param-value>
com.tp.doag2013.services.QaModule
</param-value>
</context-param>
<filter>
<filter-name>app</filter-name>
<filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>app</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
7/47
Einleitung
Components
8/47
Einleitung
Components
9/47
Einleitung
Components
10/47
Einleitung
Components
11/47
Einleitung
Components
12/47
Einleitung
Support
13/47
Einleitung
Verschiedene Web-Frameworks auf dem Zeitstrahl
14/47
Einleitung
Warum sollte ich Tapestry verwenden – eine Sammlung
●
… weil es performant ist.
●
… weil es schnell und einfach zu lernen ist.
●
… weil es ausgewogen und vollständig ist.
●
… weil man als Entwickler mehr als ein Web-Framework
kennen sollte.
http://de.slideshare.net/mraible/comparing-jsf-spring-mvc-stripes-struts-2-tapestry-an
d-wicket-presentation
http://docs.codehaus.org/pages/viewpage.action?pageId=190316696
15/47
Einleitung
Warum sollte ich Tapestry verwenden – eine Sammlung
●
●
●
●
… there's magic and metaprogramming happening everywhere.
You could argue it's overdoing convention over configuration.
… simple stuff is very simple to do, harder stuff requires you to
understand in detail how Tapestry 5 works and can be hard if
you don't (yet).
Most important Tapestry 5 feature for me is the flexibility of the
framework. You can override almost every piece of code inside
Tapestry's core, thanks to Tapestry IoC.
Tapestry has beautiful URLs. package/page/${param1}/$
{param2}
http://stackoverflow.com/questions/3831807/java-server-faces-2-0-or-tapestry-5-2
16/47
Einleitung
Info-Quellen - Jumpstart
Tomcat 7
● JBoss 7
● Glassfish 3.1.2
●
17/47
Einleitung
Info-Quellen – My First Tpy Project
18/47
Einleitung
Info-Quellen – My First Tpy Project
mvn archetype:generate -DarchetypeCatalog=http://tapestry.apache.org
mvn jetty:run
19/47
Konzept
Was ist Tapestry?
Component oriented framework for creating dynamic, robust,
highly scalable web applications in Java.
Quelle: http://tapestry.apache.org/
20/47
Konzept
Wesentliche Konzepte
●
Convention over Configuration
●
Inversion of Control
21/47
Konzept
Convention over Configuration
src
└───main
├───java
│
└───com
│
└───tp
│
└───doag2013
│
├───components
│
│
Layout.java
│
│
│
├───pages
│
│
About.java
│
│
Contact.java
│
│
Index.java
│
│
│
└───services
│
AppModule.java
│
DevelopmentModule.java
│
QaModule.java
│
├───resources
│
└───com
│
└───tp
│
└───doag2013
│
├───components
│
│
Layout.tml
│
│
│
└───pages
│
About.tml
│
Contact.tml
│
Index.properties
│
Index.tml
│
└───webapp
├───layout
│
│
layout.css
│
│
│
└───images
└───WEB-INF
app.properties
Convention over configuration
22/47
Konzept
Convention over Configuration
target
│
├───layout
│
│
layout.css
│
│
│
└───images
│
├───META-INF
└───WEB-INF
│
app.properties
│
web.xml
│
└───classes
│
└───com
└───tp
└───doag2013
└───tpy
├───components
│
Layout.class
│
Layout.tml
│
├───pages
│
About.class
│
About.tml
│
Contact.class
│
Contact.tml
│
Index.class
│
Index.properties
│
Index.tml
│
└───services
AppModule.class
DevelopmentModule.class
QaModule.class
Convention over configuration
23/47
Konzept
CoC-Container – Fügt zusammen was zusammen gehört
CoC-Container
Presentation
XHTML
<*.tml>
Components
Mixins
<predefined elements>
<own elements>
I18N
<*.properties>
Controller
<*.java>
24/47
Konzept
Convention over Configuration
src
└───main
├───java
│
└───com
│
└───tp
│
└───doag2013
│
├───components
│
│
Layout.java
│
│
│
├───pages
│
│
About.java
│
│
Contact.java
│
│
Index.java
│
│
│
└───services
│
AppModule.java
│
DevelopmentModule.java
│
QaModule.java
│
├───resources
│
└───com
│
└───tp
│
└───doag2013
│
├───components
│
│
Layout.tml
│
│
│
└───pages
│
About.tml
│
Contact.tml
│
Index.properties
│
Index.tml
│
└───webapp
├───layout
│
│
layout.css
│
│
│
└───images
└───WEB-INF
app.properties
src
└───main
├───java
│
└───com
│
└───tp
│
└───doag2013
│
HelloWorldController.java
│
└───webapp
│
helloWorld.xhtml
│
index.html
│
page2.xhtml
│
├───resources
│
└───css
│
style.css
│
└───WEB-INF
faces-config.xml
web.xml
25/47
Konzept
Convention over
Configuration –
Rendering Phases
26/47
27/47
Konzept
Convention over Configuration
- Alternative Schreibweisen ●
void cleanupRender() vs. @Cleanup
●
void setupRender() vs. @SetupRender
●
… id=“add“ ...
void onActionFromAdd(int amount)
vs.
@OnEvent(value = "add")
void doSomeAdding(int amount)
28/47
Konzept
Einreihung ins MVC-Konzept
Model
<@Application>
<@Session>
<@Page>
View
XHTML
<*.tml>
Components
Mixins
<predefined elements>
<own elements>
Controller
<*.java>
I18N
<*.properties>
29/47
Faktencheck
Bevor ein Framework verwendet wird ...
… sollte man sich diese Fragen beantworten!
–
Vertraue ich meinem Lieferanten?
–
Wie vital ist das Projekt?
–
Gibt es das Projekt noch in 3, 5, 10, 20 Jahren?
–
Gibt es meine Anwendung bis dahin noch?
Wie viele Anwender wird meine Anwendung haben?
●
–
Werde ich von einer Community unterstützt und wenn
ja, wie schnell erwarte/erhalte ich Antworten?
–
Ist mein Framework quelloffen?
30/47
Faktencheck
Der Lieferant - Apache Foundation
●
●
●
Die Apache Software Foundation ist eine ehrenamtlich
arbeitende Organisation zur Förderung der
Apache-Softwareprojekte.
Charakteristisch für Apache-Projekte ist der gemeinschaftliche
und diskussionsfreudige Entwicklungsprozess und die offene
und pragmatische Apache-Lizenz, welche auch von externen
Open-Source-Projekten benutzt und angepasst werden kann.
Zu den Aufgaben der ASF gehören der rechtliche Schutz aller
Projekt-Mitarbeiter und der Schutz der Marke „Apache“.
Quelle: Wikipedia
31/47
Faktencheck
Der Lieferant - Apache Foundation
●
●
●
Aktuell wird an ca. 130 Projekten gearbeitet.
Membership in The Apache Software Foundation is a
privilege and is by invitation only. Candidates for
membership are proposed by existing members, and
voted upon by the existing membership.
The Apache Software Foundation, a US 501(3)(c)
non-profit corporation, provides organizational, legal,
and financial support for a broad range of over 140 open
source software projects.
Quelle: http://apache.org/foundation/members.html
32/47
Faktencheck
Der Lieferant - Apache Foundation
●
Build-Tools
–
●
Web-Application-Frameworks
–
●
Struts, Tapestry, Turbine, Wicket, Tiles
Web-Services
–
●
Ant, Maven
Axis, CXF
Web-/Application-Server
–
Tomcat, TomEE, OpenEJB, Geronimo
33/47
Faktencheck
Vitalität – Releasezyklen
●
04.11.2013 5.4-alpha-24
●
12.10.2012 5.3.6
●
20.12.2011 5.3.1
●
11.10.2013 5.4-alpha-23
●
30.08.2012 5.3.5
●
22.06.2011 5.3.0
●
16.09.2013 5.4-alpha-22
●
16.07.2012 5.3.4
●
21.11.2011 5.3
●
12.09.2013 5.4-alpha-21
●
20.03.2012 5.3.3
●
29.06.2011 5.2.6
●
11.09.2013 5.4-alpha-20
●
24.04.2012 5.3.3
●
28.03.2011 5.2.5
●
10.09.2013 5.4-alpha-19
●
07.02.2012 5.3.2
●
08.01.2011 5.2.4
●
05.09.2013 5.4-alpha-18
●
08.01.2011 5.2.2
●
05.09.2013 5.4-alpha-17
●
08.01.2011 5.2.1
●
04.09.2013 5.4-alpha-16
●
29.04.2013 5.3.7
34/47
Faktencheck
Vitalität – Wer steckt hinter Tapestry
Name
ID
role
email address
website
Andreas Andreou
andyhot
PMC member
[email protected]
http://andyhot.gr
Ben Dotte
bdotte
committer
[email protected]
Bob Harner
bobharner
committer
[email protected]
https://github.com/bobharner
Christophe Cordenier
ccordenier
committer
[email protected]
http://spreadthesource.com
Dan Adams
dadams
committer
[email protected]
Daniel Gredler
gredler
committer
[email protected]
Daniel Jue
djue
committer
[email protected]
David Solis
dsolis
committer
[email protected]
François Facon
ffacon
committer
[email protected]
http://people.apache.org/~ffacon/
Howard M. Lewis Ship
hlship
PMC chair
[email protected]
http://howardlewisship.com
Igor Drobiazko
drobiazko
PMC member
[email protected]
http://tapestry5.de
Jesse Kuhnert
jkuhnert
PMC member
[email protected]
Josh Canfield
joshcanfield
committer
[email protected]
Kalle Korhonen
kaosko
committer
[email protected]
Kevin Menard
kmenard
committer
[email protected]
Marcus Schulte
mschulte
PMC member
[email protected]
Massimo Lusetti
mlusetti
PMC member
[email protected]
Richard Lewis-Shell
rlewisshell
PMC member
[email protected]
Robert D. Zeigler
robertdzeigler
committer
[email protected]
Robin Komiwes
robinkomiwes
committer
[email protected]
http://spreadthesource.com
Taha Hafeez
tawus
committer
[email protected]
http://tawus.wordpress.com
Ted Steen
tedst
committer
[email protected]
Thiago H. de Paula Figueiredo
thiagohp
PMC member
[email protected]
Ulrich Stärk
uli
PMC member
[email protected]
http://tynamo.org
http://meridio.blogspot.com
35/47
Konzept
Wesentliche Konzepte
●
Convention over Configuration
●
Inversion of Control
36/47
Konzept
IoC Registry
IoC - Inversion of Control (Steuerungsumkehr)
‚Inversion of control is a common characteristic of frameworks, so
saying that these lightweight containers are special because they
use inversion of control is like saying my car is special because it
has wheels.
The question, is what aspect of control are they inverting?‘
Quelle: Martin Fowler
●
In Tapestry wird hier drunter unter anderem die Möglichkeit
verstanden, eigene Services zu registrieren und diese
einfach in die Service-Consumer, also z.B. die Controller,
zu injizieren.
37/47
Konzept
IoC Registry
●
Tapestry ist um seine eigenen IoC Container gebaut.
●
Verzicht auf Thirdparties wie Spring oder Guice.
●
●
Dieser eigenen IoC Container ist Grundlage für die
Stabilität, die Performance und die Erweiterbarkeit von
Tapestry.
Dadurch, dass der IoC Container schon im Entwurf
enthalten ist, fällt es leicht, jeglichen eingebauten Service
auf die Bedürfnisse des jeweiligen Projektes anzupassen
oder zu erweitern.
38/47
Konzept
IoC Registry
●
Merkmale des IoC Container
–
Konfiguration findet im Code, nicht in XML statt.
–
Einfach Erweiterbarkeit von Services.
–
Eingebautes Aspekt orientiertes Programmier-Model.
–
Einfache Modularisierung.
39/47
Konzept
Injection
‚Tapestry tranforms your class at runtime. Further, an instance of
the class is useless by itself, it must be wired together with its
template and its sub-components.‘
Quelle: http://tapestry.apache.org/
40/47
Konzept
Injection
‚On top of that, Tapestry keeps just once instance of each page in
memory (since 5.2). It reworks the bytecode of the components so
that a single instance can be shared across multiple request
handling threads.‘
Quelle: http://tapestry.apache.org/
41/47
Konzept
Injection
private Map<String, String> options
= new LinkedHashMap<String, String>();
●
stattdessen
private Map<String, String> options;
…
public void setupRender() {
…
options = new LinkedHashMap<String, String>();
…
}
42/47
Konzept
Page Navigation
●
Null response
public Object onAction(){
return null;
}
●
String response
public String onAction(){
return "Index";
}
●
Class response
public Object onAction(){
return Index.class
}
43/47
Konzept
Page Navigation
●
Page response
@InjectPage
private Index index;
public Object onAction(){
return index;
}
●
HttpError
public Object onAction(){
return new HttpError(302, "The Error message);
}
44/47
Konzept
Page Navigation
●
Link response
Verweis auf eine interne Resource
–
●
Stream response
für PDF etc.
–
●
URL response
Verweis auf eine externe Resource.
–
●
Object response
-
Rückgabe eine Fehlers.
45/47
Getting started
Hibernate Unterstützung
src/pom.xml (partial)
<dependencies>
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-hibernate</artifactId>
<version>${tapestry-release-version}</version>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.7</version>
</dependency>
</dependencies>
src/main/resources/hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="hibernate.connection.url">jdbc:hsqldb:./target/work/t5_tutorial1;shutdown=true</property>
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
</session-factory>
</hibernate-configuration>
46/47
www.t-p.com
Fragen Sie gern
Danke !
Stand 202
47/47
Herunterladen