KEMBAR78
Vaadin with Java EE 7 | PDF
Vaadin with
Java EE 7
Peter Lehto
@peter_lehto
Expert & trainer / Vaadin
Vaadin with
Java EE 7
Peter Lehto
@peter_lehto
Expert & trainer / Vaadin
What is
Vaadin?
Java EE 7
Vaadin
CDI
Addon
Structuring
Vaadin
App
How to
get started
QA
Application
architecture
Server driven UI
framework for rich
web applications
User Interface
Components
User Interface
Components
Developer
Productivity
Rich
UX
Server side UI
How?
• Loader page
• CSS Theme
• Images
• JavaScript
• Loader page
• CSS Theme
• Images
• JavaScript
135k
Compressed &
reduced
thin client
• name=”Joonas”
• button clicked
261 bytes

• name=”Joonas”
• button clicked
261 bytes
• Add notification
267 bytes

Java
Enterprise Edition 7
Collection of Java Specification
Requests (JSRs)
Collection of Java Specification
Requests (JSRs)
Implemented by app servers
Do you know some
Java EE specs?
Java Persistence
API 2.1 (JPA)

(JSR-338)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Server Faces
2.2 (JSF)

(JSR-344)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Server Faces
2.2 (JSF)

(JSR-344)
Java Server Pages
2.3 (JSP)

(JSR-245)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Server Faces
2.2 (JSF)

(JSR-344)
Java Server Pages
2.3 (JSP)

(JSR-245)
Bean Validation 1.1

(JSR-349)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Server Faces
2.2 (JSF)

(JSR-344)
Java Server Pages
2.3 (JSP)

(JSR-245)
Bean Validation 1.1

(JSR-349)Interceptors 1.2

(JSR-318)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Server Faces
2.2 (JSF)

(JSR-344)
Java Server Pages
2.3 (JSP)

(JSR-245)
Bean Validation 1.1

(JSR-349)Interceptors 1.2

(JSR-318)
Java Transaction
API 1.2 (JTA)

(JSR-907)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Server Faces
2.2 (JSF)

(JSR-344)
Java Server Pages
2.3 (JSP)

(JSR-245)
Bean Validation 1.1

(JSR-349)Interceptors 1.2

(JSR-318)
Java Transaction
API 1.2 (JTA)

(JSR-907)
Java API for RESTful
Web Services 2.0

(JAX-RS)

(JSR-907)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Server Faces
2.2 (JSF)

(JSR-344)
Java Server Pages
2.3 (JSP)

(JSR-245)
Bean Validation 1.1

(JSR-349)Interceptors 1.2

(JSR-318)
Java Transaction
API 1.2 (JTA)

(JSR-907)
Java API for RESTful
Web Services 2.0

(JAX-RS)

(JSR-907)
Java API for XML based
Web Services 2.2

(JAX-WS)

(JSR-907)
Java Persistence
API 2.1 (JPA)

(JSR-338)
Enterprise Java
Beans 3.2 (EJB)

(JSR-345)
Java Servlet 3.1

(JSR-340)
Java Message
Service 2.0 (JMS)

(JSR-343)
Context and 

Dependency

Injection 1.1 (CDI)

(JSR-340)
Java Server Faces
2.2 (JSF)

(JSR-344)
Java Server Pages
2.3 (JSP)

(JSR-245)
Bean Validation 1.1

(JSR-349)Interceptors 1.2

(JSR-318)
Java Transaction
API 1.2 (JTA)

(JSR-907)
Java API for RESTful
Web Services 2.0

(JAX-RS)

(JSR-907)
Java API for XML based
Web Services 2.2

(JAX-WS)

(JSR-907)
Java Architecture for
XML Binding 2.2 

(JAX-B)

(JSR-222)
APIs that form your technology stack
Which APIs should I know?
Java Persistence API 2.1
(JPA)
Customer
@Entity
______________________________
@Id

@AutoGenerated

Long id;

@Column(nullable = false)

String name;

Date birthdate;
Customer
@Entity
______________________________
Customer
Id name birthdate
1 Alex 07.02.1984
2 John 18.2.1992
@Id

@AutoGenerated

Long id;

@Column(nullable = false)

String name;

Date birthdate;
Customer
@Id

@AutoGenerated

Long id;

@Column(nullable = false)

String name;

Date birthdate;

@OneToMany(mappedBy=“customer”)

List<Invoice> invoices;
@Entity
______________________________
Customer
Id name birthdate
1 Alex 07.02.1984
2 John 18.2.1992
Invoice
Id customer number
1 1 123
2 1 124
Enterprise Java Beans 3.2 

(EJB)
Business layer services
Enterprise Java Beans
Business layer services
@local and @remote
Enterprise Java Beans
Business layer services
@local and @remote
Enterprise Java Beans
Transaction boundaries
(UI)
CustomerView
(@Remote)
CustomerService

(UI)
CustomerView

@Remote
@Local
(@Remote)
CustomerService

(UI)
CustomerView

(@Stateless)
CustomerService

Bean

@Remote
@Local
@Stateless
@Stateful
@Singleton
(@Stateless)
CustomerService

Bean

(@Stateless)
CustomerService

Bean
(DB)
Customer

Database
@Local
public interface CustomerService {
void storeCustomers(Collection<Customer> customers);
void removeCustomers(Collection<Customer> customers);
Collection<Customer> getAllCustomers()
Optional<Customer> getCustomerByName(String name);
}
@Stateless
public class CustomerServiceBean implements
CustomerService {
@PersistenceContext
private EntityManager em;
public void storeCustomers(Collection<Customer> cu) {
cu.forEach(c -> storeCustomer(c));
}
public void storeCustomer(Customer c) {
em.merge(c);
}
}
Context and 

Dependency

Injection 1.2 (CDI)
Instead of saying new say @Inject
Context and Dependency
Injection
Instead of saying new say @Inject
Decouples code and lets container
manage dependencies
Context and Dependency
Injection
Object references by scopes
Context and Dependency
Injection
@ApplicationScoped
@SessionScoped
@RequestScoped
Context and Dependency
Injection
Object references by scopes
@UIScoped
@ViewScoped
Context and Dependency
Injection
@ApplicationScoped
@SessionScoped
@RequestScoped
Object references by scopes
@Stateless
CustomerService

_________________

@UIScoped
AppUI

_________________

@EJB

CustomerService service;
@Stateless
InvoiceService

@Stateless
CustomerService

_________________

@EJB

InvoiceService invoices;
@UIScoped
AppUI

_________________

@EJB

CustomerService service;
@Stateless
CustomerService

_________________

@EJB

InvoiceService invoices;
@UIScoped
AppUI

_________________

@EJB

CustomerService service;

@Inject

MainMenu mainMenu;

@Inject

User currentUser;
@UIScoped
MainMenu

_________________

@Inject

Event<MenuEvent> menuEventSource;
@Stateless
InvoiceService
Integration to EE through
Vaadin CDI
Managed UI with @CDIUI
Managed UI with @CDIUI
Allows injection with @Inject and @EJB
Easily reference EE objects
Allows injection with @Inject and @EJB
Managed UI with @CDIUI
@CDIUI(“”)
public class AppUI extends UI {
}
@CDIUI(“”)
public class AppUI extends UI {
@Inject
private MainMenu mainMenu;
@Inject
private User currentUser;
@Inject
private ViewManager viewManager;
public void init(VaadinRequest request) {
VerticalLayout layout = new VerticalLayout();
layout.addComponent(mainMenu);
setContent(layout);
}
}
@UIScoped
AppUI
_____________________________
@Inject

private MainMenu menu;

@Inject

private ViewManager viewMgr;

@Inject

private User loggedInUser;

<<UIScope>>
MainMenu

ViewManager

<<SessionScope>>
User
<<UIScope>>
MenuBar

Footer

ViewManager

<<SessionScope>>
User

@UIScoped
AppUI
_____________________________
@Inject

private MenuBar menu;

@Inject

private ViewManager viewMgr;

@Inject

private User loggedInUser;

<<UIScope>>
MenuBar

Footer

ViewManager

<<UIScope>>
MenuBar

Footer

ViewManager

<<UIScope>>
MenuBar

ViewManager
VaadinServlet
VaadinServlet
HttpSession
1
n
VaadinServlet
HttpSession VaadinSession
1
n
1 1
1
n
VaadinServlet
HttpSession VaadinSession
UI
1
n
1 1
1
n
1
n
@UIScoped
@UIScoped
UI specific bean references
@UIScoped
UI specific bean references
CDI context for mapping beans per UI
@UIScoped
UI specific bean references
CDI context for mapping beans per UI
@UIScoped
@UIScoped
public class MainMenu extends CustomComponent {
}
@UIScoped
public class MainMenu extends CustomComponent {
@Inject
private Event<NavigationEvent> eventSource;
protected void onMenuItemClicked(MenuItem item) {
eventSource.fireEvent(new NavigationEvent(item));
}
}
@CDIUI(“”)
public class AppUI extends UI {
…
protected void onNavigationEvent(@Observes
NavigationEvent event) {
viewMgr.navigateTo(event.getView());
}
}
Structuring Vaadin App with
Model View Presenter
Do you like
spaghetti?
Do you like
spaghetti?
Let’s clean it!
History behind MVP
Late
1970s
Late
1970s
Originally Model-View-Controller
Late
1970s
SmallTalk-80
Originally Model-View-Controller
Late
1970s
SmallTalk-80
Controller is mediator between
end user and application
Originally Model-View-Controller
1980s
1980s
Taligent Model-View-Presenter
1980s
Influenced by SmallTalk-80
Taligent Model-View-Presenter
1980s
Influenced by SmallTalk-80
Model, View, Presenter,
Interactors, Commands, Selections
Taligent Model-View-Presenter
1980s
Influenced by SmallTalk-80
Model, View, Presenter,
Interactors, Commands, Selections
Taligent Model-View-Presenter
Presenter orchestrates the
structure, not the input
late
1980s
late
1980s
Dolphin-Smalltalk MVP
late
1980s
Simplified Taligent MVP
Dolphin-Smalltalk MVP
late
1980s
Simplified Taligent MVP
View handles events by notifying
presenter
Dolphin-Smalltalk MVP
late
1980s
Simplified Taligent MVP
View handles events by notifying
presenter
Dolphin-Smalltalk MVP
Presenter handles the logic,
not the user input control
late
1980s
Simplified Taligent MVP
View handles events by notifying
presenter
Dolphin-Smalltalk MVP
Presenter handles the logic,
not the user input control
UI layer MVP targets
Clean code best practices
like…
Single responsibility principle
Class should have only one reason to change
Image credit: http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/
Open closed principle
Open for extension, closed for change
Image credit: http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/
Dependency Inversion principle
Depend on abstraction, not concretions
Image credit: http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/
Today
many MVP variations exists
Here’s one…
Model-View-Presenter
Presenter
View Model
Model-View-Presenter
Presenter
View Model
View Impl
Model-View-Presenter
Presenter
View Model
Example
EditorView
- Button saveButton;
- Button cancelButton;
- FieldGroup personFieldGroup;
- saveButtonClicked()
- cancelButtonClicked()
ClickListener
+ buttonClicked()
Presenter
+ saveButtonClicked()
+ cancelButtonClicked()
EditorView
- Button saveButton;
- Button cancelButton;
- FieldGroup personFieldGroup;
+ commitChanges()
+ discardChanges()
ClickListener
+ buttonClicked()
Example
+ commitChanges()
+ discardChanges()
Presenter
+ saveButtonClicked()
+ cancelButtonClicked()
EditorViewImpl
- Button saveButton;
- Button cancelButton;
- FieldGroup personFieldGroup;
+ commitChanges()
+ discardChanges()
ClickListener
+ buttonClicked()
Example
EditorView
Benefits of MVP
Benefits of MVP
Simpler classes by SRP
Benefits of MVP
Simpler classes by SRP
Complex UI logic separated from
rendering
Benefits of MVP
Simpler classes by SRP
Complex UI logic separated from
rendering
Logic becomes easier to test by DIP
Application
Architecture
Client
Browser
View
<<EJB>>
Business
Logic
Server-side-UI
Presenter
<<JPA>>
Persistency
Business Persistency
Client
Browser
View
Server-side-UI
public interface CustomerView extends
ApplicationView<CustomerViewPresenter> {
}
public interface CustomerView extends
ApplicationView<CustomerViewPresenter> {
void populateCustomers(Collection<Customer> customers);
void openEditorFor(Customer customer);
void closeEditor();
void removeTableSelection();
}
Client
Browser
View
Server-side-UI
Presenter
@ViewScoped
public class CustomerViewPresenter extends AbstractPresenter<CustomerView> {
}
@ViewScoped
public class CustomerViewPresenter extends AbstractPresenter<CustomerView> {
@EJB
private CustomerService customerService;
@Override
protected void onViewEnter() {
getView().populateCustomers(customerService.getAllCustomers());
}
}
@ViewScoped
public class CustomerViewPresenter extends AbstractPresenter<CustomerView> {
@EJB
private CustomerService customerService;
@Override
protected void onViewEnter() {
getView().populateCustomers(customerService.getAllCustomers());
}
public void onCustomerSaved(@Observes CustomerSavedEvent event) { … }
public void onCustomerRemoved(@Observes CustomerRemovedEvent event) { … }
public void onCustomerSelected(@Observes CustomerSelectedEvent event) { … }
}
Client
Browser
View
<<EJB>>
Business
Logic
Server-side-UI
Presenter
Business
@Local
public interface CustomerService {
void storeCustomers(Collection<Customer> customers);
void removeCustomers(Collection<Customer> customers);
Collection<Customer> getAllCustomers();
Optional<Customer> getCustomerByUsername(String username);
}
Application
Architecture
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class CustomerServiceBean implements CustomerService {
@PersistenceContext(unitName = "appUnit")
private EntityManager entityManager;
@Override
public void storeCustomers(Collection<Customer> customers) {
customers.forEach(cu -> entityManager.merge(cu));
}
@Override
public Collection<Customer> getAllCustomers() {
return entityManager.createQuery(query).getResultList();
}
…
}
Client
Browser
View
<<EJB>>
Business
Logic
Server-side-UI
Presenter
<<JPA>>
Persistency
Business Persistency
Application
Architecture
@Entity
public class Customer {
@Id
@AutoGenerated
private Long id;
private String name;
@Temporal(DATE)
private Date birthDate;
public boolean isPersisted() {
return id != null;
}
…
}
<persistence-unit name="appUnit" transaction-type="JTA">
<jta-data-source>jdbc/app-backend</jta-data-source>
<class>org.vaadin.example.backend.entity.Customer</class>
<properties>
<property name="…" … />
</properties>
</persistence-unit>
How to
Get Started?
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-cdi</artifactId>
<version>1.0.2</version>
</dependency>
<repository>
<id>vaadin-addons</id>
<url>http://maven.vaadin.com/vaadin-addons</url>
</repository>
Eclipse
Download plugin
from Martketplace
IntelliJ IDEA
Built-in support
Netbeans
Download plugin
Netbeans Plugin Portal
slides
slideshare.net/PeterLehto
Peter Lehto
@peter_lehto
Vaadin Expert & trainer
Example App
github.com/peterl1084/cdiexample
slides
slideshare.net/PeterLehto
Peter Lehto
@peter_lehto
Vaadin Expert & trainer
Example App
github.com/peterl1084/cdiexample
slides
slideshare.net/PeterLehto
Peter Lehto
@peter_lehto
Vaadin Expert & trainer
Thank you!
slides
slideshare.net/PeterLehto
Peter Lehto
@peter_lehto
Vaadin Expert & trainer
Thank you!
What did we learn today?
What did we learn today?
1. Java EE contains tons of specifications for enterprise apps
What did we learn today?
1. Java EE contains tons of specifications for enterprise apps
2. Vaadin is a great way to assemble UIs with components
What did we learn today?
1. Java EE contains tons of specifications for enterprise apps
2. Vaadin is a great way to assemble UIs with components
3. Combining Vaadin with Java EE works best through CDI
What did we learn today?
1. Java EE contains tons of specifications for enterprise apps
2. Vaadin is a great way to assemble UIs with components
3. Combining Vaadin with Java EE works best through CDI
4. Write maintainable code by following best practices
Get the book!
vaadin.com/book
PDF, ePub, HTML
Vol 1
288 pages
Vol 2
434 pages
Rate the
presentation
gwtcreate.com/agenda
Peter Lehto
@peter_lehto
Vaadin Expert & trainer
Rate the
presentation
gwtcreate.com/agenda
Peter Lehto
@peter_lehto
Vaadin Expert & trainer

Vaadin with Java EE 7