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 🙂