Vaadin 7 i Scala w jednym stali pomie
Wpis będzie o rzeczach podstawowych.
Vaadin 7
Wyszło już pewien czas temu. Zmian w stosunku do poprzedniej „dużej” wersji jest dużo. Dla nas na chwilę obecną ważne jest, że nie dziedziczymy po klasie Application, a po klasie UI. Zresztą ta pierwsza klasa nadal jest obecna w API ponieważ twórcy chcą utrzymać zgodność wsteczną.
Pierwszym krokiem jest wygenerowanie sobie aplikacji w mavenie, czyli piszemy mvn archetype:generate i przeklikujemy się przez odpowiednie pola. W efekcie otrzymujemy prostą aplikację Vaadin z przyciskiem, który pokazuje labelkę.
Scala
Jak mamy już gotowy projekt Vaadin czas na dorzucenie elementu Scali. W tym celu w pom.xml dopisujemy:
Listing 1. zawartość pom.xml
<dependencies><dependency><groupid>org.scala-lang</groupid><artifactid>scala-library</artifactid><version>2.10.1</version></dependency></dependencies><plugins><plugin><groupid>org.scala-tools</groupid><artifactid>maven-scala-plugin</artifactid><executions><execution><goals><goal>compile</goal><goal>testCompile</goal></goals></execution></executions><configuration><sourcedir>src/main/java</sourcedir><jvmargs><jvmarg>-Xms64m</jvmarg><jvmarg>-Xmx1024m</jvmarg></jvmargs></configuration></plugin></plugins>
Starczy. Po uruchomieniu jettego: mvn package jetty:run otrzymamy działającą aplikację.
Czas trochę pogrzebać w kodzie. Najpierw wywalamy javową klasę MyVaadinUI i zastępujemy ją klasą scalową. By nie było zbyt łatwo nasz projekt będzie to prosty kalkulator tzn. będziemy podawać w polu tekstowym kolejne liczby, które na koniec zsumujemy na scalową modłę.
Listing 2. zawartość MyVaadinUI.scala
class MyVaadinUI extends UI {
var liczby: List[Int] = List(0)
override def init(request: VaadinRequest) {
val layout = new VerticalLayout()
layout.setMargin(true)
setContent(layout)
val liczbyLabel = new Label("0")
val input: TextField = new TextField("Podaj liczbę")
val kolejnaBtn: Button = new Button("Kolejna")
kolejnaBtn.addClickListener(new Button.ClickListener {
def buttonClick(event: Button.ClickEvent) {
liczby ::= input.getValue.toInt
liczbyLabel.setValue(liczbyLabel.getValue + "+" + input.getValue)
input.setValue("")
}
})
val sumaBtn = new Button("Suma")
sumaBtn.addClickListener(new Button.ClickListener {
def buttonClick(event: Button.ClickEvent) {
// sumowanie liczb
val wynik: Label = new Label(liczby.foldLeft(0) {
(a, b) => a + b
}.toString)
layout.addComponent(wynik)
liczby = List(0)
liczbyLabel.setValue("0")
}
})
layout.addComponent(input)
layout.addComponent(kolejnaBtn)
layout.addComponent(liczbyLabel)
layout.addComponent(sumaBtn)
}
}
Tu nie ma żadnej magii.
Na koniec mała niespodzianka
Jeżeli pracujecie sobie w domu i na własny użytek to zapewne szybko zauważycie, że najbardziej bolesną zmianą w stosunku do wcześniejszej wersji pluginu Vaadin do mavena jest domyślne włączenie zadania update-widgetset w fazie package co powoduje odpalenie kompilatora GWT i tym samym znacząco wydłuża czas potrzebny na uruchomienie serwera Jetty. By pozbyć się tego problemu wystarczy przystąpić do programu myJRebel i wykupienie licencji Social za całe 0 USD. W czym tkwi haczyk? Pozwalamy ZeroTurnaround na publikowanie na naszym Twitterze albo Facebooku. IMO cena jest niewielka, a korzyści ogromne.
Tu uwaga, by JRebel prawidłowo działał z mavenem i jettym trzeba pamiętać o przekompilowaniu klas w IDE (ja używam Idei i Eclipse i nie ma problemów z konfiguracją) oraz podpięciu JRebel jako agenta JVM na poziomie zmiennych systemowych JAVA\_OPTS i MAVEN\_OPTS. Co ciekawe maven nie korzysta z JAVA\_OPTS 🙂
I to chyba na tyle 🙂