JavaFX Quo vadis Java? Na COOLuary!
Dec 12

Ostatnimi czasy można zauważyć rosnącą popularność aplikacji typu RIA. Istnieje wiele technologii służących do tworzenia takich aplikacji – najważniejsze z nich to Adobe Flex oraz JavaFX. O ile pierwsza z nich ma już swoją pozycję na runku, to o drugiej jeszcze nie słychać zbyt dużo w kontekście portalowych stron WWW.

Jak wiadomo, w przypadku nowych technologii zawsze najtrudniejszy jest ten ‘pierwszy krok’:

  • jak skonfigurować środowisko?
  • jak stworzyć szkielet projektu?
  • jak to wszystko spiąć żeby dobrze działało?

Na wszystkie powyższe pytania i problemy jest jednak prosta i szybka odpowiedź: Exadel Flamingo.

Na problemy – Flamingo

Flamingo to zestaw bibliotek i komend służących jako pomoc w wygenerowaniu i konfiguracji szkieletu aplikacji typu RIA. Obsługa generatora Flamingo jest bardzo prosta. Polega na odpowiedzi na kilka pytań zadawanych w formie wizarda – na ich podstawie jest generowany odpowiedni projekt. Flamingo bazuje na Mavenie i każdy wygenerowany projekt jest w tej konwencji. Dzięki temu bardzo prosto można odnaleźć się w projekcie – oczywiście dla ludzi znających tą konwencję, ale chyba w dzisiejszych czasach znajomość Mavena jest raczej powszechna ;-)

Wygenerowany kod szkieletu posiada pełne wsparcie i jest skonfigurowany do pracy pomiędzy Flexem lub JavąFX a JBoss Seamem lub Springiem. Każdy znajdzie więc coś dla siebie, gdyż Seam to raczej podstawowa sprawa jeżeli chodzi o aplikacje EJB3, a Spring – to już klasyka. Wybór jest więc zatem ograniczony do najbardziej popularnych aktualnie technologii i oznacza, że w ogromnej większości przypadków takiego ograniczenia nie trzeba sztucznie obchodzić.

Wygenerowany szkielet jest naprawdę kompletny, Flamingo zajmuje się tutaj wszystkim:

  • generuje odpowiednie klasy (klasę) odpowiedzialne za (bardzo prosty) model danych
  • generuje warstwy aplikacji, włączając w to serwisy oraz DAO oraz konfiguruje całą komunikację, począwszy od interfejsu użytkownika a kończąc na bazie danych
  • generuje strukturę aplikacji webowej, z wszystkimi wymaganymi plikami
  • generuje podstronę logowania, przez co mechanizm autoryzacji jest już gotowy do rozszerzenia
  • generuje szkielet do testów oraz podstawowy test

Jak to działa?

Odpalmy zatem Flamingo – robimy to poprzez uruchomienie konsoli i wpisaniu ‘flamingo create project’ (binaria flamingo muszą być dostępne). Famingo zacznie ściągać wszystkie biblioteki, o ile ich już nie posiadamy w naszym lokalnym repozytorium Mavenowym i następnie uruchamia konsolowego wizarda. Nie będę opisywał kolejnych pytań, bo są raczej oczywiste – zamieszczę tylko zrzut z mojej konsoli:

Please choose the type of application to generate (flamingo-seam, flamingo-spring):[flamingo-spring]
flamingo-spring
Please enter the location in which your new application will be created (i.e. c:/java/development):
S:/_Projects/Java/J2EE
Enter the project name (e.g. myproject):
Flex
Please enter the root package name for your project (e.g. com.mydomain.myproject): [pl.j2ee.flamingo]
pl.j2ee.flex
Will this project have Flex or JavaFX user interface? (flex, javafx): [flex]
flex
Will this project use Hessian or AMF protocol? (amf, hessian): [amf]
amf
What kind of database are you using? (hsql, mysql, oracle, postgres, mssql, db2, sybase, none): [hsql]
hsql
Enter the JDBC URL for your database (e.g. jdbc:hsqldb:.): [jdbc:hsqldb:flex]
jdbc:hsqldb:flex
Enter database username: [sa]
sa
Enter database password: []

Do you want to update the database schema each time you deploy? (y, n): [y]
y
Enter the entity class name (Flex source files to view and modify entities will be generated as well):
Department
-------------------------------------------------------------------------------------
    G e n e r a t i n g   A n d r o M D A   P o w e r e d   A p p l i c a t i o n
-------------------------------------------------------------------------------------
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/flamingoproject.properties'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/flex/pom.xml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/flex/src/main/flex/pl/j2ee/flex/view/DepartmentManager.mxml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/flex/src/main/flex/pl/j2ee/flex/vo/Department.as'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/flex/src/main/flex/main.mxml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/flex/src/main/resources/services-config.xml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/pom.xml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/readme.txt'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/pom.xml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/java/pl/j2ee/flex/Department.java'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/java/pl/j2ee/flex/DepartmentDAO.java'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/java/pl/j2ee/flex/DepartmentDAOImpl.java'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/java/pl/j2ee/flex/service/DepartmentService.java'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/java/pl/j2ee/flex/service/ILoginService.java'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/java/pl/j2ee/flex/service/LoginService.java'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/resources/applicationContext-test.xml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/resources/applicationContext.xml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/resources/hibernate.cfg.xml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/webapp/index.html'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/main/webapp/WEB-INF/web.xml'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/test/java/pl/j2ee/flex/dao/DepartmentDAOTest.java'
    Output: 'file:/S:/_Projects/Java/J2EE/Flex/web/src/test/java/pl/j2ee/flex/DataSourceTestCase.java'
-------------------------------------------------------------------------------------
    New application generated to --> 'file:/S:/_Projects/Java/J2EE/Flex/'
-------------------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 minute 24 seconds
[INFO] Finished at: Fri Nov 28 14:36:08 CET 2008
[INFO] Final Memory: 10M/20M
[INFO] --------------------------------------------------------------

No, i tyle :-) Proste, prawda?

Wygenerowany kod

Przechodzimy teraz do folderu gdzie wygenerował się nasz szkielet. Po wejściu do niego możemy zbudować cały projekt – poprzez ‘mvn clean install’. Po chwili – naszym oczom ukazuje się jakże pożądany komunikat: „Build Successful” (na konsoli widać także przeprowadzony test zapisu naszej klasy modelowej – także mechanizm testowania działa poprawnie). Świetnie, mamy coś co działa i się buduje, ale co tak naprawdę wygenerowaliśmy? Spróbujmy zatem zdeplyować naszą aplikację. Po wrzuceniu wara do Tomcata niestety okazuje się, że nie ma róży bez ognia – konsola krzyczy że nie mamy wymaganej biblioteki do HSQL. Przechodzimy zatem do odpowiedniego pliku POM (w web) i po jego otworzeniu – widzimy co jest nie tak. Usuwamy zbędną linijkę ‘<scope>test</scope>’ dla dependency HSQLDB, zapisujemy zmiany i ponownie budujemy projekt (‘mvn clean install’). Ponownie wrzucamy wara do tomcata i już – aplikacja wstała poprawnie!

Nie pozostaje nic innego jak teraz przejść do przeglądarki i zobaczyć nasze dzieło. Po uruchomieniu odpowiedniego adresu naszym oczom ukazuje się piękna strona we flashu, która żąda od nas danych do zalogowania. Dane te nie są istotne, to i tak jest stub – metoda do autoryzacji zawsze zwraca ‘true’ ;-) Po poprawnym zalogowaniu przechodzimy do jedynej dostępnej strony – listy obiektów domenowych (w moim przypadku ‘Department’). Mamy tutaj możliwość przeglądania wszystkich wpisów oraz funkcjonalności dodania nowego, edycji oraz usunięcia istniejącego. Sama lista oferuje jeszcze możliwość sortowania wyników. Ostatnią funkcjonalnością jest jeszcze oferowana przez guzik ‘Logout’ opcja wylogowania się z systemu. I to by było na tyle!

To działa!

Jak widać z powyższego tekstu – wystarczy ściągnąć Flamingo, rozpakować, odpalić wizarda i mamy już gotowy szkielet aplikacji RIA. Należy przy tym podkreślić, że w całym procesie od momentu pomysłu o szkielecie aplikacji flexowej do jej uruchomienia ani razu nie potrzebowalismy uruchomić żadnego IDE. Niesamowite! Co więcej, wygenerowany szkielet ten jest kompletny i tak naprawdę jest już w pełni działającą aplikacją o minimalnej funkcjonalności, przedstawiającą funkcjonalności bardziej na zasadzie ‘how to’. Wystarczy zaimplementować poprawne logowanie oraz rozszerzyć model dziedziny – i mamy w bardzo przystępny sposób pokazaną drogę w świat RIA.

Podziel się z innymi:
  • Wykop
  • Digg
  • del.icio.us
  • StumbleUpon
  • Slashdot

Leave a Reply

Security Code: