2015-01-06 9 views

Odpowiedz

20

Uproszczenie przykładowo w Księdze Vaadin

Book Of Vaadin obejmuje rozdział pchania, w tym przykładzie za pomocą Vaadin Charts.

Poniżej znajduje się mój kod. Bazując na powyższym przykładzie Vaadin Charts, uprościłem go, zastępując użycie obiektu Chart prostym obiektem Label. Etykieta aktualizuje się co sekundę, informując o aktualnej godzinie.

screen shot of example Vaadin app telling current time in UTC as text

Na przykład użycie Only - Użyj Executor w projekcie świecie rzeczywistym

zastrzeżenie: Mój przykład poniżej jest zbudowany dla uproszczenia, nieprzeznaczonych jako kod produkcji. Spanie w wątku to prosty i niezręczny sposób na zarządzanie zaplanowaną pracą gwintowaną. Java zapewnia obiekt Executor dla tego rodzaju pracy. W projekcie realistycznym użyłbym raczej obiektuniż pojedynczego obiektu do spania, aby zaplanować nasze zadanie (opowiedzenia o czasie). Powiązana wskazówka: Nigdy nie używaj urządzenia Timer w środowisku serwletu. Aby uzyskać pełniejszy i bardziej realistyczny przykład, zobacz my Answer na podobne pytanie dotyczące Push z Vaadin.

wziąłem inne skróty w tym przykładzie, takie jak: I miejsce widget Label bezpośrednio na UI podczas pracy w świecie rzeczywistym użyłby Layout zawierać Label.

Moja konfiguracja

Mój kod używa Vaadin 7.3.7 Java 8 Update 25 w NetBeans 8.0.2 i Tomcat 8.0.15 na Mac OS X 10.8.5 (Mountain Lion).

Technologia Push jest stosunkowo nowa, szczególnie odmiana WebSocket. Należy używać najnowsze wersje serwera WWW, takich jak ostatnich aktualizacjach Tomcat 7 lub 8.

Sposób korzystania z tego przykładu

Ten kod jest pojedynczy plik, plik MyUI.java. Aby użyć tego kodu:

  1. Utwórz nową domyślną aplikację Vaadin w swoim wybranym IDE.
  2. Ten przykład działa pomyślnie, przed modyfikacją.
  3. Wymień zawartość klasy MyUI za pomocą poniższego kodu.

@Push Adnotacja

Obok kodu w środku, trzeba pamiętać, jak dodaliśmy @Push adnotacji definicji MyUI klasy.

Przykładowy kod

package com.example.pushvaadinapp; 

import com.vaadin.annotations.Push; 
import com.vaadin.annotations.Theme; 
import com.vaadin.annotations.VaadinServletConfiguration; 
import com.vaadin.annotations.Widgetset; 
import com.vaadin.server.VaadinRequest; 
import com.vaadin.server.VaadinServlet; 
import com.vaadin.ui.Label; 
import com.vaadin.ui.UI; 
import javax.servlet.annotation.WebServlet; 

/** 
* © 2014 Basil Bourque. This source code may be used freely forever by anyone absolving me of any and all responsibility. 
* 
* +----------------------------+ 
* | NOT FOR PRODUCTION USE! | 
* +----------------------------+ 
*  Sleeping threads is an awkward way to manage scheduled background work. 
*  By the way, never use a 'Timer' in a Servlet environment. 
*  Use an Executor instead, probably a ScheduledExecutorService. 
*/ 
@Push 
@Theme ("mytheme") 
@Widgetset ("com.example.pushvaadinapp.MyAppWidgetset") 
public class MyUI extends UI 
{ 

    Label label = new Label("Now : "); 

    @Override 
    protected void init (VaadinRequest vaadinRequest) 
    { 
     // Put a widget on this UI. In real work we would use a Layout. 
     setContent(this.label); 

     // Start the data feed thread 
     new FeederThread().start(); 
    } 

    @WebServlet (urlPatterns = "/*" , name = "MyUIServlet" , asyncSupported = true) 
    @VaadinServletConfiguration (ui = MyUI.class , productionMode = false) 
    public static class MyUIServlet extends VaadinServlet 
    { 
    } 

    public void tellTime() 
    { 
     label.setValue("Now : " + new java.util.Date()); // If Java 8, use: Instant.now(). Or, in Joda-Time: DateTime.now(). 
    } 

    class FeederThread extends Thread 
    { 

     int count = 0; 

     @Override 
     public void run() 
     { 
      try { 
       // Update the data for a while 
       while (count < 100) { 
        Thread.sleep(1000); 

        // Calling special 'access' method on UI object, for inter-thread communication. 
        access(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          count ++; 
          tellTime(); 
         } 
        }); 
       } 

       // Inform that we have stopped running 
       // Calling special 'access' method on UI object, for inter-thread communication. 
       access(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         label.setValue("Done."); 
        } 
       }); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+2

jest potrzebny? zgaduję: nie. także po co zawracać sobie głowę (i wyjaśniać cały akapit) java.time, kiedy celem jest posiadanie minimalnego przykładu roboczego? wystarczy użyć licznika lub 'new Date(). toString()'. w swoim pytaniu stwierdzasz, że chcesz mieć prostą aplikację testową, w której możesz przetestować te rzeczy. dlaczego więc nie umieścić swojego ** całego projektu ** (łącznie z twoim pom/gradle/younameit) na Github dla użytkowników SO, którzy znajdą twoje pytanie? – cfrick

+0

@cfrick Wszystkie dobre punkty; Dziękuję Ci. [A] Zabiłem użycie i dyskusję w czasie java. [B] Jeśli chodzi o zestaw widgetów, ta adnotacja jest domyślna w nowym projekcie wielomodułowym stworzonym przez [archetyp nowego Mavena] (https://vaadin.com/blog/-/blogs/vaadin-7-3-7 i-new-maven-archetypes), dostarczone w aktualizacji 1.1.3 do [Vaadin Plugin For NetBeans] (http://plugins.netbeans.org/plugin/50531/vaadin-plug-in-for-netbeans). Co więcej, niejasny dokument oznacza, że ​​zestaw widgetów (i motyw) jest teraz automatycznie optymalizowany w kompilacji "produkcji" modułu. Więc zostawię to na swoim miejscu. –

1

Here jest prosty, ale pełen Vaadin 8 przykład, który pokazuje, jak używać Push serwera i wiadomości Java EE API do wysyłania wiadomości między różnymi UIs pomocą Broadcaster pattern opisaną w Vaadin docs. Jeśli nie jesteś zainteresowany komunikowaniem się z innymi użytkownikami, spójrz na numer ReceiveMessageUI.

W zasadzie to wszystko sprowadza się do następującego:

  1. opisanie Vaadin UI z @Push umożliwienia pchnięcie serwera (domyślnie pośrednictwem połączenia websocket) aktualizacje
  2. Wrap UI z access() gdy dostęp do niej z innych wątków, wysyłanie aktualizacji odbywa się automatycznie domyślnie:

    getUI().access(() -> layout.addComponent(new Label("Hello!"))); 
    
  3. Użyj Broadcaster pattern, aby publikować wiadomości do innych użytkowników i subskrybować ich wiadomości.

+0

W "Wzorze nadawcy" masz na myśli wzorzec [* Observer *] (https://en.wikipedia.org/wiki/Observer_pattern) lub coś innego? –

+1

Coś innego, mam na myśli [wzór Broadcastera] (https://github.com/vaadin/framework/blob/master/documentation/advanced/advanced-push.asciidoc#the-broadcaster) udokumentowane w dokumentach Vaadin. – mrts

Powiązane problemy