SlideShare a Scribd company logo
1 of 107
Download to read offline
5
S T O R Y A N D P H I L O S O P H Y
Software is eating the world and what most of us see of it is the user interface. The user
interface has become the key component of how the users experience the business
behind it. Competition is lost or won due to user experience. Simplicity is king and the
users get frustrated by anything ugly, slow or not working on the device they happen to
use at the time. We at Vaadin fight for simplicity and invite everyone to join this fight.
Together we want to build a user interface that puts a smile on the user’s face.
Vaadin is the technology that empowers developers to build the best web-apps for
business purposes. Our priority over everything else is developer productivity because
we believe that by simplifying the developer experience and saving the developer’s
time, they are best able to focus on building great user interfaces.
Our brand is what we want everyone to think about us. When everyone - both us and
the people around us - have a consistent understanding of what Vaadin is and what we
stand for, it enables that image to spread and amplify. This book defines what we want
that image to be. It defines what the Vaadin brand is.
I hope that You are as excited and proud of living and breathing the Vaadin brand as
I am. You are the one who is shaping what everyone thinks about Vaadin - using this
brand as a tool and a guideline every day.
Let’s fight for simplicity for both the users and the developers!
Joonas Lehtinen
Founder & CEO
Vaadin
I N T R O D U C T I O N
@peter_lehto
V A A D I N 8 & 1 0
Session’s content
• History meets Roadmap
• Modern & Functional DataBinding
• Web Component & Vaadin 10
Session’s content
• History meets Roadmap
• Modern & Functional DataBinding
• Web Component & Vaadin 10
Vaadin Framework
.1 .2 3 4 5 6 7
2001
2002
2002
2007
2007
2009
2013
Vaadin Framework
.1 .2 3 4 5 6 7 8
2001
2002
2002
2007
2007
2009
2013
2017
Framework
8
Vaadin Elements
• Web Components

A new, major standard to create
components for the Web

“Custom tags for HTML”
• Vaadin Elements

High-quality UI components for
users of client-side frameworks
such as Angular, ionic …
• A new generation of UI
components to be used also with
future versions of the Vaadin
server-side framework
Main changes
• Java 8
• New data binding
• Focus on new browsers
• Initial Web component support
• Improved performance
Vaadin Framework
.1 .2 3 4 5 6 7 8
2001
2002
2002
2005
2007
2009
2013
2017
GWTAJAXHTML
Backend
Server
UI Backend
Server
Browser
UI Backend
Server
Widgets Components
Theme
Browser
UI Backend
Server
Widgets Components
Theme
Browser
UI Backend
Server
Widgets Components
Shared State

RPC
Vaadin Framework
.1 .2 3 4 5 6 7 8
2001
2002
2002
2005
2007
2009
2013
2017
GWTAJAXHTML
Vaadin Framework
.1 .2 3 4 5 6 7 8
2001
2002
2002
2005
2007
2009
2013
2017
GWTAJAXHTML
Moving forward from GWT
Vaadin Framework
.1 .2 3 4 5 6 7 8
Vaadin Components
Web ComponentsGWTAJAXHTML
Vaadin Components
Vaadin Framework
4 5 6 7 8
Flow
Vaadin Components
Vaadin Framework
4 5 6 7 8
Flow Vaadin 10
Session’s content
• History meets Roadmap
• Modern & Functional DataBinding
• Web Component & Vaadin 10
Grid<Customer> grid = new Grid<>();
Grid<Customer> grid = new Grid<>();
grid.addColumn(Customer::getFirstName);
Grid<Customer> grid = new Grid<>();
grid.addColumn(Customer::getFirstName);
grid.addColumn(customer -> customer.getLastName());
Grid<Customer> grid = new Grid<>();
grid.addColumn(Customer::getFirstName);
grid.addColumn(Customer::getLastName);
Grid<Customer> grid = new Grid<>();
grid.addColumn(Customer::getFirstName);
grid.addColumn(Customer::getLastName);
grid.addColumn(customer ->
customer.getStatus().map(CustomerStatus::name).orElse("-"));
Grid<Customer> grid = new Grid<>();
grid.addColumn(Customer::getFirstName);
grid.addColumn(Customer::getLastName);
grid.addColumn(customer ->
customer.getStatus().map(CustomerStatus::name).orElse("-"));
grid.addColumn(customer ->
String.valueOf(LocalDate.now().getYear() - customer.getYearOfBirth()));
F u n c t i o n a l P a r a d i g m
VAADIN 8
VAADIN 10
c . v . u i . A b s t r a c t F i e l d < T >
VAADIN 7
1 8 5 3 l o c 2 2 8 l o c
VAADIN 8
F i e l d G r o u p
TO
B i n d e r
H o w w o u l d y o u e d i t
c u s t o m e r r e c o r d s ?
firstName = new TextField("First name");
lastName = new TextField("Last name");
status = new ComboBox<CustomerStatus>("Status");
yearOfBirth = new TextField("Year of Birth");
firstName = new TextField("First name");
lastName = new TextField("Last name");
status = new ComboBox<CustomerStatus>("Status");
yearOfBirth = new TextField("Year of Birth”);
status.setItems(CustomerStatus.values());
status.setItemLabelGenerator(CustomerStatus::name);
firstName = new TextField("First name");
lastName = new TextField("Last name");
status = new ComboBox<CustomerStatus>("Status");
yearOfBirth = new TextField("Year of Birth”);
status.setItems(CustomerStatus.values());
status.setItemLabelGenerator(CustomerStatus::name);
binder = new Binder<Customer>();
firstName = new TextField("First name");
lastName = new TextField("Last name");
status = new ComboBox<CustomerStatus>("Status");
yearOfBirth = new TextField("Year of Birth”);
status.setItems(CustomerStatus.values());
status.setItemLabelGenerator(CustomerStatus::name);
binder = new Binder<Customer>();
binder.forField(firstName).bind(Customer::getFirstName, Customer::setFirstName);
firstName = new TextField("First name");
lastName = new TextField("Last name");
status = new ComboBox<CustomerStatus>("Status");
yearOfBirth = new TextField("Year of Birth”);
status.setItems(CustomerStatus.values());
status.setItemLabelGenerator(CustomerStatus::name);
binder = new Binder<Customer>();
binder.forField(firstName).bind(Customer::getFirstName, Customer::setFirstName);
binder.forField(lastName).bind(Customer::getLastName, Customer::setLastName);
firstName = new TextField("First name");
lastName = new TextField("Last name");
status = new ComboBox<CustomerStatus>("Status");
yearOfBirth = new TextField("Year of Birth”);
status.setItems(CustomerStatus.values());
status.setItemLabelGenerator(CustomerStatus::name);
binder = new Binder<Customer>();
binder.forField(firstName).bind(Customer::getFirstName, Customer::setFirstName);
binder.forField(lastName).bind(Customer::getLastName, Customer::setLastName);
binder.forField(status).bind(Customer::getStatus, Customer::setStatus);
firstName = new TextField("First name");
lastName = new TextField("Last name");
status = new ComboBox<CustomerStatus>("Status");
yearOfBirth = new TextField("Year of Birth”);
status.setItems(CustomerStatus.values());
status.setItemLabelGenerator(CustomerStatus::name);
binder = new Binder<Customer>();
binder.forField(firstName).bind(Customer::getFirstName, Customer::setFirstName);
binder.forField(lastName).bind(Customer::getLastName, Customer::setLastName);
binder.forField(status).bind(Customer::getStatus, Customer::setStatus);
binder.forField(yearOfBirth)
.withConverter(Integer::valueOf, String::valueOf)
.bind(Customer::getYearOfBirth, Customer::setYearOfBirth);
public interface Converter<P, M> {
Result<M> convertToModel(P value, ValueContext context);
P convertToPresentation(M value, ValueContext context);
}
public interface Validator<T>
extends BiFunction<T, ValueContext, ValidationResult>
ValidationResult apply(T value, ValueContext context);
binder.forField(yearOfBirth)
.withConverter(Integer::valueOf, String::valueOf)
.withValidator(value -> value > 1975, "You can't be that old!")
.bind(Customer::getYearOfBirth, Customer::setYearOfBirth);
binder.forField(yearOfBirth)
.withConverter(Integer::valueOf, String::valueOf)
.withValidator(value -> value > 1975, "You can't be that old!”)
.withValidator(value -> value <= LocalDate.now().getYear(), "You're not born yet!")
.bind(Customer::getYearOfBirth, Customer::setYearOfBirth);
binder.forField(yearOfBirth)
.withConverter(Integer::valueOf, String::valueOf)
.withValidator(value -> value > 1975, "You can't be that old!”)
.withValidator(value -> value <= LocalDate.now().getYear(), "You're not born yet!”)
.withValidationStatusHandler(statusChange -> {
if (statusChange.isError()) {
statusChange.getMessage().ifPresent(msg -> {
Notification.show(msg, 1000, Position.TOP_CENTER);
});
}
})
.bind(Customer::getYearOfBirth, Customer::setYearOfBirth);
binder.withValidator(item -> {
return true;
}, “Error message");
binder.withValidator(item -> {
return true;
}, “Error message");
binder.setValidationStatusHandler(binderValidationStatus -> {
binderValidationStatus.notifyBindingValidationStatusHandlers();
if (!binderValidationStatus.isOk()) {
Notification.show(
binderValidationStatus.getBeanValidationErrors()
.stream().map(ValidationResult::getErrorMessage)
.collect(Collectors.joining(“,")),
2000,
Position.MIDDLE);
}
});
Session’s content
• History meets Roadmap
• Modern & Functional DataBinding
• Web Component & Vaadin 10
Web Component Standards
4 C O R E C O N C E P T S , S T I L L E V O L V I N G
• Custom Elements
• Shadow DOM
• Templates
• Reusability, HTML Imports / JS Modules
Custom Elements
<my-new-element></my-new-element>
Shadow DOM
Templates
<template id=“my-template"> 

<style> 

...

</style> 

<div> 

<h1>Web Components</h1> 

<img src="/img/logo.svg"> 

</div> 

</template>





HTML Imports
<link rel="import" href="my-el.html">

HTML Imports
<link rel="import" href="my-el.html">

Replaced with JS modules
• Encapsulation
• Reusability
Benefits of using Web Components
Polymer
J A V A S C R I P T L I B R A R Y O N W E B C O M P O N E N T A P I
• Vaadin Components are built with Polymer
• For Vaadiner Polymer is the new client side technology
• Affiliated with Google
• Building Web Components with slowly stabilizing standards
Vaadin Components
Vaadin Framework
4 5 6 7 8
Flow Vaadin 10
Vaadin Components
Vaadin Components
Vaadin Flow
Vaadin Components
Vaadin Flow
Component APIs
Vaadin Components
Vaadin Flow
Component APIs
Vaadin Components
Vaadin Flow
Component APIs
Vaadin 10
Vaadin Components
Vaadin Flow
Component APIs
Vaadin Components
Polymer Element
T H E C L I E N T S I D E D E C L A R AT I V E H T M L
• For Vaadin Developer it’s mentally the Widget
• Defines own “dom-module”with <template> and <script>
• Specifies the logical DOM structure with HTML and Web Components
• Extends from Polymer.Element JavaScript class
Use any Web Component
V A A D I N D I R E C T O R Y / W E B C O M P O N E N T S . O R G
Vaadin 10
Vaadin Components
Vaadin Flow
Component APIs
Vaadin Flow
PolymerTemplate (Java)Polymer Element (HTML)
@Tag("customer-form")
@HtmlImport("customer-form.html")
public class CustomerForm extends PolymerTemplate<MODEL> {
@Tag("customer-form")
@HtmlImport("customer-form.html")
public class CustomerForm extends PolymerTemplate<MODEL> {
@Id("firstName")
private TextField firstName;
@Id("lastName")
private TextField lastName;
@Tag("customer-form")
@HtmlImport("customer-form.html")
public class CustomerForm extends PolymerTemplate<MODEL> {
@Id("firstName")
private TextField firstName;
@Id("lastName")
private TextField lastName;
@Id("status")
private ComboBox<CustomerStatus> status;
@Tag("customer-form")
@HtmlImport("customer-form.html")
public class CustomerForm extends PolymerTemplate<MODEL> {
@Id("firstName")
private TextField firstName;
@Id("lastName")
private TextField lastName;
@Id("status")
private ComboBox<CustomerStatus> status;
…
binder = new Binder<>();
binder.forField(firstName).bind(Customer::getFirstName, Customer::setFirstName);
binder.forField(lastName).bind(Customer::getLastName, Customer::setLastName);
binder.forField(status).bind(Customer::getStatus, Customer::setStatus);
<dom-module id="customer-form">
</dom-module>
<dom-module id="customer-form">
<template>
</template>
</dom-module>
<dom-module id="customer-form">
<template>
<vaadin-vertical-layout>
<vaadin-text-field id="firstName"></vaadin-text-field>
<vaadin-text-field id="lastName"></vaadin-text-field>
<vaadin-combo-box id="status"></vaadin-combo-box>
<vaadin-text-field id="yearOfBirth"></vaadin-text-field>
<vaadin-button on-click="saveForm">save</vaadin-button>
</vaadin-vertical-layout>
</template>
</dom-module>
<dom-module id="customer-form">
<template>
<vaadin-vertical-layout>
<vaadin-text-field id="firstName"></vaadin-text-field>
<vaadin-text-field id="lastName"></vaadin-text-field>
<vaadin-combo-box id="status"></vaadin-combo-box>
<vaadin-text-field id="yearOfBirth"></vaadin-text-field>
<vaadin-button on-click="saveForm">save</vaadin-button>
</vaadin-vertical-layout>
</template>
<script>
</script>
</dom-module>
<dom-module id="customer-form">
<template>
<vaadin-vertical-layout>
<vaadin-text-field id="firstName"></vaadin-text-field>
<vaadin-text-field id="lastName"></vaadin-text-field>
<vaadin-combo-box id="status"></vaadin-combo-box>
<vaadin-text-field id="yearOfBirth"></vaadin-text-field>
<vaadin-button on-click="saveForm">save</vaadin-button>
</vaadin-vertical-layout>
</template>
<script>
class CustomerForm extends Polymer.Element {
static get is() {return 'customer-form'}
}
customElements.define(CustomerForm.is, CustomerForm);
</script>
</dom-module>
<dom-module id="customer-form">
<template>
<vaadin-vertical-layout>
<vaadin-text-field id="firstName"></vaadin-text-field>
<vaadin-text-field id="lastName"></vaadin-text-field>
<vaadin-combo-box id="status"></vaadin-combo-box>
<vaadin-text-field id="yearOfBirth"></vaadin-text-field>
<vaadin-button on-click="saveForm">save</vaadin-button>
</vaadin-vertical-layout>
</template>
<script>
class CustomerForm extends Polymer.Element {
static get is() {return 'customer-form'}
}
customElements.define(CustomerForm.is, CustomerForm);
</script>
</dom-module>
@EventHandler
public void saveForm() {
customerService.save(binder.getBean());
refreshListing();
}
@Tag("customer-form")
@HtmlImport("customer-form.html")
public class CustomerForm extends PolymerTemplate<CustomerModel> {
public interface CustomerModel extends TemplateModel {
Customer getCustomer();
@Include({ "firstName", "lastName", "status", "yearOfBirth" })
void setCustomer(Customer customer);
}
<dom-module id="customer-form">
<template>
<vaadin-vertical-layout>
<vaadin-text-field id="firstName" value="{{customer.firstName}}"></vaadin-text-field>
<vaadin-text-field id="lastName" value="{{customer.lastName}}"></vaadin-text-field>
<vaadin-combo-box id="status" value="{{customer.status}}"></vaadin-combo-box>
<vaadin-text-field id="yearOfBirth" value="{{customer.yearOfBirth}}"></vaadin-text-field>
<vaadin-button on-click="saveForm">save</vaadin-button>
</vaadin-vertical-layout>
</template>
<script>
class CustomerForm extends Polymer.Element {
static get is() {return 'customer-form'}
}
customElements.define(CustomerForm.is, CustomerForm);
</script>
</dom-module>
<dom-module id="customer-form">
<template>
<vaadin-vertical-layout>
<vaadin-text-field id="firstName" value="[[customer.firstName]]"></vaadin-text-field>
<vaadin-text-field id="lastName" value="[[customer.lastName]]"></vaadin-text-field>
<vaadin-combo-box id="status" value="[[customer.status]]"></vaadin-combo-box>
<vaadin-text-field id="yearOfBirth" value="[[customer.yearOfBirth]]"></vaadin-text-field>
<vaadin-button on-click="saveForm">save</vaadin-button>
</vaadin-vertical-layout>
</template>
<script>
class CustomerForm extends Polymer.Element {
static get is() {return ‘customer-form'}
}
customElements.define(CustomerForm.is, CustomerForm);
function saveForm() {
this.$server.saveForm()
}
</script>
</dom-module>
T H E 5 W A Y S O F F L O W
1 S E R V E R - D R I V E N U I D E V E L O P M E N T
HorizontalLayout buttonLayout = new
HorizontalLayout();
Button saveButton = new Button(“Save”);
saveButton.addClickListener(event -> save());
Button cancelButton = new Button(“Cancel”);
cancelButton.addClickListener(event -> cancel());
buttonLayout.add(saveButton);
buttonLayout.add(cancelButton);
1 S E R V E R - D R I V E N U I D E V E L O P M E N T
2 D E C L A R AT I V E C O M P O S I T I O N
PolymerTemplate (Java)Polymer Element (HTML)
3 N E W U I C O M P O N E N T S
public class YourComponent extends Div {
public YourComponent {
…
add([any Vaadin component]);
}
}
3 N E W U I C O M P O N E N T S
public class YourComponent extends Composite<Div> {
public YourComponent {
…
getContent().add([any Vaadin component]);
}
}
3 N E W U I C O M P O N E N T S
@Tag(“div”)
public class YourComponent extends Component {
public YourComponent {
…
getElement().appendChild([any Element])
}
}
3 N E W U I C O M P O N E N T S
@Tag("paper-input")
@HtmlImport("paper-input.html")
public class PaperInputComponent extends Component {
public String getValue() {
return getElement().getProperty("value", "");
}
@Tag("paper-input")
@HtmlImport("paper-input.html")
public class PaperInputComponent extends Component {
@Synchronize("value-changed")
public String getValue() {
return getElement().getProperty("value", "");
}
@Tag("paper-input")
@HtmlImport("paper-input.html")
public class PaperInputComponent extends Component {
@Synchronize("value-changed")
public String getValue() {
return getElement().getProperty("value", "");
}
public static class ValueChangeEvent extends
ComponentEvent<PaperInputComponent> {
public ValueChangeEvent(PaperInputComponent source,
boolean fromClient) {
super(source, fromClient);
}
@Tag("paper-input")
@HtmlImport("paper-input.html")
public class PaperInputComponent extends Component {
@Synchronize("value-changed")
public String getValue() {
return getElement().getProperty("value", "");
}
@DomEvent("value-changed")
public static class ValueChangeEvent extends
ComponentEvent<PaperInputComponent> {
public ValueChangeEvent(PaperInputComponent source,
boolean fromClient) {
super(source, fromClient);
}
4 L AT E N C Y - C O M P E N S AT I O N
@ E V E N T H A N D L E R
• Exposes server side methods for invocation from JavaScript
• Can be mixed with pure JS functions for immediate response
4 L AT E N C Y - C O M P E N S AT I O N
<div id="div" on-click="updateStatus">[[status]]</div>
// JavaScript event handler, run immediately
updateStatus() {
this.status = "Connecting to server…";
}
// Java event handler on the server, run asynchronously
@EventHandler
private void updateStatus() {
getModel().setStatus("Confirmed on the server");
}
5 C L I E N T - S I D E V I E W S
<person-list-view on-add="addPerson"
person-list=“[[persons]]">
</person-list-view>
5 C L I E N T - S I D E V I E W S
5 C L I E N T - S I D E V I E W S
public interface PersonListModel extends TemplateModel {
List<Person> getPersons();
void setPersons(List<Person> persons);
}
@EventHandler
private void addPerson(@EventData("event.newPerson") Person person) {
backend.persistPerson(person);
List<Person> persons = getModel().getPersons();
persons.add(person);
}
Vaadin 10
Vaadin Components
Vaadin Flow
Component APIs
• Vaadin 8 and 10 - built on Java 8
• Lambdas and Functional paradigm at large
• Data binding completely redone
• Targets simplifications and flexibility, #FFS ;)
• Flexible components and multiple ways to data bind
• Gathers all data binding to Binder, simplifies Fields
Lessons learned
Lessons learned
• Web Components are becoming standard in browsers
• Vaadin Components - the client side API for JavaScript Developers
• Component API - the server side API for Java Developers
• Vaadin Flow - the bridge between Client and Server
• Vaadin 10 provides the richest set of development features
@peter_lehto
@vaadin
T H A N K Y O U !

More Related Content

What's hot

Introduction to Vaadin
Introduction to VaadinIntroduction to Vaadin
Introduction to Vaadinnetomi
 
Introduction to Vaadin
Introduction to VaadinIntroduction to Vaadin
Introduction to VaadinJeroen Benats
 
Vaadin Introduction, 7.3 edition
Vaadin Introduction, 7.3 editionVaadin Introduction, 7.3 edition
Vaadin Introduction, 7.3 editionJoonas Lehtinen
 
Html5 with Vaadin and Scala
Html5 with Vaadin and ScalaHtml5 with Vaadin and Scala
Html5 with Vaadin and ScalaJoonas Lehtinen
 
Frank Mantek Google G Data
Frank Mantek Google G DataFrank Mantek Google G Data
Frank Mantek Google G Datadeimos
 
Vaadin and Spring at Devoxx UK 2015
Vaadin and Spring at Devoxx UK 2015Vaadin and Spring at Devoxx UK 2015
Vaadin and Spring at Devoxx UK 2015Sami Ekblad
 
Udi Dahan Intentions And Interfaces
Udi Dahan Intentions And InterfacesUdi Dahan Intentions And Interfaces
Udi Dahan Intentions And Interfacesdeimos
 
Binding business data to vaadin components
Binding business data to vaadin componentsBinding business data to vaadin components
Binding business data to vaadin componentsPeter Lehto
 
Wicket Next (1.4/1.5)
Wicket Next (1.4/1.5)Wicket Next (1.4/1.5)
Wicket Next (1.4/1.5)jcompagner
 
Apache Wicket Web Framework
Apache Wicket Web FrameworkApache Wicket Web Framework
Apache Wicket Web FrameworkLuther Baker
 
CUST-8 Tackling a Complex User Interface
CUST-8 Tackling a Complex User InterfaceCUST-8 Tackling a Complex User Interface
CUST-8 Tackling a Complex User InterfaceAlfresco Software
 
Why and How to Use Virtual DOM
Why and How to Use Virtual DOMWhy and How to Use Virtual DOM
Why and How to Use Virtual DOMDaiwei Lu
 
The Complementarity of React and Web Components
The Complementarity of React and Web ComponentsThe Complementarity of React and Web Components
The Complementarity of React and Web ComponentsAndrew Rota
 
The web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulThe web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulRobert Nyman
 
Reactive Type safe Webcomponents with skateJS
Reactive Type safe Webcomponents with skateJSReactive Type safe Webcomponents with skateJS
Reactive Type safe Webcomponents with skateJSMartin Hochel
 
HTML5 Gaming Payment Platforms
HTML5 Gaming Payment PlatformsHTML5 Gaming Payment Platforms
HTML5 Gaming Payment PlatformsJonathan LeBlanc
 

What's hot (20)

Introducing GWT Polymer (vaadin)
Introducing GWT Polymer (vaadin)Introducing GWT Polymer (vaadin)
Introducing GWT Polymer (vaadin)
 
Vaadin & Web Components
Vaadin & Web ComponentsVaadin & Web Components
Vaadin & Web Components
 
Introduction to Vaadin
Introduction to VaadinIntroduction to Vaadin
Introduction to Vaadin
 
Introduction to Vaadin
Introduction to VaadinIntroduction to Vaadin
Introduction to Vaadin
 
Vaadin Introduction, 7.3 edition
Vaadin Introduction, 7.3 editionVaadin Introduction, 7.3 edition
Vaadin Introduction, 7.3 edition
 
Vaadin 7.2
Vaadin 7.2Vaadin 7.2
Vaadin 7.2
 
Html5 with Vaadin and Scala
Html5 with Vaadin and ScalaHtml5 with Vaadin and Scala
Html5 with Vaadin and Scala
 
Frank Mantek Google G Data
Frank Mantek Google G DataFrank Mantek Google G Data
Frank Mantek Google G Data
 
Vaadin and Spring at Devoxx UK 2015
Vaadin and Spring at Devoxx UK 2015Vaadin and Spring at Devoxx UK 2015
Vaadin and Spring at Devoxx UK 2015
 
Udi Dahan Intentions And Interfaces
Udi Dahan Intentions And InterfacesUdi Dahan Intentions And Interfaces
Udi Dahan Intentions And Interfaces
 
Binding business data to vaadin components
Binding business data to vaadin componentsBinding business data to vaadin components
Binding business data to vaadin components
 
GWT Reloaded
GWT ReloadedGWT Reloaded
GWT Reloaded
 
Wicket Next (1.4/1.5)
Wicket Next (1.4/1.5)Wicket Next (1.4/1.5)
Wicket Next (1.4/1.5)
 
Apache Wicket Web Framework
Apache Wicket Web FrameworkApache Wicket Web Framework
Apache Wicket Web Framework
 
CUST-8 Tackling a Complex User Interface
CUST-8 Tackling a Complex User InterfaceCUST-8 Tackling a Complex User Interface
CUST-8 Tackling a Complex User Interface
 
Why and How to Use Virtual DOM
Why and How to Use Virtual DOMWhy and How to Use Virtual DOM
Why and How to Use Virtual DOM
 
The Complementarity of React and Web Components
The Complementarity of React and Web ComponentsThe Complementarity of React and Web Components
The Complementarity of React and Web Components
 
The web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulThe web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - Istanbul
 
Reactive Type safe Webcomponents with skateJS
Reactive Type safe Webcomponents with skateJSReactive Type safe Webcomponents with skateJS
Reactive Type safe Webcomponents with skateJS
 
HTML5 Gaming Payment Platforms
HTML5 Gaming Payment PlatformsHTML5 Gaming Payment Platforms
HTML5 Gaming Payment Platforms
 

Similar to Vaadin Brand and Simplicity Fight

What's new in Vaadin 8, how do you upgrade, and what's next?
What's new in Vaadin 8, how do you upgrade, and what's next?What's new in Vaadin 8, how do you upgrade, and what's next?
What's new in Vaadin 8, how do you upgrade, and what's next?Marcus Hellberg
 
Building web apps with Vaadin 8
Building web apps with Vaadin 8 Building web apps with Vaadin 8
Building web apps with Vaadin 8 Marcus Hellberg
 
Building web apps with vaadin 8
Building web apps with vaadin 8Building web apps with vaadin 8
Building web apps with vaadin 8Marcus Hellberg
 
Vaadin DevDay 2017 - DI your UI
Vaadin DevDay 2017 - DI your UIVaadin DevDay 2017 - DI your UI
Vaadin DevDay 2017 - DI your UIPeter Lehto
 
Going web native - Feb 2018
Going web native - Feb 2018Going web native - Feb 2018
Going web native - Feb 2018Marcus Hellberg
 
How to separate the f2 e and sde in web development for_taobao
How to separate the f2 e and sde in web development for_taobaoHow to separate the f2 e and sde in web development for_taobao
How to separate the f2 e and sde in web development for_taobaotaobao.com
 
Building complex UI on Android
Building complex UI on AndroidBuilding complex UI on Android
Building complex UI on AndroidMaciej Witowski
 
Vaadin 7 CN
Vaadin 7 CNVaadin 7 CN
Vaadin 7 CNjojule
 
¿Cómo importar funcionalidades de C++ a NodeJS?
¿Cómo importar funcionalidades de C++ a NodeJS?¿Cómo importar funcionalidades de C++ a NodeJS?
¿Cómo importar funcionalidades de C++ a NodeJS?Globant
 
Developing for LinkedIn's Application Platform
Developing for LinkedIn's Application PlatformDeveloping for LinkedIn's Application Platform
Developing for LinkedIn's Application PlatformTaylor Singletary
 
From desktop to the cloud, cutting costs with Virtual kubelet and ACI
From desktop to the cloud, cutting costs with Virtual kubelet and ACIFrom desktop to the cloud, cutting costs with Virtual kubelet and ACI
From desktop to the cloud, cutting costs with Virtual kubelet and ACIAdi Polak
 
Making External Web Pages Interact With Visualforce
Making External Web Pages Interact With VisualforceMaking External Web Pages Interact With Visualforce
Making External Web Pages Interact With VisualforceSalesforce Developers
 
Vaadin 7 by Joonas Lehtinen
Vaadin 7 by Joonas LehtinenVaadin 7 by Joonas Lehtinen
Vaadin 7 by Joonas LehtinenCodemotion
 
Design Patterns Every ISV Needs to Know (October 15, 2014)
Design Patterns Every ISV Needs to Know (October 15, 2014)Design Patterns Every ISV Needs to Know (October 15, 2014)
Design Patterns Every ISV Needs to Know (October 15, 2014)Salesforce Partners
 
Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Christian Heilmann
 
Guidewire Connections 2023 DE-4 Using AI to Accelerate Application Integration
Guidewire Connections 2023 DE-4 Using AI to Accelerate Application IntegrationGuidewire Connections 2023 DE-4 Using AI to Accelerate Application Integration
Guidewire Connections 2023 DE-4 Using AI to Accelerate Application IntegrationBrianPetrini
 

Similar to Vaadin Brand and Simplicity Fight (20)

What's new in Vaadin 8, how do you upgrade, and what's next?
What's new in Vaadin 8, how do you upgrade, and what's next?What's new in Vaadin 8, how do you upgrade, and what's next?
What's new in Vaadin 8, how do you upgrade, and what's next?
 
Building web apps with Vaadin 8
Building web apps with Vaadin 8 Building web apps with Vaadin 8
Building web apps with Vaadin 8
 
Going web native
Going web nativeGoing web native
Going web native
 
Building web apps with vaadin 8
Building web apps with vaadin 8Building web apps with vaadin 8
Building web apps with vaadin 8
 
Vaadin DevDay 2017 - DI your UI
Vaadin DevDay 2017 - DI your UIVaadin DevDay 2017 - DI your UI
Vaadin DevDay 2017 - DI your UI
 
Going web native - Feb 2018
Going web native - Feb 2018Going web native - Feb 2018
Going web native - Feb 2018
 
AltoWeb_SPEED_Overview-2001
AltoWeb_SPEED_Overview-2001AltoWeb_SPEED_Overview-2001
AltoWeb_SPEED_Overview-2001
 
How to separate the f2 e and sde in web development for_taobao
How to separate the f2 e and sde in web development for_taobaoHow to separate the f2 e and sde in web development for_taobao
How to separate the f2 e and sde in web development for_taobao
 
Going web native
Going web nativeGoing web native
Going web native
 
Building complex UI on Android
Building complex UI on AndroidBuilding complex UI on Android
Building complex UI on Android
 
Vaadin 7 CN
Vaadin 7 CNVaadin 7 CN
Vaadin 7 CN
 
¿Cómo importar funcionalidades de C++ a NodeJS?
¿Cómo importar funcionalidades de C++ a NodeJS?¿Cómo importar funcionalidades de C++ a NodeJS?
¿Cómo importar funcionalidades de C++ a NodeJS?
 
Developing for LinkedIn's Application Platform
Developing for LinkedIn's Application PlatformDeveloping for LinkedIn's Application Platform
Developing for LinkedIn's Application Platform
 
From desktop to the cloud, cutting costs with Virtual kubelet and ACI
From desktop to the cloud, cutting costs with Virtual kubelet and ACIFrom desktop to the cloud, cutting costs with Virtual kubelet and ACI
From desktop to the cloud, cutting costs with Virtual kubelet and ACI
 
Vaadin 7
Vaadin 7Vaadin 7
Vaadin 7
 
Making External Web Pages Interact With Visualforce
Making External Web Pages Interact With VisualforceMaking External Web Pages Interact With Visualforce
Making External Web Pages Interact With Visualforce
 
Vaadin 7 by Joonas Lehtinen
Vaadin 7 by Joonas LehtinenVaadin 7 by Joonas Lehtinen
Vaadin 7 by Joonas Lehtinen
 
Design Patterns Every ISV Needs to Know (October 15, 2014)
Design Patterns Every ISV Needs to Know (October 15, 2014)Design Patterns Every ISV Needs to Know (October 15, 2014)
Design Patterns Every ISV Needs to Know (October 15, 2014)
 
Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010
 
Guidewire Connections 2023 DE-4 Using AI to Accelerate Application Integration
Guidewire Connections 2023 DE-4 Using AI to Accelerate Application IntegrationGuidewire Connections 2023 DE-4 Using AI to Accelerate Application Integration
Guidewire Connections 2023 DE-4 Using AI to Accelerate Application Integration
 

More from Peter Lehto

Vaadin 8 with Spring Frameworks AutoConfiguration
Vaadin 8 with Spring Frameworks AutoConfigurationVaadin 8 with Spring Frameworks AutoConfiguration
Vaadin 8 with Spring Frameworks AutoConfigurationPeter Lehto
 
Vaadin 8 with Spring Framework
Vaadin 8 with Spring FrameworkVaadin 8 with Spring Framework
Vaadin 8 with Spring FrameworkPeter Lehto
 
Vaadin 8 - Data Binding with Binder
Vaadin 8 - Data Binding with BinderVaadin 8 - Data Binding with Binder
Vaadin 8 - Data Binding with BinderPeter Lehto
 
GWT integration with Vaadin
GWT integration with VaadinGWT integration with Vaadin
GWT integration with VaadinPeter Lehto
 
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)Peter Lehto
 
JavaEE with Vaadin - Workshop
JavaEE with Vaadin - WorkshopJavaEE with Vaadin - Workshop
JavaEE with Vaadin - WorkshopPeter Lehto
 
Vaadin with Java EE 7
Vaadin with Java EE 7Vaadin with Java EE 7
Vaadin with Java EE 7Peter Lehto
 
Remote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.create
Remote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.createRemote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.create
Remote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.createPeter Lehto
 
Vaadin 7 - Java Enterprise Edition integration
Vaadin 7 - Java Enterprise Edition integrationVaadin 7 - Java Enterprise Edition integration
Vaadin 7 - Java Enterprise Edition integrationPeter Lehto
 
WebApp controlled Parrot AR Drone with Vaadin and Spring Boot
WebApp controlled Parrot AR Drone with Vaadin and Spring BootWebApp controlled Parrot AR Drone with Vaadin and Spring Boot
WebApp controlled Parrot AR Drone with Vaadin and Spring BootPeter Lehto
 

More from Peter Lehto (10)

Vaadin 8 with Spring Frameworks AutoConfiguration
Vaadin 8 with Spring Frameworks AutoConfigurationVaadin 8 with Spring Frameworks AutoConfiguration
Vaadin 8 with Spring Frameworks AutoConfiguration
 
Vaadin 8 with Spring Framework
Vaadin 8 with Spring FrameworkVaadin 8 with Spring Framework
Vaadin 8 with Spring Framework
 
Vaadin 8 - Data Binding with Binder
Vaadin 8 - Data Binding with BinderVaadin 8 - Data Binding with Binder
Vaadin 8 - Data Binding with Binder
 
GWT integration with Vaadin
GWT integration with VaadinGWT integration with Vaadin
GWT integration with Vaadin
 
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)
 
JavaEE with Vaadin - Workshop
JavaEE with Vaadin - WorkshopJavaEE with Vaadin - Workshop
JavaEE with Vaadin - Workshop
 
Vaadin with Java EE 7
Vaadin with Java EE 7Vaadin with Java EE 7
Vaadin with Java EE 7
 
Remote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.create
Remote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.createRemote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.create
Remote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.create
 
Vaadin 7 - Java Enterprise Edition integration
Vaadin 7 - Java Enterprise Edition integrationVaadin 7 - Java Enterprise Edition integration
Vaadin 7 - Java Enterprise Edition integration
 
WebApp controlled Parrot AR Drone with Vaadin and Spring Boot
WebApp controlled Parrot AR Drone with Vaadin and Spring BootWebApp controlled Parrot AR Drone with Vaadin and Spring Boot
WebApp controlled Parrot AR Drone with Vaadin and Spring Boot
 

Recently uploaded

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 

Recently uploaded (20)

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 

Vaadin Brand and Simplicity Fight