Sie sind hier
E-Book

Java EE 7

Enterprise-Anwendungsentwicklung leicht gemacht (2. Aufl.)

AutorDirk Weil
Verlagentwickler.press
Erscheinungsjahr2015
Seitenanzahl348 Seiten
ISBN9783868023442
FormatPDF/ePUB
KopierschutzWasserzeichen/DRM
GerätePC/MAC/eReader/Tablet
Preis27,99 EUR
Java EE stellt schon seit mehr als siebzehn Jahren eine verlässliche und tragfähige Plattform zur Entwicklung von Enterprise-Anwendungen dar. Waren die ersten Versionen bis zu J2EE 1.4 noch komplex und schwergewichtig, so ist die aktuelle Version trotz des großen Leistungsumfangs stark auf die Einfachheit der Softwareentwicklung fokussiert. Anwendungsentwicklung auf dieser Basis macht Spaß und ermöglicht schnelle Erfolge - dies möchte dieses Buch seinen Lesern vermitteln. Es zeigt anhand vieler Beispiele, wie einfach Software für die Java-EE-Plattform erstellt werden kann. Das Buch hat nicht den Anspruch einer allumfassenden Darstellung von Java EE. Vielmehr werden die für die leichtgewichtige Softwareentwicklung genutzten Teile der Gesamtspezifikation ohne Ballast verständlich erläutert. Dadurch wird stückweise ein leistungsfähiger, aber überschaubarer Stack für Enterprise-Anwendungen zusammengesetzt: von Java Persistence über CDI bis hin zur browserbasierten Oberfläche mit JavaServer Faces. Neben der Betrachtung einzelner Anwendungen spielen heute vernetzte Architekturen, anwendungsübergreifende Kommunikation, Microservices etc. eine immer stärkere Rolle. Dem trägt diese überarbeitete Auflage mit dem neu hinzugekommenen Kapitel über RESTful Web Services Rechnung. Ein durchgängiges Real-World-Beispielprojekt dient der weiteren Verdeutlichung und Abrundung. Hier werden alle behandelten Teile zu einer kompletten Anwendung zusammengesetzt, die in der diskutierten Form mittlerweile im Einsatz ist. Zielgruppe: Java-Enterprise-Entwickler, Projektleiter, IT-Architekten

Dirk Weil ist seit 1998 als Berater im Bereich Java tätig. Als Geschäftsführer der GEDOPLAN GmbH in Bielefeld ist er für die Konzeption und Realisierung von Informationssystemen auf Basis von Java EE verantwortlich. Seine langjährige Erfahrung in der Entwicklung anspruchsvoller Unternehmenslösungen machen ihn zu einem kompetenten Ansprechpartner und anerkannten Experten auf dem Gebiet Java EE. Er ist Fachbuchautor, schreibt Artikel für Fachmagazine, hält Vorträge und leitet Seminare und Workshops zu diversen Java-SE- bzw. Java-EE-Themen.

Kaufen Sie hier:

Horizontale Tabs

Leseprobe

2 CDI

2.1 Was ist das?

CDI steht für „Contexts and Dependency Injection for the Java EE Platform“ und ist ein Standard innerhalb des Webprofils der Dachspezifikation Java EE. Der Arbeitsbereich von CDI ist die Bereitstellung und Verknüpfung von Komponenten und Diensten als Basis für Enterprise-Applikationen. CDI ist allerdings nicht nur im EE-Umfeld nutzbar, sondern kann auch ohne Applikationsserver eingesetzt werden.

CDI 1.0 wurde im JSR 299 lange Zeit unter den Namen WebBeans entworfen und standardisiert viele Ideen und Konzepte von populären Open-Source-Frameworks wie Seam und Spring(-Core). Die aktuelle Version 1.1 (JSR 346) hat eine für Java-EE-Verhältnisse angenehm kurze Spezifikation: ca. 130 gut lesbare Seiten1.

Neben der Referenzimplemtierung JBoss Weld2 steht u. a. Apache OpenWebBeans3 als CDI-Container zur Verfügung.

2.2 Wozu braucht man das?

Professionelle Anwendungen sind nicht monolithisch aufgebaut, sondern bestehen aus Komponenten. Zum einen ergeben sich bei der Entwicklung von Software aus der Analyse der Aufgabenstellung fachliche Bereiche, die durch fachliche Komponenten abgebildet werden können. Innerhalb dieser Komponenten lassen sich wieder Teile abgrenzen, diesmal eher technischer Natur. Die Komponenten benutzen andere Komponenten sowie die Plattformdienste, sind aber weitgehend abgegrenzt (Abb. 2.1).

Eine Aufgabe der Softwareentwicklung ist es nun, diese Komponenten untereinander zu verknüpfen, sodass eine saubere Anwendungsarchitektur entsteht. Das kann natürlich mit einfachen Sprachmitteln von Java geschehen: Eine Komponente kann in ihrem Programmcode andere Komponenten instanziieren, indem sie new benutzt. Dadurch wird die Kopplung der Komponenten aber sehr stark: Die aufrufende Komponente muss die benutzte sehr genau kennen, Änderungen sind aufwändig, der Einsatz einer alternativen Komponente unmöglich.

Abbildung 2.1: Anwendungskomponenten

Zudem profitieren solche Objekte kaum von der Umgebung der Anwendung: Der Applikationsserver kennt sie nicht, kann also bspw. kein Monitoring und keine Laufzeitsteuerung dafür durchführen. Flexibler ist es, die benötigten Objekte vom Application Server herstellen zu lassen. In den früheren Versionen der Java EE – damals noch J2EE – hat man dazu weitgehend String-basierte Referenzen benutzt, hat also bspw. die benötigte Komponente per Namen im JNDI-Dienst adressiert. Hier stellt sich aber das Problem der Zielgenauigkeit: Ist ein Objekt unter dem verwendeten Namen überhaupt vorhanden und hat es den richtigen Typ (Listing 2.1)?

// Unsicher: Ist ein Objekt mit dem Namen konfiguriert?
// Falls ja, hat es den korrekten Typ?
MyService myService
= (MyService) jndiContext.lookup("ejb/myService");

Listing 2.1: Referenzierung einer Komponente über ihren Namen

Ein weiteres Problem ist die Abhängigkeit der aufrufenden Komponente von ihrer Umgebung: Der Code im Beispiel setzt unumstößlich voraus, dass es einen JNDI-Dienst gibt. Ein Test des Codes außerhalb des Applikationsservers ist damit unmöglich. Hier setzt die Idee „Inversion of Control“ an, die den aktiven Teil der Komponentenverknüpfung aus der Komponente herauslöst und in die Laufzeitumgebung – den Container – verlagert: Nicht die Komponente besorgt sich die von ihr benötigten Serviceobjekte, sondern der Container liefert sie an. Dieses Verfahren firmiert unter dem Namen „Dependency Injection“ – Injektion von benötigten Objekten –, womit wir auch schon die beiden letzten Drittel des Namens CDI erklärt hätten (Abb. 2.2).

Abbildung 2.2: Dependency Injection

Die Komponente weiß jetzt nicht mehr, woher sie die von ihr genutzten Objekte erhält. Damit ist die Kopplung zu ihrer Umgebung so klein geworden, dass ein Austausch leicht möglich wird: Im Produktivsystem werden Komponenten und Ressourcen vom Container bspw. weiterhin im JNDI-Dienst verwaltet, während sie in einer Testumgebung ohne Container von der Testklasse geliefert werden.

Bei der Dependency Injection obliegt es dem Container, wann die benötigten Objekte erzeugt und zerstört werden, er kann also die Komponenten von der kompletten Lifecycle-Steuerung entlasten. Damit sind wir beim ersten Drittel des Namens CDI: Die injizierten Objekte können Kontexten zugeordnet werden, die über ihre Lebensdauer bestimmen. So können die von einem Geschäftsprozess genutzten Services inklusive der darin verwalteten Daten sitzungsorientiert gehalten werden.

Die geschilderten Konzepte sind beileibe nicht neu. Sie haben vielmehr seit vielen Jahren Einzug in die Java-Softwarelandschaft gehalten und dort ihren Nutzen unter Beweis gestellt – stark unterstützt insbesondere durch das Spring-Framework, das damit wesentliche Schwächen der damaligen J2EE adressierte. Neu ist allerdings ein Aspekt von CDI, der die beschriebene lose Kopplung um Typsicherheit ergänzt: Durch weitgehenden Verzicht auf Objektnamen und Verwendung von Java-Typen an ihrer Stelle wird erreicht, dass sich die Komponentenverdrahtungen schon sehr früh – zur Compile-Zeit, spätestens zur Deployment-Zeit – prüfen lassen und somit Fehler nicht erst zur Anwendungslaufzeit zutage treten.

2.3 Bereitstellung und Injektion von Beans

Die durch CDI miteinander verknüpften Klassen werden in der CDI-Spezifikation Managed Beans genannt. Im Folgenden wird der Begriff CDI Bean bevorzugt, da Managed Beans auch in anderen Teilen der Java EE auftauchen. CDI Beans können sowohl injizierte Objekte darstellen als auch Injektionsziele enthalten.

2.3.1 CDI Beans

Die Anforderungen an CDI Beans sind denkbar gering: Nahezu jede konkrete Java-Klasse ist dazu geeignet4. Benötigt wird nur ein Konstruktor ohne Parameter (wir werden später sehen, dass auch Klassen mit anderen Konstruktoren CDI Beans sein können). Die Klasse GreetingBean aus Listing 2.2 ist somit als CDI Bean verwendbar.

public class GreetingBean
{
public String getGreeting()
{
int hourOfDay = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if (hourOfDay < 10)
return "Guten Morgen";
else if (hourOfDay < 18)
return "Guten Tag";
else
return "Guten Abend";
}
}

Listing 2.2: Einfache CDI Bean5

CDI beachtet allerdings nicht alle Klassen im Classpath. Durch einen Deskriptor namens beans.xml kann die sog. Bean Discovery gesteuert werden. Die Datei darf komplett leer sein und muss im Verzeichnis META-INF eines JAR-Files, eines Classpath-Verzeichnisses oder im Verzeichnis WEB-INF einer Webanwendung stehen, um die zugehörigen Klassen für CDI zu aktivieren. Da viele Entwicklungswerkzeuge über leere XML-Dateien meckern, sollte aber das in Listing 2.3 gezeigte wohlgeformte XML-Dokument statt der leeren Datei verwendet werden. Hierin können dann später auch einfacher Ergänzungen vorgenommen werden.

<?xml version="1.0"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all" version="1.1">
</beans>

Listing 2.3: Effektiv leerer CDI-Deskriptor „beans.xml“

Das Attribut bean-discovery-mode lässt bereits vermuten, dass man mit dem Deskriptor genauer beeinflussen kann, welche Klassen als CDI Beans erkannt werden. Zudem ist der Deskriptor beans.xml nicht mehr in allen Fällen notwendig. Darauf gehe ich später noch genauer ein.

Listing 2.4 zeigt den Deskriptor für die CDI-Version 1.0. Hier musste der Deskriptor für Webanwendungen im Verzeichnis WEB-INF stehen. Seit 1.1 ist auch WEB-INF/classes/META-INF erlaubt, was die Platzierung im Vergleich zu anderen Anwendungstypen vereinheitlicht.

<?xml version="1.0"?>
<beans xmlns=http://java.sun.com/xml/ns/javaee
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

Listing 2.4: CDI-Deskriptor für die alte Version CDI 1.0

2.3.2 Field Injection

Die Nutzung einer derart bereitgestellten Klasse in einer weiteren CDI Bean kann durch Injektion in ein Feld der Bean geschehen. Dazu wird die betroffene Instanzvariable mit @Inject6 annotiert (Listing 2.5).

public class DemoModel
{
@Inject
private GreetingBean greetingBean;


public String getHelloWorld()
{
return this.greetingBean.getGreeting() + ", Welt!";
}

Listing 2.5: Injektion in eine Instanzvariable

2.3.3 Bean Type

Es fällt auf, dass zur Injektion kein Name o. ä. verwendet wird, sondern offensichtlich allein der Typ des Injektionsziels für die Zuordnung ausreichend ist. Das ist ein entscheidendes Konzept, das die Injektion nicht passend getypter Objekte verhindert. Der Typ des Injektionsziels muss mit einem Bean Type des injizierten...

Blick ins Buch
Inhaltsverzeichnis
Inhaltsverzeichnis5
Vorwort13
Kapitel 1 – Java EE im Überblick15
1.1Aufgabenstellung15
1.2Architekturmodell15
1.3Anwendungsbestandteile und Formate16
1.4Profile18
1.5Plattformen19
2CDI21
2.1Was ist das?21
2.2Wozu braucht man das?21
2.3Bereitstellung und Injektion von Beans24
2.3.1CDI Beans24
2.3.2Field Injection25
2.3.3Bean Type26
2.3.4Method Injection27
2.3.5Constructor Injection28
2.3.6Bean Name29
2.3.7Bean Scan30
2.4Lifecycle Callbacks31
2.5Qualifier32
2.6Alternatives34
2.7Nutzung der Java-EE-Umgebung36
2.7.1Java EE Resources36
2.7.2Built-in Beans37
2.8Producer und Disposer38
2.8.1Producer Methods38
2.8.2Producer Fields39
2.8.3Disposer Methods40
2.8.4Introspektion des Injektionsziels41
2.9Kontexte und Scopes42
2.9.1Request Scope43
2.9.2Session Scope43
2.9.3Application Scope44
2.9.4Conversation Scope45
2.9.5Bean Proxies46
2.9.6Dependent Scope46
2.9.7Qualifier @New47
2.9.8Transaction Scope47
2.10Interceptors47
2.10.1Interceptor Class47
2.10.2Interceptor Binding48
2.10.3Aktivierung eines Interceptors50
2.10.4Transaktions-Interceptor51
2.11Decorators52
2.11.1Decorator Class52
2.11.2Aktivierung eines Decorators53
2.12Stereotypes53
2.13Eventverarbeitung55
2.13.1Events erzeugen56
2.13.2Events verarbeiten57
2.14Programmgesteuerter Zugriff auf CDI Beans60
2.14.1Injektion von Bean-Instanzen60
2.14.2Bean Manager61
2.15Integration von JPA, EJB und JSF62
2.16Portable Extensions63
2.16.1Entwicklung eigener Extensions64
2.16.2Verfügbare Extensions65
2.17CDI in SE-Umgebungen68
3Java Persistence71
3.1Worum geht es?71
3.1.1Lösungsansätze72
3.1.2Anforderungen an O/R Mapper73
3.1.3Entwicklung des Standards74
3.1.4Architektur von Anwendungen auf Basis von JPA75
3.2Die Basics76
3.2.1Entity-Klassen76
3.2.2Konfiguration der Persistence Unit78
3.2.3CRUD80
3.2.4Detached Objects82
3.2.5Entity-Lebenszyklus83
3.2.6Mapping-Annotationen für einfache Objekte84
3.2.7Custom Converter90
3.2.8Generierte IDs91
3.2.9Objektgleichheit94
3.2.10Basisklassen für Entity-übergreifende Aspekte97
3.3Objektrelationen98
3.3.1Unidirektionale n:1-Relationen99
3.3.2Unidirektionale 1:n-Relationen102
3.3.3Bidirektionale 1:n-Relationen103
3.3.4Uni- und bidirektionale 1:1-Relationen107
3.3.5Uni- und bidirektionale n:m-Relationen109
3.3.6Eager und Lazy Loading110
3.3.7Entity Graphs112
3.3.8Kaskadieren114
3.3.9Orphan Removal115
3.3.10Anordnung von Relationselementen116
3.4Queries118
3.4.1JPQL118
3.4.2Native Queries131
3.4.3Criteria Queries133
3.5Vererbungsbeziehungen141
3.5.1Mapping-Strategie „SINGLE_TABLE“142
3.5.2Mapping-Strategie „TABLE_PER_CLASS“144
3.5.3Mapping-Strategie „JOINED“145
3.5.4Non-Entity-Basisklassen146
3.5.5Polymorphe Queries147
3.6Dies und das147
3.6.1Secondary Tables147
3.6.2Zusammengesetzte IDs149
3.6.3Dependent IDs150
3.6.4Locking152
3.6.5Callback-Methoden und Listener156
3.6.6Bulk Update/Delete158
3.7Caching159
3.8Erweiterte Entity Manager163
3.8.1Extended Entity Manager163
3.8.2Application-managed Entity Manager165
3.9Java Persistence in SE-Anwendungen169
3.9.1Konfiguration der Persistence Unit im SE-Umfeld169
3.9.2Erzeugung eines Entity Managers in SE-Anwendungen170
3.9.3Transaktionssteuerung in Java-SE-Anwendungen171
3.9.4Schema-Generierung171
Kapitel 4 – Bean Validation175
4.1Aufgabenstellung175
4.2Plattformen und benötigte Bibliotheken176
4.3Validation Constraints177
4.3.1Attribute Constraints177
4.3.2Method Constraints178
4.3.3Vordefinierte Constraints178
4.3.4Transitive Gültigkeit179
4.3.5Constraint Composition180
4.3.6Constraint Programming181
4.4Objektprüfung183
4.5Internationalisierung der Validierungsmeldungen184
4.6Validierungsgruppen185
4.7Integration in JPA, CDI und JSF187
4.8Bean Validation in SE-Umgebungen189
5JavaServer Faces191
5.1Einsatzzweck von JSF191
5.2Die Basis: Java-Webanwendungen191
5.2.1Grundlegender Aufbau191
5.2.2Servlets192
5.2.3JavaServer Pages194
5.3JSF im Überblick195
5.3.1Model View Controller195
5.3.2Facelets196
5.3.3Request-Verarbeitung197
5.4Konfiguration der Webanwendung199
5.5Benötigte Bibliotheken und Plattformen200
5.6Programmierung der Views201
5.6.1JSF-Tag-Libraries201
5.7Managed Beans207
5.8Unified Expression Language210
5.8.1Methodenbindung211
5.8.2Wertebindung211
5.8.3Vordefinierte Variablen213
5.8.4Arithmetische Ausdrücke214
5.9Navigation214
5.9.1Regelbasierte Navigation214
5.9.2Inline-Navigation216
5.9.3Programmgesteuerte Navigation217
5.10Scopes217
5.11Verarbeitung tabellarischer Daten218
5.12Internationalisierung220
5.12.1Locale221
5.12.2Resource Bundles222
5.12.3Programmgesteuerter Zugriff auf Texte223
5.13Ressourcenverwaltung223
5.13.1Internationalisierung von Ressourcen225
5.14GET Support225
5.14.1Verarbeitung von GET-Request-Parametern225
5.14.2Erzeugung von GET-Requests226
5.15Eventverarbeitung226
5.15.1Faces Events227
5.15.2Phase Events228
5.15.3System Events229
5.16Konvertierung230
5.16.1Vordefinierte Konverter230
5.16.2Custom Converter232
5.16.3Ausgabe von Konverter- oder Validierungsmeldungen233
5.17Validierung234
5.17.1Validierung von Eingabewerten234
5.17.2Feldübergreifende Validierung235
5.18Immediate-Komponenten241
5.18.1„immediate“ für Eingabekomponenten242
5.18.2„immediate“ für Aktionskomponenten242
5.19AJAX242
5.19.1AJAX für Aktionselemente243
5.19.2AJAX-Events244
5.19.3AJAX-Callbacks245
5.19.4JavaScript API245
5.20Templating mit Facelets246
5.20.1Template247
5.20.2Template Client247
5.20.3Mehrstufige Templates248
5.20.4Mehrere Templates pro Seite249
5.21Eigene JSF-Komponenten250
5.21.1Composite Components250
5.21.2Composite Components mit Backing Beans255
5.22Faces Flows256
5.22.1Einfache, konventionsbasierte Flows257
5.22.2Deskriptorbasierte Flows258
5.22.3Producer-basierte Flows259
5.22.4Flow Scope260
5.22.5Extern definierte Flows261
5.23Resource Library Contracts261
5.24Exception Handling262
5.25Komponentenbibliotheken264
5.26Security265
5.26.1Log-in-Konfiguration265
5.26.2Securityrollen266
5.26.3Zugriffsregeln267
6Enterprise JavaBeans269
6.1Aufgabenstellung269
6.2Aufbau von Enterprise JavaBeans269
6.2.1EJB-Typen270
6.2.2EJB Lifecycle272
6.3EJB Deployment272
6.4Lokaler Zugriff auf Session Beans273
6.4.1Local Interface274
6.4.2No-Interface View274
6.5Remote-Zugriff275
6.5.1Remote Interface275
6.5.2Eintrag von EJBs im Namensdienst des Servers277
6.5.3Remote Lookup und clientseitige Nutzung von EJBs278
6.6Transaktionssteuerung279
6.6.1Transaction Management und Transaction Attribute279
6.6.2Application und System Exceptions281
6.6.3@Transactional vs. EJB Transactions281
6.7Asynchrone Methoden282
6.8Timer283
6.9Security285
6.9.1Deklarative Security285
6.9.2Programmgestützte Security287
Kapitel 7 – RESTful Web Services289
7.1Hintergrund289
7.2REST-Prinzipien290
7.3JAX-RS291
7.3.1REST Application291
7.3.2Ressourcen292
7.3.3GET293
7.3.4PUT297
7.3.5POST298
7.3.6DELETE300
7.3.7Extended Path Expressions301
7.3.8Parameter-Injection301
7.3.9Subresource Locators305
7.3.10Entity Provider306
7.3.11Content Negotiation309
7.3.12Exception Handling312
7.3.13Clients314
8Ein „Real World“-Projekt319
8.1Aufgabenstellung319
8.2Anwendungsarchitektur321
8.3Persistenz323
8.4Views332
8.5Fachliche Injektion336
Stichwortverzeichnis339

Weitere E-Books zum Thema: Informatik - Algorithmen - Softwaresysteme

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Softwaretechnik

E-Book Softwaretechnik
Format: PDF

Software-Projekte geraten oft in Schwierigkeiten: Zeit und Budget werden überschritten; das Projekt tritt auf der Stelle; im schlimmsten Fall wird es ohne Ergebnis abgebrochen. Manche…

Software Engineering

E-Book Software Engineering
Architektur-Design und Prozessorientierung Format: PDF

Das Lehrbuch behandelt alle Aspekte der Software-Entwicklung, besonders aber Methoden und Richtlinien zur Herstellung großer und qualitativ hochwertiger Softwareprodukte. Es vermittelt das zur…

Software Engineering

E-Book Software Engineering
Architektur-Design und Prozessorientierung Format: PDF

Das Lehrbuch behandelt alle Aspekte der Software-Entwicklung, besonders aber Methoden und Richtlinien zur Herstellung großer und qualitativ hochwertiger Softwareprodukte. Es vermittelt das zur…

Weitere Zeitschriften

cards Karten cartes

cards Karten cartes

Die führende Zeitschrift für Zahlungsverkehr und Payments – international und branchenübergreifend, erscheint seit 1990 monatlich (viermal als Fachmagazin, achtmal als ...

Das Hauseigentum

Das Hauseigentum

Das Hauseigentum. Organ des Landesverbandes Haus & Grund Brandenburg. Speziell für die neuen Bundesländer, mit regionalem Schwerpunkt Brandenburg. Systematische Grundlagenvermittlung, viele ...

Gastronomie Report

Gastronomie Report

News & Infos für die Gastronomie: Tipps, Trends und Ideen, Produkte aus aller Welt, Innovative Konzepte, Küchentechnik der Zukunft, Service mit Zusatznutzen und vieles mehr. Frech, offensiv, ...

EineWelt

EineWelt

Lebendige Reportagen, spannende Interviews, interessante Meldungen, informative Hintergrundberichte. Lesen Sie in der Zeitschrift „EineWelt“, was Menschen in Mission und Kirche bewegt Man kann ...

VideoMarkt

VideoMarkt

VideoMarkt – besser unterhalten. VideoMarkt deckt die gesamte Videobranche ab: Videoverkauf, Videoverleih und digitale Distribution. Das komplette Serviceangebot von VideoMarkt unterstützt die ...

FileMaker Magazin

FileMaker Magazin

Das unabhängige Magazin für Anwender und Entwickler, die mit dem Datenbankprogramm Claris FileMaker Pro arbeiten. In jeder Ausgabe finden Sie von kompletten Lösungsschritten bis zu ...