Dies ist der zweite Artikel in meiner Tutorial-Reihe zu SpringRoo 1.2.0 in der die Beispiel-Anwendung "photooapp" entwickelt wird.
Vorbedingungen
In diesem Beitrag geht es um die initiale Erstellung der Roo-Anwendung. Hierfür müssen folgende Vorbedingungen erfüllt sein:
- Java Development Kit (JDK) 6 oder höher ist installiert und im "PATH"
- SpringRoo 1.2.0.M1 wurde heruntergeladen und installiert
- Apache Maven wurde heruntergeladen und installiert
- lokaler MySQL 5.1 Server wurde installiert und gestartet
- Initiales Setup-Skript für MySQL-Datenbank und -Benutzer wurde ausgeführt
Lokalen Datenbankserver installieren (falls notwendig)
Wir gehen davon aus, dass die Anwendung später mit einer MySQL 5.1-Datenbank betrieben werden soll, die auf dem gleichen Server läuft wie die Anwendung.
Um eine ähnliche Umgebung für die Entwicklung zu verwenden, benötigen wir eine lokale MySQL-Installation. Für diejenigen ohne eine lokale Installation ist die wohl einfachste und schnellste Art dies zu erreichen wahrscheinlich das XAMPP-Paket von Apachefriends. Es kann über die URL http://www.apachefriends.org/de/xampp.html heruntergeladen werden.
Ist die Software installiert und der MySQL-Datenbankserver gestartet, können mit den folgenden beiden Befehlen die Datenbank und der zugehörige Benutzer erstellt werden. Diese Befehle sind auch im MySQL-Setup-Skript enthalten:
$ /Applications/XAMPP/xamppfiles/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.44 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE DATABASE photooapp DEFAULT CHARSET=utf8;
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.44 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE DATABASE photooapp DEFAULT CHARSET=utf8;
mysql> GRANT ALL ON photooapp.* TO photooapp@localhost IDENTIFIED BY 'pho!00App';
mysql> exit
Bye
$
Nun sollten alle notwendigen Vorbedingungen erfüllt sein und wir können in der SpringRoo shell weitermachen.
Datenmodell-Klassen in SpringRoo erstellen
Für die Demo-Anwendung "Photooapp" wurde folgendes (vorläufiges) Datenmodell erstellt, das wir nun in SpringRoo umsetzen wollen:
Hierzu öffnen wir die SpringRoo Shell:
ahe:(git)photooapp[master]/$ ~/dev/tools/spring-roo-1.2.0.M1/bin/roo.sh
____ ____ ____
/ __ \/ __ \/ __ \
/ /_/ / / / / / / /
/ _, _/ /_/ / /_/ /
/_/ |_|\____/\____/ 1.2.0.M1 [rev 1fa252f]
Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
...
roo> script --file log.roo --lineNumbers true
____ ____ ____
/ __ \/ __ \/ __ \
/ /_/ / / / / / / /
/ _, _/ /_/ / /_/ /
/_/ |_|\____/\____/ 1.2.0.M1 [rev 1fa252f]
Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
...
roo> script --file log.roo --lineNumbers true
Nun gibt es zwei Möglichkeiten:
a) Man tippt die folgenden Befehle auf der Roo-Shell ein:
project de.goldstift.photoo
jpa setup --provider HIBERNATE --database MYSQL --databaseName photooapp --userName photooapp --hostName 127.0.0.1 --password pho!00App
entity --class ~.domain.Tag --activeRecord false --testAutomatically
field string --fieldName name --notNull --sizeMin 2
field string --fieldName lowerCaseName --notNull --sizeMin 2
entity --class ~.domain.Person --activeRecord false --testAutomatically
field string --fieldName lastname --notNull --sizeMin 2
field string --fieldName firstname
field string --fieldName nickname --notNull
entity --class ~.domain.Event --activeRecord false --testAutomatically
field string --fieldName name --notNull --sizeMin 2
field date --fieldName fromDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"
field date --fieldName toDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"
entity --class ~.domain.Folder --activeRecord false --testAutomatically
field string --fieldName title
field date --fieldName createDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"
field string --fieldName systemPath --notNull --sizeMin 1
field string --fieldName urlPath --notNull --sizeMin 1
field boolean --fieldName writable --primitive false
entity --class ~.domain.PhotoFile --activeRecord false --testAutomatically
field reference --fieldName folder --type ~.domain.Folder --cardinality MANY_TO_ONE --fetch EAGER
field string --fieldName filename --notNull
field number --fieldName width --notNull --type java.lang.Short
field number --fieldName height --notNull --type java.lang.Short
entity --class ~.domain.Photo --activeRecord false --testAutomatically
field string --fieldName title
field string --fieldName description
field string --fieldName thumbnail --notNull
field reference --fieldName thumbnailFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field reference --fieldName previewFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field reference --fieldName originalFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field date --fieldName importDate --type java.util.Date --dateTimeFormatPattern "MS"
field date --fieldName shotDate --type java.util.Date --dateTimeFormatPattern "MS"
field set --fieldName tags --type ~.domain.Tag --cardinality MANY_TO_MANY --fetch EAGER
field set --fieldName persons --type ~.domain.Person --cardinality MANY_TO_MANY --fetch EAGER
field set --fieldName events --type ~.domain.Event --cardinality MANY_TO_MANY --fetch EAGER
repository jpa --interface ~.repository.TagRepository --entity ~.domain.Tag
repository jpa --interface ~.repository.EventRepository --entity ~.domain.Event
repository jpa --interface ~.repository.PersonRepository --entity ~.domain.Person
repository jpa --interface ~.repository.PhotoRepository --entity ~.domain.Photo
service --interface ~.service.TagService --entity ~.domain.Tag
service --interface ~.service.EventService --entity ~.domain.Event
service --interface ~.service.PersonService --entity ~.domain.Person
service --interface ~.service.PhotoService --entity ~.domain.Photo
json all
web mvc setup
web mvc all --package ~.web
entity --class ~.domain.Tag --activeRecord false --testAutomatically
field string --fieldName name --notNull --sizeMin 2
field string --fieldName lowerCaseName --notNull --sizeMin 2
entity --class ~.domain.Person --activeRecord false --testAutomatically
field string --fieldName lastname --notNull --sizeMin 2
field string --fieldName firstname
field string --fieldName nickname --notNull
entity --class ~.domain.Event --activeRecord false --testAutomatically
field string --fieldName name --notNull --sizeMin 2
field date --fieldName fromDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"
field date --fieldName toDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"
entity --class ~.domain.Folder --activeRecord false --testAutomatically
field string --fieldName title
field date --fieldName createDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"
field string --fieldName systemPath --notNull --sizeMin 1
field string --fieldName urlPath --notNull --sizeMin 1
field boolean --fieldName writable --primitive false
entity --class ~.domain.PhotoFile --activeRecord false --testAutomatically
field reference --fieldName folder --type ~.domain.Folder --cardinality MANY_TO_ONE --fetch EAGER
field string --fieldName filename --notNull
field number --fieldName width --notNull --type java.lang.Short
field number --fieldName height --notNull --type java.lang.Short
entity --class ~.domain.Photo --activeRecord false --testAutomatically
field string --fieldName title
field string --fieldName description
field string --fieldName thumbnail --notNull
field reference --fieldName thumbnailFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field reference --fieldName previewFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field reference --fieldName originalFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field date --fieldName importDate --type java.util.Date --dateTimeFormatPattern "MS"
field date --fieldName shotDate --type java.util.Date --dateTimeFormatPattern "MS"
field set --fieldName tags --type ~.domain.Tag --cardinality MANY_TO_MANY --fetch EAGER
field set --fieldName persons --type ~.domain.Person --cardinality MANY_TO_MANY --fetch EAGER
field set --fieldName events --type ~.domain.Event --cardinality MANY_TO_MANY --fetch EAGER
repository jpa --interface ~.repository.TagRepository --entity ~.domain.Tag
repository jpa --interface ~.repository.EventRepository --entity ~.domain.Event
repository jpa --interface ~.repository.PersonRepository --entity ~.domain.Person
repository jpa --interface ~.repository.PhotoRepository --entity ~.domain.Photo
service --interface ~.service.TagService --entity ~.domain.Tag
service --interface ~.service.EventService --entity ~.domain.Event
service --interface ~.service.PersonService --entity ~.domain.Person
service --interface ~.service.PhotoService --entity ~.domain.Photo
json all
web mvc setup
web mvc all --package ~.web
oder
b) man importiert die Befehle als Roo-Skript (speichern als "log.roo") mit Hilfe des folgenden Befehls:
roo> script --file log.roo --lineNumbers true
Anschließend kann die Anwendung über die folgenden Maven Befehle gebaut und gestartet werden:
ahe:(git)photooapp[master]/$ mvn clean package
(...)
ahe:(git)photooapp[master]/$ mvn jetty:run
Durch letzteren Befehl wird die Anwendung in einem Jetty ApplicationServer gestartet, wodurch sie unter http://localhost:8080/photooapp verfügbar sein sollte.
Die komplette Anwendung ist bei github verfügbar unter https://github.com/aheusingfeld/photooapp
Weiterführende Links
- Photooapp Quellcode bei github: https://github.com/aheusingfeld/photooapp
- SpringRoo Webseite: www.springsource.org/roo
- SpringRoo Downloads bei Github: https://github.com/SpringSource/spring-roo/archives/master
- Apache Maven downloads: http://maven.apache.org/download.html
Weitere Artikel der Reihe
- Starting PhotooApp - A SpringRoo tutorial application
- SpringRoo: Entity-Klassen und JPA-Repositories mit SpringRoo erstellen
- SpringRoo: Howto translate Java exceptions to user-friendly error messages (English)
- SpringRoo: Spring JS/ Dojo durch jQuery ersetzen
- SpringRoo: Standard-Auswahllisten in Textfelder mit dynamischen Vorschlagswerten umbauen
- SpringRoo: Excel-Download für alle Listen-Seiten mit minimalem Aufwand
- SpringRoo: Dynamische Finder mit Hilfe der JPA Criteria API
- SpringRoo: Standardwebseiten auf smartphone-kompatibles HTML5 aktualisieren