81
BUILDING WEB APPS IN JAVA @MARCUSHELLBERG

Building web apps with Vaadin 8

Embed Size (px)

Citation preview

Page 1: Building web apps with Vaadin 8

B U I L D I N G W E B A P P S I N J A V A

! @ M A R C U S H E L L B E R G

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

Page 2: Building web apps with Vaadin 8

Apache 2.0

Page 3: Building web apps with Vaadin 8

150k+ active developers

Apache 2.0

Page 4: Building web apps with Vaadin 8

40% of Fortune 100 companies use Vaadin

150k+ active developers

Apache 2.0

Page 5: Building web apps with Vaadin 8

40% of Fortune 100 companies use Vaadin

150k+ active developers

#2 Java Web Frameworkaccording to Open HUB stats

Apache 2.0

Page 6: Building web apps with Vaadin 8

things you'll learn

1. What it takes to build a modern web app

2. The building blocks of Vaadin

3. How to build a full stack app in 30 minutes

Page 7: Building web apps with Vaadin 8

M O D E R N W E B A P P S

Page 8: Building web apps with Vaadin 8

demo.vaadin.com/dashboard

Page 9: Building web apps with Vaadin 8
Page 10: Building web apps with Vaadin 8
Page 11: Building web apps with Vaadin 8

MyController.java

Page 12: Building web apps with Vaadin 8

MyController.java

@RestController @RequestMapping("/analytics") public class AnalyticsController {

@Autowired PatientsRepository patientsRepository;

@RequestMapping(path = "/age", method = RequestMethod.GET) public Response getByAge() { ... }

@RequestMapping(path = "/length", method = RequestMethod.GET) public Response getByLength() { ... } ... ...

Page 13: Building web apps with Vaadin 8

MyController.java my-view.template.html

@RestController @RequestMapping("/analytics") public class AnalyticsController {

@Autowired PatientsRepository patientsRepository;

@RequestMapping(path = "/age", method = RequestMethod.GET) public Response getByAge() { ... }

@RequestMapping(path = "/length", method = RequestMethod.GET) public Response getByLength() { ... } ... ...

Page 14: Building web apps with Vaadin 8

MyController.java my-view.template.html

@RestController @RequestMapping("/analytics") public class AnalyticsController {

@Autowired PatientsRepository patientsRepository;

@RequestMapping(path = "/age", method = RequestMethod.GET) public Response getByAge() { ... }

@RequestMapping(path = "/length", method = RequestMethod.GET) public Response getByLength() { ... } ... ...

<nav> <a href="/analytics/age" routerLinkActive="active">Age</a> <a href="/analytics/doctor" routerLinkActive="active">Doctor</a> <a href="/analytics/gender" routerLinkActive="active">Gender</a> </nav> ...

Page 15: Building web apps with Vaadin 8

MyController.java my-view.template.html

my-view.css

@RestController @RequestMapping("/analytics") public class AnalyticsController {

@Autowired PatientsRepository patientsRepository;

@RequestMapping(path = "/age", method = RequestMethod.GET) public Response getByAge() { ... }

@RequestMapping(path = "/length", method = RequestMethod.GET) public Response getByLength() { ... } ... ...

<nav> <a href="/analytics/age" routerLinkActive="active">Age</a> <a href="/analytics/doctor" routerLinkActive="active">Doctor</a> <a href="/analytics/gender" routerLinkActive="active">Gender</a> </nav> ...

Page 16: Building web apps with Vaadin 8

MyController.java my-view.template.html

my-view.css

@RestController @RequestMapping("/analytics") public class AnalyticsController {

@Autowired PatientsRepository patientsRepository;

@RequestMapping(path = "/age", method = RequestMethod.GET) public Response getByAge() { ... }

@RequestMapping(path = "/length", method = RequestMethod.GET) public Response getByLength() { ... } ... ...

<nav> <a href="/analytics/age" routerLinkActive="active">Age</a> <a href="/analytics/doctor" routerLinkActive="active">Doctor</a> <a href="/analytics/gender" routerLinkActive="active">Gender</a> </nav> ...

nav { justify-content: center; text-transform: uppercase; margin-bottom: 50px; } ...

Page 17: Building web apps with Vaadin 8

MyController.java my-view.template.html

my-view.css

my-view.js

@RestController @RequestMapping("/analytics") public class AnalyticsController {

@Autowired PatientsRepository patientsRepository;

@RequestMapping(path = "/age", method = RequestMethod.GET) public Response getByAge() { ... }

@RequestMapping(path = "/length", method = RequestMethod.GET) public Response getByLength() { ... } ... ...

<nav> <a href="/analytics/age" routerLinkActive="active">Age</a> <a href="/analytics/doctor" routerLinkActive="active">Doctor</a> <a href="/analytics/gender" routerLinkActive="active">Gender</a> </nav> ...

nav { justify-content: center; text-transform: uppercase; margin-bottom: 50px; } ...

Page 18: Building web apps with Vaadin 8

MyController.java my-view.template.html

my-view.css

my-view.js

@RestController @RequestMapping("/analytics") public class AnalyticsController {

@Autowired PatientsRepository patientsRepository;

@RequestMapping(path = "/age", method = RequestMethod.GET) public Response getByAge() { ... }

@RequestMapping(path = "/length", method = RequestMethod.GET) public Response getByLength() { ... } ... ...

<nav> <a href="/analytics/age" routerLinkActive="active">Age</a> <a href="/analytics/doctor" routerLinkActive="active">Doctor</a> <a href="/analytics/gender" routerLinkActive="active">Gender</a> </nav> ...

nav { justify-content: center; text-transform: uppercase; margin-bottom: 50px; } ...

getAnalytics(grouping: string = 'age') { return this.http .get(`${this.config.API_URL}/analytics/${grouping}`) .map(res=>res.json()); }

Page 19: Building web apps with Vaadin 8

F F S

Page 20: Building web apps with Vaadin 8

F I G H T F O R S I M P L I C I T Y

Page 21: Building web apps with Vaadin 8

new TextField(); new Button("Click me");

Page 22: Building web apps with Vaadin 8

new HorizontalLayout( new TextField(), new Button("Click me") );

Page 23: Building web apps with Vaadin 8

new VerticalLayout( new TextField(), new Button("Click me") );

Page 24: Building web apps with Vaadin 8

layout = new VerticalLayout(); textField = new TextField(); button = new Button("Click Me");

Page 25: Building web apps with Vaadin 8

layout = new VerticalLayout(); textField = new TextField(); button = new Button("Click Me");

button.addClickListener(click -> layout.addComponent( new Label(textField.getValue()) ));

Page 26: Building web apps with Vaadin 8

layout = new VerticalLayout(); textField = new TextField(); button = new Button("Click Me");

button.addClickListener(click -> layout.addComponent( new Label(textField.getValue()) ));

Page 27: Building web apps with Vaadin 8

private TextField firstName; private TextField lastName;

Page 28: Building web apps with Vaadin 8

private TextField firstName; private TextField lastName;

person = new Person();

Page 29: Building web apps with Vaadin 8

private TextField firstName; private TextField lastName;

person = new Person();

binder = new BeanBinder<>( Person.class);

Page 30: Building web apps with Vaadin 8

private TextField firstName; private TextField lastName;

person = new Person();

binder = new BeanBinder<>( Person.class);

binder.bindInstanceFields(this);

Page 31: Building web apps with Vaadin 8

save = new Button("Save", e -> { // try-catch binder.writeBean(person);

Notification.show( person.toString()); });

private TextField firstName; private TextField lastName;

person = new Person();

binder = new BeanBinder<>( Person.class);

binder.bindInstanceFields(this);

Page 32: Building web apps with Vaadin 8

save = new Button("Save", e -> { // try-catch binder.writeBean(person);

Notification.show( person.toString()); });

private TextField firstName; private TextField lastName;

person = new Person();

binder = new BeanBinder<>( Person.class);

binder.bindInstanceFields(this);

Page 33: Building web apps with Vaadin 8

@Autowired private PersonService service;

Page 34: Building web apps with Vaadin 8

@Autowired private PersonService service;

Grid<Person> grid = new Grid<>();

Page 35: Building web apps with Vaadin 8

@Autowired private PersonService service;

Grid<Person> grid = new Grid<>();

grid.addColumn("First name", Person::getFirstName); grid.addColumn("Last name", Person::getLastName); grid.addColumn("Email", Person::getEmail);

Page 36: Building web apps with Vaadin 8

@Autowired private PersonService service;

Grid<Person> grid = new Grid<>();

grid.addColumn("First name", Person::getFirstName); grid.addColumn("Last name", Person::getLastName); grid.addColumn("Email", Person::getEmail);

grid.setItems(service.getPeople());

Page 37: Building web apps with Vaadin 8

@Autowired private PersonService service;

Grid<Person> grid = new Grid<>();

grid.addColumn("First name", Person::getFirstName); grid.addColumn("Last name", Person::getLastName); grid.addColumn("Email", Person::getEmail);

grid.setItems(service.getPeople());

Page 38: Building web apps with Vaadin 8

@Autowired private PersonService service;

Grid<Person> grid = new Grid<>();

grid.addColumn("First name", Person::getFirstName); grid.addColumn("Last name", Person::getLastName); grid.addColumn("Email", Person::getEmail);

Page 39: Building web apps with Vaadin 8

grid.addColumn("First name", Person::getFirstName); grid.addColumn("Last name", Person::getLastName); grid.addColumn("Email", Person::getEmail);

Page 40: Building web apps with Vaadin 8

grid.addColumn("First name", Person::getFirstName); grid.addColumn("Last name", Person::getLastName); grid.addColumn("Email", Person::getEmail);

grid.setDataSource( new BackEndDataSource<>( q -> service.getPeople( q.getOffset(), q.getLimit()) .stream(), q -> service.count()));

Page 41: Building web apps with Vaadin 8

grid.addColumn("First name", Person::getFirstName); grid.addColumn("Last name", Person::getLastName); grid.addColumn("Email", Person::getEmail);

grid.setDataSource( new BackEndDataSource<>( q -> service.getPeople( q.getOffset(), q.getLimit()) .stream(), q -> service.count()));

Page 42: Building web apps with Vaadin 8

navBar = new HorizontalLayout(); navBar.addComponent( new Button("view1", click -> nav.navigateTo(""))); navBar.addComponent( new Button("view2", click -> nav.navigateTo("view2")));

Page 43: Building web apps with Vaadin 8

navBar = new HorizontalLayout(); navBar.addComponent( new Button("view1", click -> nav.navigateTo(""))); navBar.addComponent( new Button("view2", click -> nav.navigateTo("view2")));

CssLayout navOutlet = new CssLayout(); addComponents(navBar, navOutlet);

Page 44: Building web apps with Vaadin 8

nav = new Navigator(this, navOutlet); nav.addView("", new DemoView("Hello, I'm view 1")); nav.addView("view2", new DemoView("Hello, I'm view 2"));

navBar = new HorizontalLayout(); navBar.addComponent( new Button("view1", click -> nav.navigateTo(""))); navBar.addComponent( new Button("view2", click -> nav.navigateTo("view2")));

CssLayout navOutlet = new CssLayout(); addComponents(navBar, navOutlet);

Page 45: Building web apps with Vaadin 8

nav = new Navigator(this, navOutlet); nav.addView("", new DemoView("Hello, I'm view 1")); nav.addView("view2", new DemoView("Hello, I'm view 2"));

navBar = new HorizontalLayout(); navBar.addComponent( new Button("view1", click -> nav.navigateTo(""))); navBar.addComponent( new Button("view2", click -> nav.navigateTo("view2")));

CssLayout navOutlet = new CssLayout(); addComponents(navBar, navOutlet);

Page 46: Building web apps with Vaadin 8

$v-background-color: hsl(210, 0%, 100%);

Page 47: Building web apps with Vaadin 8

$v-background-color: hsl(210, 0%, 33%);

Page 48: Building web apps with Vaadin 8

$v-background-color: hsl(210, 0%, 100%); $v-border: 2px solid v-shade; $v-border-radius: 0; $v-bevel: false; $v-gradient: false; $v-shadow: false;

Page 49: Building web apps with Vaadin 8
Page 50: Building web apps with Vaadin 8
Page 51: Building web apps with Vaadin 8

[insert code here]

Page 52: Building web apps with Vaadin 8

" github.com/vaadin-marcus/spring-boot-todo

Page 53: Building web apps with Vaadin 8

TextField name = new TextField(); Button button = new Button("Greet"); layout.addComponents(name, button);

button.addClickListener(click -> { Notification.show("Hi, " + name.getValue()); });

Page 54: Building web apps with Vaadin 8

Initial HTML CSS JavaScript

~300k

Page 55: Building web apps with Vaadin 8
Page 56: Building web apps with Vaadin 8
Page 57: Building web apps with Vaadin 8

{name: {value: 'Marcus'}, button: {event: 'clicked'}}

261 bytes

Page 58: Building web apps with Vaadin 8

TextField name = new TextField(); Button button = new Button("Greet"); layout.addComponents(name, button);

button.addClickListener(click -> { Notification.show("Hi, " + name.getValue()); });

Page 59: Building web apps with Vaadin 8

TextField name = new TextField(); Button button = new Button("Greet"); layout.addComponents(name, button);

button.addClickListener(click -> { Notification.show("Hi, " + name.getValue()); });

Page 60: Building web apps with Vaadin 8
Page 61: Building web apps with Vaadin 8

{name: {value: 'Marcus'}, button: {event: 'clicked'}}

261 bytes

{new: [ {notification: 'Hi, Marcus'} ]}

267 bytes

Page 62: Building web apps with Vaadin 8
Page 63: Building web apps with Vaadin 8
Page 64: Building web apps with Vaadin 8
Page 65: Building web apps with Vaadin 8

.v-ui[width-range~="0-800px"]{ /* Styles for small devices */ } .v-ui[width-range~="801px-"]{ /* Styles for large devices */ }

Page 66: Building web apps with Vaadin 8

.v-ui[width-range~="0-800px"]{ /* Styles for small devices */ } .v-ui[width-range~="801px-"]{ /* Styles for large devices */ }

getPage().addBrowserWindowResizeListener( newSize -> { if (newSize.getWidth() > LARGE_DEVICE_WIDTH){ setupLargeLayout(); } else { setupSmallLayout(); } });

Page 67: Building web apps with Vaadin 8

W E B S O C K E T S

public class VaadinUI extends UI { ...

}

Page 68: Building web apps with Vaadin 8

W E B S O C K E T S

public class VaadinUI extends UI { ...

}

@Push

Page 69: Building web apps with Vaadin 8

W E B S O C K E T S

public class VaadinUI extends UI { ...

}

@Push

ui.access(() -> Notification.show("Alert!"));

Page 70: Building web apps with Vaadin 8

# $ % &

Page 71: Building web apps with Vaadin 8

# ' % &

Page 72: Building web apps with Vaadin 8

S T R O N G S E C U R I T Y(

Page 73: Building web apps with Vaadin 8

T H E J V M♥

Page 74: Building web apps with Vaadin 8

E X T E N D A B L E*

Page 75: Building web apps with Vaadin 8
Page 76: Building web apps with Vaadin 8
Page 77: Building web apps with Vaadin 8
Page 78: Building web apps with Vaadin 8
Page 79: Building web apps with Vaadin 8
Page 80: Building web apps with Vaadin 8

We'd be happy to help you.

Page 81: Building web apps with Vaadin 8

T H A N K Y O U

! @ M A R C U S H E L L B E R G

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