Najpierw musimy stworzyć nową aplikacje w App Engine. Podajemy nazwę (w moim przypadku wolna okazała się dopiero nazwa 'todo-flex') oraz krótki opis.
Gdy w chmurze mamy już stworzoną aplikacje możemy przejść do tworzenia aplikacji w Grails.
Tworzymy aplikacje:
grails create-app todo-flex
Po przejściu do katalogu zaczynamy konfigurcje pluginów.
App Engine używa JDO lub JPA dlatego dla pewności usuwamy plugin Hibernate:
grails uninstall-plugin hibernate
Instalujemy plugin App Engine:
grails install-plugin app-engine
wybieramy JPA.
Instalujemy plugin umożliwiający korzystanie z GORM wraz z JPA:
grails install-plugin gorm-jpa
Ostatnim pluginem jest plugin dla Flexa:
grails install-plugin flex
Projekt mamy skonfigurowany czas na implementację.
Najpierw tworzymy klasę domenową:
grails create-domain-class com.mcz.ToDo
Kolejnym krokiem jest stworzenie serwisu:
grails create-service com.mcz.ToDo
W tym momencie możemy zaimportować projekt do Eclipse wybierając File/Import/General/Existing Projects into Workspace.
Wypełniamy klasę domenową kodem, w naszym przykładzie klasa com.mcz.ToDo bedzie miała nastepującą postać:
@Entity
class ToDo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id
@Basic
String Title
@Basic
String text
}
Jak widać jest to zwykłe ziarno JPA.
Serwis ToDoService ma następującą postać:
class ToDoService {
static expose = ['flex-remoting']
boolean transactional = true
def getToDosList() {
ToDo.list(sort:"dateInserted", order:"desc")
}
def save(todo){
todo.id = null
todo.dateInserted = new Date()
todo.save()
}
def deleteToDo(id){
def todo = ToDo.get(id);
todo.delete()
}
}Jest to standardowy serwis grailsowy, jedyne co jest w nim warte odnotowania, to statyczna lista expose = ['flex-remoting'] mówiąca to tym, że ten serwis będzie dostępny poprzez Flex RemoteObject.
To tyle jeśli chodzi o stronę serwerową czas na widok.
Nadajemy projektowi Flex Project Nature, pozostawiamy wszystkie ustawienia na default.
Tworzymy w ActionScript klasę odpowiedzialną za mapowanie obiektów ToDo tak aby mogły być przesyłane z serwera do widoku.Kod klasy powinien wyglądać tak:
package com.mcz
{
[Bindable]
[RemoteClass(alias="com.mcz.ToDo")]
public class ToDo
{
public function ToDo()
{
}
public var id:Number;
public var title:String;
public var text:String;
public var dateInserted:Date;
}
}W klasie nie ma nic specjalnego oprócz dwóch elementów:
1. [Bindable] - dzięki elementowi MetaData, jeśli wartość któregoś z pól zostanie zmieniona, nastąpi wygenerowanie zdarzenia.
2. [RemoteClass(alias="com.mcz.ToDo")] - wskazuje na który obiekt znajdujący się po stronie serwerowej dana klasa ma być mapowana.
W katalogu src znajduje się plik main.mxml to w nim tworzymy widok. Najciekawszym elementem jest konfiguracja RemoteObject pozwalająca wywoływać metody na serwisie ToDoService:
<mx:RemoteObject id="ro" destination="toDoService" fault="faultHandler(event)">
<mx:method name="getToDosList" result="getToDosListHandler(event)"/>
</mx:RemoteObject>
<mx:Script>
<![CDATA[
...
[Bindable]
private var todoList:ArrayCollection;
private function getToDosListHandler(event:ResultEvent):void{
todoList = event.result as ArrayCollection;
}
...
]]>
</mx:Script>
Mamy już stworzoną stronę serwerową oraz widok potrzebne jest jeszcze tylko kilka zmian w konfiguracji:
1. W pliku grails-app/conf/Config.groovy dodajemy linie flex.webtier.compiler.enabled = false, wyłączamy w ten sposób kompilację w runtimie dla plików mxml. W przeciwnym wypadku podczas uruchamiania aplikacji dostaniemy informację o tym, że serwlet próbuje zapisu na dysku co w App Engine jest niedozwolone.
2. W pliku web-app/WEB-INF/flex/service-config.xml:
a)Dodajemy
1. W pliku grails-app/conf/Config.groovy dodajemy linie flex.webtier.compiler.enabled = false, wyłączamy w ten sposób kompilację w runtimie dla plików mxml. W przeciwnym wypadku podczas uruchamiania aplikacji dostaniemy informację o tym, że serwlet próbuje zapisu na dysku co w App Engine jest niedozwolone.
2. W pliku web-app/WEB-INF/flex/service-config.xml:
a)Dodajemy
<system> <manageable>false</manageable> </system>
b) Aplikacje w App Engine hostowane są bez kontekstu dlatego musimy usunąć {context.root} z channel-definition
Ostatnią rzeczą jeśli chodzi o ustawienia projektu jest wskazanie kompilatorowi Flexa zmodyfikowanego pliku service-config.xml. Aby to zrobić klikamy prawym przyciskiem na projekcie i wybieramy Properies/Flex Compiler/ Additional compiler arguments dodajemy -services [ścieżka względna dla pliku main.mxml]/services-config.xml u mnie ten wpis ma postać -services ../web-app/WEB-INF/flex/services-config.xml.
Kompilujemy projekt do kartoteki web-app za pomocą Export Release Build i gotowe!
Teraz wystarczy tylko przetestować naszą aplikacje.
W konsoli będąc w kartotece projektu wpisujemy
W kolejnym wpisie pokaże jak wersjonować oraz umieszczać aplikacje w App Engine.
Kod aplikacji dostępny pod adresem:
http://svn.xp-dev.com/svn/blog_svn/
grails app-engine run
W kolejnym wpisie pokaże jak wersjonować oraz umieszczać aplikacje w App Engine.
Kod aplikacji dostępny pod adresem:
http://svn.xp-dev.com/svn/blog_svn/
Brak komentarzy:
Prześlij komentarz