{"id":7614,"date":"2019-06-28T10:14:22","date_gmt":"2019-06-28T08:14:22","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=7614"},"modified":"2023-01-20T14:20:56","modified_gmt":"2023-01-20T13:20:56","slug":"vaadin-roznice-miedzy-wersja-7-a-8","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/vaadin-roznice-miedzy-wersja-7-a-8\/","title":{"rendered":"Vaadin &#8211; r\u00f3\u017cnice mi\u0119dzy wersj\u0105 7 a 8"},"content":{"rendered":"\n<p>W tym artykule przedstawi\u0119 w spos\u00f3b og\u00f3lny technologi\u0119 Vaadin \u2013 framework w j\u0119zyku Java, a nast\u0119pnie om\u00f3wi\u0119 kilka r\u00f3\u017cnic wyst\u0119puj\u0105cych mi\u0119dzy wersj\u0105 7 a 8 tego frameworka. Dodatkowo wyja\u015bni\u0119 w jaki spos\u00f3b mo\u017cna przeprowadzi\u0107 migracj\u0119 mi\u0119dzy tymi wersjami zgodnie z zaleceniami tw\u00f3rc\u00f3w Vaadina. Zapraszam do przeczytania.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wst\u0119p \u2013 technologia Vaadin<\/h3>\n\n\n\n<p>Vaadin jest frameworkiem umo\u017cliwiaj\u0105cym tworzenie aplikacji webowych w j\u0119zyku Java. Jego podstawow\u0105 zalet\u0105 jest to, \u017ce nie wymaga on du\u017cej znajomo\u015bci technologii frontendowych (co najwy\u017cej podstawy) od programisty. Je\u015bli jednak programista potrzebuje u\u017cy\u0107 tych technologii w pisanej aplikacji w niestandardowy spos\u00f3b, Vaadin daje tak\u0105 mo\u017cliwo\u015b\u0107 i pozwala u\u017cywa\u0107 styli CSS, JavaScript, HTML5 itp. &nbsp;Spos\u00f3b tworzenia interfejsu u\u017cytkownika w frameworku Vaadin przypomina tworzenie aplikacji desktopowej w Swingu. Programista tworzy UI z komponent\u00f3w dostarczonych przez Vaadina (np. TextField, ComboBox) i nast\u0119pnie mo\u017ce zarz\u0105dza\u0107 ich u\u0142o\u017ceniem stosuj\u0105c odpowiednie layouty. Aplikacj\u0119 w stylu \u201eHello World\u201d mo\u017cemy utworzy\u0107 w bardzo prosty spos\u00f3b np. pobieraj\u0105c plugin do Eclipse (Vaddin plugin for Eclipse), a nast\u0119pnie utworzy\u0107 projekt za pomoc\u0105 archetypu mavena (file -&gt; new -&gt; other -&gt; Vaadin Project). Utworzona w ten spos\u00f3b aplikacja w Vaadinie 7 sk\u0142ada si\u0119 z element\u00f3w przedstawionych na rysunku 1.1<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys1.1-1.png\"><img decoding=\"async\" width=\"309\" height=\"648\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys1.1-1.png\" alt=\"rys1.1 - Vaadin - r\u00f3\u017cnice mi\u0119dzy wersj\u0105 7 a 8\" class=\"wp-image-18723\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys1.1-1.png 309w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys1.1-1-143x300.png 143w\" sizes=\"(max-width: 309px) 100vw, 309px\" \/><\/a><figcaption>Rys. 1.1 Podstawowy projekt w Vaadinie<\/figcaption><\/figure><\/div>\n\n\n\n<p>Jak wida\u0107 na rysunku 1.1 struktura nie jest bardzo z\u0142o\u017cona, istnieje tylko jedna klasa oraz kilka plik\u00f3w .css, .scss i .ico odpowiadaj\u0105cych za style wygl\u0105du aplikacji. Istotn\u0105 rzecz\u0105 jest jednak klasa MyUI, kt\u00f3rej zawarto\u015b\u0107 prezentuje Listing 1.2:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n@Theme(\"mytheme\")\npublic class MyUI extends UI {\n \nprivate static final long serialVersionUID = 2123628334309501295L;\n \n@Override\nprotected void init(VaadinRequest vaadinRequest) {\nfinal VerticalLayout layout = new VerticalLayout(); \/\/ stworzenie layoutu pionowego\n\/\/ (komponenty b\u0119d\u0105 u\u0142o\u017cone jeden pod drugim)\n \nfinal TextField name = new TextField(); \/\/ stworzenie pola textowego\nname.setCaption(\"Type your name here:\"); \/\/ dodanie podpisu do pola textowego\nButton button = new Button(\"Click Me\"); \/\/ Stworzenie przycisku\n \nlayout.addComponents(name, button); \/\/ dodanie pola textowego i przycisku do layoutu\nlayout.setMargin(true); \/\/ margines dla layoutu\nlayout.setSpacing(true); \/\/ margines mi\u0119dzy komponentami w layoucie\n \nsetContent(layout); \/\/ ustawienie layoutu jako zawarto\u015bci widoku strony\n}\n \n@WebServlet(urlPatterns = \"\/*\", name = \"MyUIServlet\", asyncSupported = true)\n@VaadinServletConfiguration(ui = MyUI.class, productionMode = false)\npublic static class MyUIServlet extends VaadinServlet {\n}\n}\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 1.2 Klasa MyUI<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Klasa MyUI rozszerza klas\u0119 UI odpowiadaj\u0105c\u0105 tre\u015bci wy\u015bwietlanej w przegl\u0105darce. W metodzie init mo\u017cna tworzy\u0107 konkretny widok z komponent\u00f3w \u2013 tak te\u017c zrobiono na Listingu 1.2. &nbsp;Warto zwr\u00f3ci\u0107 uwag\u0119 tak\u017ce na wewn\u0119trzna klas\u0119 statyczn\u0105 MyUIServlet, dzi\u0119ki kt\u00f3rej zosta\u0142a dokonana niezb\u0119dna konfiguracja:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>@WebServlet wskazuje na jakie \u017c\u0105danie ma by\u0107 zmapowany servlet, jego nazw\u0119, oraz czy servlet ma wspiera\u0107 operacje asynchroniczne.<\/li><li>@VaadinServletConfiguration wskazuje na jaki widok ma by\u0107 przekierowany u\u017cytkownik oraz w jakim trybie ma pracowa\u0107 (produkcyjnym lub nie).<\/li><\/ul>\n\n\n\n<p>Efekt dzia\u0142ania utworzonej aplikacji zosta\u0142 przedstawiony na rysunku 1.3.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys-1.3-1.png\"><img decoding=\"async\" width=\"365\" height=\"266\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys-1.3-1.png\" alt=\"rys 1.3 300x219 - Vaadin - r\u00f3\u017cnice mi\u0119dzy wersj\u0105 7 a 8\" class=\"wp-image-18725\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys-1.3-1.png 365w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys-1.3-1-300x219.png 300w\" sizes=\"(max-width: 365px) 100vw, 365px\" \/><\/a><figcaption>Rys 1.3 Uruchomiona aplikacja w przegl\u0105darce<\/figcaption><\/figure><\/div>\n\n\n\n<p>Jak na aplikacj\u0119 sk\u0142adaj\u0105c\u0105 si\u0119 z jednej klasy i paru linijek kodu, efekt wydaje si\u0119 ca\u0142kiem niez\u0142y prawda? ?&nbsp;Mam nadziej\u0119, \u017ce przybli\u017cy\u0142em Ci troch\u0119 technologi\u0119 Vaadin, w nast\u0119pnej sekcji opisz\u0119 kilka r\u00f3\u017cnic mi\u0119dzy Vaadinem 7 a Vaadinem 8.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vaadin 7 i Vaadin 8 \u2013 r\u00f3\u017cnice<\/h3>\n\n\n\n<p>Vaadin 7 przesta\u0142 by\u0107 wspierany w lutym 2019 roku, dlatego powsta\u0142a potrzeba przepisania istniej\u0105cych aplikacji napisanych w Vaadinie 7 na Vaadina 8, co wi\u0105\u017ce si\u0119 z poznaniem nowo\u015bci i usprawnie\u0144 nowszej wersji tej technologii.<\/p>\n\n\n\n<p>Nowa wersja frameworka idzie w parze wraz z wi\u0119kszymi wymaganiami powi\u0105zanych technologii. Aby m\u00f3c pracowa\u0107 z Vaadinem 8, nale\u017cy korzysta\u0107 z javy minimum wersji 8 oraz servlet minimum w wersji 3.0. W Vaadinie 8 nast\u0105pi\u0142o kilka kluczowych zmian dodaj\u0105cych nowe funkcje oraz naprawiaj\u0105ce niedoskona\u0142o\u015bci istniej\u0105ce w Vaadinie 7. Przedstawi\u0119 pokr\u00f3tce kilka problem\u00f3w wyst\u0119puj\u0105cych w Vaadinie 7, kt\u00f3re zosta\u0142y rozwi\u0105zane w Vaadinie 8.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Zmiany w komponencie Grid<\/h4>\n\n\n\n<p>Grid jest komponentem odwzorowuj\u0105cym tabel\u0119, Rys. 2.1 przedstawia jego wygl\u0105d w aplikacji.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys.-2.1-1.png\"><img decoding=\"async\" width=\"629\" height=\"149\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys.-2.1-1.png\" alt=\"rys. 2.1 - Vaadin - r\u00f3\u017cnice mi\u0119dzy wersj\u0105 7 a 8\" class=\"wp-image-18721\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys.-2.1-1.png 629w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/rys.-2.1-1-300x71.png 300w\" sizes=\"(max-width: 629px) 100vw, 629px\" \/><\/a><figcaption>Rys. 2.1. Przyk\u0142adowy Grid<\/figcaption><\/figure><\/div>\n\n\n\n<p>W Vaadinie 7 komponent ten mia\u0142 kilka brak\u00f3w, kt\u00f3re zosta\u0142y poprawione w Vaadinie 8:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em><strong>&nbsp;Brak mo\u017cliwo\u015bci dodawania komponent\u00f3w do kom\u00f3rek grida<\/strong><\/em><\/li><\/ul>\n\n\n\n<p>W Vaadinie 7 aby tego dokona\u0107 trzeba by\u0142o ingerowa\u0107 w kod front-endowy lub tworzy\u0107 specjalne implementacje komponent\u00f3w w Javie, co znacznie utrudnia\u0142o wykorzystanie tej funkcji grida. W Vaadinie 8 jest to r\u00f3wnie proste co ustawianie zwyk\u0142ego tekstu.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em><strong>Brak mo\u017cliwo\u015bci przeci\u0105gania wierszy grida do innego grida.<\/strong><\/em><\/li><\/ul>\n\n\n\n<p>W Vaadinie 7 nie by\u0142o takiej mo\u017cliwo\u015bci, nie jest to funkcjonalno\u015b\u0107 niezb\u0119dna, jednak jest to co\u015b nowego, co mo\u017cna wykorzysta\u0107 w tworzonym systemie.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em><strong>Brak mo\u017cliwo\u015bci tworzenia struktury drzewiastej w gridzie.<\/strong><\/em><\/li><\/ul>\n\n\n\n<p>W Vaadinie 8 dodano komponenty Tree i TreeGrid, kt\u00f3re daj\u0105 tak\u0105 mo\u017cliwo\u015b\u0107.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Zmiany w api, upraszczaj\u0105ce kod<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>Uproszczenie sposobu wy\u015bwietlania obiekt\u00f3w javy w komponentach:<\/li><\/ul>\n\n\n\n<p>Na przyk\u0142adzie grida \u2013 w Vaadinie 7 wymagane by\u0142o najpierw utworzenie kontenera, kt\u00f3ry nale\u017ca\u0142o wype\u0142ni\u0107 obiektami a nast\u0119pnie przekaza\u0107 go do Grida. W Vaadinie 8 obiekty mo\u017cna przekaza\u0107 bezpo\u015brednio do Grida. Listing 2.2. oraz Listing 2.3. przedstawiaj\u0105 te r\u00f3\u017cnice.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nGrid grid = new Grid();\nList&lt;MyObject&gt; objects = new ArrayList&lt;&gt;();\nBeanItemContainer&lt;MyObject&gt; container = new BeanItemContainer&lt;&gt;(MyObject.class,objects);\ngrid.setContainerDataSource(container);\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 2.2. Dodanie obiekt\u00f3w do Grida w Vaadinie 7<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nGrid&lt;MyObject&gt; grid = new Grid&lt;&gt;();\nList&lt;MyObject&gt; objects = new ArrayList&lt;&gt;();\ngrid.setItems(objects);\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 2.3. Dodanie obiekt\u00f3w do Grida w Vaadinie 8<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Uproszczenie sposobu pobierania warto\u015bci z komponent\u00f3w podczas ich zmiany warto\u015bci<\/li><\/ul>\n\n\n\n<p>W Vaadinie 7 dodaj\u0105c listener wywo\u0142ywany podczas zmiany warto\u015bci np. comoboxa, procedura pobrania nowo ustawionej warto\u015bci by\u0142a nieco wyd\u0142u\u017cona, nale\u017ca\u0142o pos\u0142u\u017cy\u0107 si\u0119 interfejsem Property, w Vaadinie 8 warto\u015b\u0107 t\u0105 mo\u017cna pobra\u0107 bezpo\u015brednio z eventu. Wynika to ze zmiany modelu danych w Vaadinie 8.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nComboBox combobox = new ComboBox();\ncombobox.addValueChangeListener(event -&gt; {\nProperty&lt;String&gt; property = event.getProperty();\nString value = property.getValue();\nSystem.out.println(&quot;Value : &quot; + value);\n});\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 2.4. Pobranie zmienianej warto\u015bci comboboxa w Vaadinie 7<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nComboBox&lt;String&gt; combobox = new ComboBox&lt;&gt;();\ncombobox.addValueChangeListener(event -&gt; {\nString value = event.getValue();\nSystem.out.println(&quot;Value : &quot; + value);\n});\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 2.5. Pobranie zmienianej warto\u015bci comboboxa w Vaadinie 8<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Uproszenie Lazy loadingu<\/li><\/ul>\n\n\n\n<p>W Vaadinie 7 w celu otrzymania efektu lazy loading np. w Gridzie, nale\u017ca\u0142o utworzy\u0107 w\u0142asn\u0105 implementacj\u0119 kontenera obs\u0142uguj\u0105cego ten przypadek. W Vaadinie 8 zosta\u0142o to maksymalnie uproszczone. Wystarczy u\u017cy\u0107 metody Grida setDataProvider() przedstawionej poni\u017cej:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic void setDataProvider(FetchItemsCallback&lt;T&gt; fetchItems, SerializableSupplier&lt;Integer&gt; sizeCallback)\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 2.6 Metoda setDataProvider<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Interfejs FetchItemsCallback posiada jedn\u0105 metod\u0119 przyjmuj\u0105c\u0105 3 parametry:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>List&lt;QuerySortOrder&gt; \u2013 list\u0119 okre\u015blaj\u0105c\u0105 spos\u00f3b sortowania<\/li><li>Int offset \u2013 index pocz\u0105tkowy obiekt\u00f3w do pobrania<\/li><li>Int limit \u2013 liczba obiekt\u00f3w do pobrania<\/li><\/ul>\n\n\n\n<p>Interfejs SerializableSupplier ma za zadanie zwr\u00f3ci\u0107 liczb\u0119 wszystkich docelowych element\u00f3w do wy\u015bwietlenia. Poni\u017cej zosta\u0142a przyk\u0142adowa implementacja serwisu, spe\u0142niaj\u0105cego oba warunki implementacji interfejs\u00f3w FetchItemsCallback (metoda findAll()) i SerializableSupplier (metoda count()).<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class MyService {\n \nList&lt;MyObject&gt; data = new ArrayList&lt;&gt;();\n \npublic MyService() {\n \nfillData();\n}\n \nprivate void fillData() {\n \nfor (int i = 0; i &lt; 100; i++) {\ndata.add(new MyObject(i));\n}\n}\n \npublic Stream&lt;MyObject&gt; findAll(List sortOrder, int offset, int limit) {\n \nList&lt;MyObject&gt; result = IntStream.range(offset, offset + limit).mapToObj(i -&gt; data.get(i))\n.collect(Collectors.toList());\nreturn result.stream();\n}\n \npublic int count() {\n \nreturn data.size();\n}\n \n}\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 2.7. Klasa MyService<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Obiekt MyObject \u2013 do wy\u015bwietlenia w gridzie:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class MyObject {\n \nprivate int value;\n \npublic MyObject(int value) {\n \nthis.value = value;\n}\n \npublic int getValue() {\n \nreturn value;\n}\n \npublic void setValue(int value) {\n \nthis.value = value;\n}\n}\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 2.8. Klasa MyObject<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nMyService service = new MyService();\nGrid&lt;MyObject&gt; grid = new Grid&lt;&gt;(MyObject.class);\ngrid.setDataProvider(service::findAll, service::count);\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 2.9. Zastosowanie lazy loading w Gridzie<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Opr\u00f3cz powy\u017cszych korzy\u015bci, dodatkowym atutem w Vaadinie 8 jest znacznie lepszy performance. Na przyk\u0142ad wy\u015bwietlaj\u0105c 100&nbsp;000 obiekt\u00f3w w gridzie czas generowania takiego grida w starej wersji Vaadina trwa\u0142 oko\u0142o 233ms a w przypadku Vaadina 8 tylko 9ms, r\u00f3\u017cnica zatem jest bardzo du\u017ca. Vaadin 8 posiada tak\u017ce lepsz\u0105 optymalizacj\u0119 strony klienckiej np. poprzez zastosowanie technologii flexbox, wi\u0105\u017ce si\u0119 to jednak z wsparciem przez nowsze wersje przegl\u0105darek (Firefox minimum wersja 28, Chrome minimum 21), IE tylko cz\u0119\u015bciowo wspiera t\u0105 technologi\u0119, dlatego nie jest zalecany.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Migracja Vaadina 7 do Vaadina 8<\/h3>\n\n\n\n<p>Tw\u00f3rcy Vaadina 8 dostrzegli problem w rozbie\u017cno\u015bci mi\u0119dzy Vaadinem 7 a Vaadinem 8, dlatego przygotowali specjalne compatilibity packages, zawieraj\u0105ce elementy starego API. W projekcie maven u\u017cycie compability packages jest bardzo proste, wystarczy podmieni\u0107 odpowiednie zale\u017cno\u015bci w pliku pom.xml. Na listingu 3.1 znajduje si\u0119 zale\u017cno\u015b\u0107 wykorzystywana w Vaadinie 7, na listingu 3.2. znajduje si\u0119 zale\u017cno\u015b\u0107 wykorzystywana w Vaadinie 8 przy migracji:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n&lt;dependency&gt;\n&lt;groupId&gt;com.vaadin&lt;\/groupId&gt;\n&lt;artifactId&gt;vaadin-server&lt;\/artifactId&gt;\n&lt;version&gt;7.7.6&lt;\/version&gt;\n&lt;\/dependency&gt;\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 3.1. Zale\u017cno\u015b\u0107 o artefakcie vaadin-server w Vaadinie 7<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n&lt;dependency&gt;\n&lt;groupId&gt;com.vaadin&lt;\/groupId&gt;\n&lt;artifactId&gt;vaadin-compatibility-server&lt;\/artifactId&gt;\n&lt;version&gt;8.0.0&lt;\/version&gt;\n&lt;\/dependency&gt;\n<\/pre><\/div>\n\n\n<p class=\"has-text-align-center\"><em>Listing 3.2. Zale\u017cno\u015b\u0107 o artefakcie vaadin-compatibility-server w Vaadinie 8<\/em><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Dzi\u0119ki temu zabiegowi, wszystkie klasy u\u017cyte w ramach artefaktu vaadin-server w vaadinie 7, b\u0119d\u0105 mog\u0142y zosta\u0107 u\u017cyte po migracji do Vaadina 8. Poni\u017cej spis wszystkich compatibility artefakt\u00f3w dost\u0119pnych w Vaadinie 8:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>vaadin-compatibility-server<\/li><li>vaadin-compatibility-client<\/li><li>vaadin-compatibility-client-compiled<\/li><li>vaadin-compatibility-shared<\/li><li>vaadin-compatibility-themes<\/li><\/ul>\n\n\n\n<p>Po podmianie zale\u017cno\u015bci nale\u017cy pami\u0119ta\u0107 o zaktualizowaniu import\u00f3w i widgetset\u00f3w, aby nie robi\u0107 tego r\u0119cznie powsta\u0142 migration tool \u2013 Vaadin Maven plugin mo\u017ce wykona\u0107 t\u0105 prac\u0119 przy u\u017cyciu targetu&nbsp;<em>vaadin:upgrade8<\/em>. Po wykonaniu tej operacji migracja powinna zako\u0144czy\u0107 si\u0119 sukcesem. Warto podkre\u015bli\u0107, \u017ce powy\u017csza migracja pozwala nam u\u017cy\u0107 Vaadina 7 w Vaadinie 8. Chc\u0105c u\u017cywa\u0107 komponent\u00f3w Vaadina 8 nale\u017cy przepisa\u0107 stare komponenty na nowe, niestety jest to nieuniknione gdy\u017c Vaadin 8 stosuje zupe\u0142nie inny model danych od Vaadina 7.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;7614&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;8&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.4&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.4\\\/5 ( votes: 8)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Vaadin - r\u00f3\u017cnice mi\u0119dzy wersj\u0105 7 a 8&quot;,&quot;width&quot;:&quot;122.1&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 122.1px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.4\/5 ( votes: 8)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W tym artykule przedstawi\u0119 w spos\u00f3b og\u00f3lny technologi\u0119 Vaadin \u2013 framework w j\u0119zyku Java, a nast\u0119pnie om\u00f3wi\u0119 kilka r\u00f3\u017cnic wyst\u0119puj\u0105cych &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/vaadin-roznice-miedzy-wersja-7-a-8\/\">Continued<\/a><\/p>\n","protected":false},"author":207,"featured_media":7658,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[330,791,111],"class_list":["post-7614","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-java","tag-vaadin","tag-web-development"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/06\/vaadin.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7614"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/207"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=7614"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7614\/revisions"}],"predecessor-version":[{"id":18730,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7614\/revisions\/18730"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/7658"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=7614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=7614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=7614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}