93
Web Components @joonaslehtinen Founder & CEO for Java Developers

Web Components for Java Developers

Embed Size (px)

Citation preview

Page 1: Web Components for Java Developers

Web Components

@joonaslehtinen Founder & CEO

for Java Developers

Page 2: Web Components for Java Developers

Component based UI?

Web Components 101

Integration strategies

Page 3: Web Components for Java Developers

Component Oriented UI?

Page 5: Web Components for Java Developers

BenefitsComposition

Separation

Reusability

Page 6: Web Components for Java Developers

Rich component

oriented UI in Java?

Page 7: Web Components for Java Developers

SwingJava FX

Statically typed Java

UI Components

Applets

RPC

Stateless

Page 8: Web Components for Java Developers

JSF

XML + Java

UI Components

Multi page rendering

Glue Ajax on top

Stateful

Page 9: Web Components for Java Developers

GWT

Statically typed Java

RPC

UI Components

Stateless

Compiles to JavaScript

Page 10: Web Components for Java Developers

Vaadin ZK

Single-page rendering

Automatic communications

Statically typed Java

Stateful

UI Components

Page 11: Web Components for Java Developers

Problem solved for Java developers?

Page 12: Web Components for Java Developers

Web Java>>

Page 13: Web Components for Java Developers

Web Components 101

Page 14: Web Components for Java Developers

<x-gangnam-style> </x-gangnam-style>

Page 15: Web Components for Java Developers

Everything is an element

DOM is the Framework

Page 16: Web Components for Java Developers
Page 17: Web Components for Java Developers

<my-component></my-component>

Custom Elements

Page 18: Web Components for Java Developers

document.registerElement( 'my-component', { prototype: proto } );

Custom Elements

Page 19: Web Components for Java Developers

var proto = Object.create(HTMLElement.prototype); proto.createdCallback = function() { var div = document.createElement('div'); div.textContent = 'My Custom Element'; this.appendChild(div); };

Custom Elements

Page 20: Web Components for Java Developers

Custom Elements

Page 21: Web Components for Java Developers

Shadow DOM

Page 22: Web Components for Java Developers

Shadow DOM

Document<my-component> (shadow host)

Shadow border

<div>

"This is Shadow DOM"

Page 23: Web Components for Java Developers

Shadow DOM

var host = document.querySelector('#host');

var root = host.createShadowRoot();

var div = document.createElement('div'); div.textContent = 'This is Shadow DOM'; root.appendChild(div);

Page 24: Web Components for Java Developers

Shadow DOM

var proto = Object.create(HTMLElement.prototype); proto.createdCallback = function() { var root = this.createShadowRoot(); root.textContent = 'My Custom Element'; };

Page 25: Web Components for Java Developers

Shadow DOM

Page 26: Web Components for Java Developers

Shadow DOM

Document (light DOM)<my-component> (shadow host)

Shadow border

<div> (shadow DOM)Content border

<div> (light DOM)

Page 27: Web Components for Java Developers

Shadow DOM Dictionary

Local DOM = DOM created and managed by custom element

Shadow DOM = native way of implementing Light DOM

Light DOM = "Normal" DOM that is written to page ("view source")

Shady DOM = Local DOM imply in normal DOM by Polymer

Page 28: Web Components for Java Developers

Shadow DOM

Document (light DOM)<my-component> (host)

Shadow border

<div> (shadow/local)Content border

<div> (light DOM)

<div> (local DOM)

Content border

<div> (light DOM)

Page 29: Web Components for Java Developers

<template id="tmp"> <style> ... </style> <div> <h1>Web Components</h1> <img src="logo.svg"> </div> </template>

Templates

Page 30: Web Components for Java Developers

var tmp = document.querySelector('#tmp'); var clone = document.importNode(tmp.content, true); var host = document.querySelector('#host'); host.appendChild(clone);

Templates

Page 31: Web Components for Java Developers

HTML Imports

"import com.mybusiness.MyComponent;"

but for HTML5

Page 32: Web Components for Java Developers

index.html<link rel="import" href="my-component.html">

my-component.html<link rel="stylesheet" href="css/style.css"> <script src="js/script.js">

HTML Imports

Page 33: Web Components for Java Developers

Browser Support?:-?

Page 34: Web Components for Java Developers

Blink:-)

Everything pretty much works

Page 35: Web Components for Java Developers

Firefox:-|

Mozilla is committed in bringing full support, but not all of it is there yet

Page 36: Web Components for Java Developers

WebKit:-|

Shadow DOM landed on the trunk last week, but Apple is keeping mouth shut on its plans

Page 37: Web Components for Java Developers

Edge:-|

Microsoft started working on it and is committed to releasing a full support eventually

Page 38: Web Components for Java Developers

IE:-(

Guaranteed to never add support

Page 39: Web Components for Java Developers

Custom Element

HTML Template

Shadow DOM

HTML Import

CHROME OPERA FIREFOX SAFARI IE

Browser support

Page 40: Web Components for Java Developers

Polyfills:-]

Trying to emulate it on all "modern browsers"

Page 41: Web Components for Java Developers

https://github.com/webcomponents/webcomponentsjs

*Indicates the current version of the browser, ~Indicates support may be flaky. If using Custom Elements or HTML Imports with Shadow DOM, you will get the non-flaky Mutation Observer polyfill that Shadow DOM includes.

Polyfill: webcomponents.js support

Page 42: Web Components for Java Developers
Page 43: Web Components for Java Developers

Polymer

Page 44: Web Components for Java Developers

<my-counter counter="10">Points</my-counter>

Increase

PointsValue: 10

Page 45: Web Components for Java Developers

<dom-module id="my-counter">

<template> <style> /*...*/ </style> <div id="label"><content></content></div> Value: <span id="counterVal">{{counter}}</span><br> <button on-tap="{{increment}}">Increment</button> </template>

<script> … </script>

</dom-module>

Page 46: Web Components for Java Developers

Polymer({ is: 'my-counter',

properties: { counter: { type: Integer, value: 0, // Default value } counterChanged: function() { this.$.counterVal.classList.add('highlight'); }, increment: function() { this.counter++; } });

Page 47: Web Components for Java Developers
Page 48: Web Components for Java Developers

https://www.polymer-project.org/1.0/

Page 49: Web Components for Java Developers

Web Components in Java apps?

Page 50: Web Components for Java Developers

1) REST API in Java

2) Wrap with GWT

3) Bind to server-side Java

Page 51: Web Components for Java Developers

1) REST API in Java

2) Wrap with GWT

3) Bind to server-side Java

Page 52: Web Components for Java Developers

Spring

Page 53: Web Components for Java Developers

Vaadin Elements

Web Components library that seamlessly extends Polymer with

focus on building business apps

Page 54: Web Components for Java Developers

<vaadin-grid>

Page 55: Web Components for Java Developers

Render static HTML in a JSP?

<vaadin-grid> <table> <colgroup> <col header-text="Name"> <col header-text="Value"> <col header-text="Progress"> </colgroup> <tbody> <tr> <td>Project A</td><td>10000</td><td>0.8</td> </tr>...

Lose benefits

with a slow multi-page app

Page 56: Web Components for Java Developers

Setup columns

Page 57: Web Components for Java Developers
Page 58: Web Components for Java Developers

Configure grid and bind to REST API

Page 59: Web Components for Java Developers

function PagedDataSource()

< 160 lines of Ajax, paging, caching, sorting and other logic >

Page 60: Web Components for Java Developers

Render a column with progressbar

Page 61: Web Components for Java Developers

Build REST API (finally some Java ):-)

Spring is magical…

Page 62: Web Components for Java Developers

Build REST API

Page 63: Web Components for Java Developers

https://github.com/vaadin-marcus/vaadin-grid-rest

Page 64: Web Components for Java Developers

1) REST API in Java

2) Wrap with GWT

3) Bind to server-side Java

Page 65: Web Components for Java Developers
Page 66: Web Components for Java Developers

Vaadin GWT

Polymer Elements

GWT API generated for Polymer Paper and Iron elements

Page 67: Web Components for Java Developers

https://github.com/vaadin/gwt-polymer-elements

Source

Page 68: Web Components for Java Developers

Bootstrap GWT application

Page 69: Web Components for Java Developers

UI Binder Support

Page 70: Web Components for Java Developers

Widget Java Class

Page 71: Web Components for Java Developers

http://www.gwtproject.org/doc/latest/polymer-tutorial/create.html

Step-by-step tutorial

Page 72: Web Components for Java Developers

https://github.com/vaadin/gwt-api-generator

Vaadin GWT API Generator

my-component.html MyComponent.java

Page 73: Web Components for Java Developers

1) REST API in Java

2) Wrap with GWT

3) Bind to server-side Java

Page 74: Web Components for Java Developers

Framework

Page 75: Web Components for Java Developers

UI in Server-side Java

Page 76: Web Components for Java Developers

• Initial HTML • CSS (theme) • Images • JavaScript

1.2M total

307k

compress

135k

reduced widgetset

Page 77: Web Components for Java Developers
Page 78: Web Components for Java Developers

• name=”Joonas” • button clicked

261 bytes

Page 79: Web Components for Java Developers
Page 80: Web Components for Java Developers

• name=”Joonas” • button clicked

261 bytes

• Add notification

267 bytes

Page 81: Web Components for Java Developers

Connecting web components

Option 1: AbstractJavaScriptComponent

Option 2: Server-side Elements Add-on

Option 3: Vaadin 8, eventually :)

Page 82: Web Components for Java Developers

Connecting web components

Option 1: AbstractJavaScriptComponent

Option 2: Server-side Elements Add-on

Option 3: Vaadin 8, eventually :)

Page 83: Web Components for Java Developers

UI in Server-side Java

Page 84: Web Components for Java Developers

PaperButton.java

Page 85: Web Components for Java Developers

Communication

Page 86: Web Components for Java Developers

Construction

Page 87: Web Components for Java Developers

Event API

Page 88: Web Components for Java Developers
Page 89: Web Components for Java Developers

Recommendations For Java developers

Page 90: Web Components for Java Developers

Keep using Java based component oriented frameworks you use today.

Page 91: Web Components for Java Developers

Wrap web components to your current framework 1-by-1, but only when needed.

Page 92: Web Components for Java Developers

Consider going all-in when your target browsers and Java framework support web components natively.

Page 93: Web Components for Java Developers

@joonaslehtinen Founder & CEO

Je zult maar letter wezen. Goed, ik ben niet ontevredet. Maar het valt niet mee in deze zeventiger jaren tot het vaderlandse alfabet te behoren. Foto-zetterijen wringen je steeds in steeds ingevikkelder. Je zult maar letter wezen. Goed, ik ben

slides slideshare.com/joonaslehtinen

Hiring toVaadin Berlin