GWT Architectures and Lessons Learned (WJAX 2013)

Post on 25-May-2015

1,056 views 0 download

Tags:

description

GWT-Entwicklung ist Rich-Client-Entwicklung, und das ist für viele Webentwickler neu. Mit den "Lessons Learned" aus der Entwicklung von Google AdWords wurden Architekturmuster für GWT-Anwendungen vorgestellt. Einiges davon ist inzwischen in GWT gelandet und kann sofort eingesetzt werden. In diesem Vortrag werden Architekturmuster vorgestellt, die in den letzten Jahren in einigen Projekten erfolgreich eingesetzt wurden.

transcript

GWT Architectures and Lessons Learned

p.g.taboada | pgt technology scouting GmbH

Papick G. Taboada

pgt technology scouting GmbH!http://pgt.de

Orientation in Objects GmbH!http://oio.de

http://gwtreferencelist.appspot.com

‣GWT Development

‣Basics

‣Structuring the UI

Shift happened

Java development, JS deployment,

Async, RPC,

RIA/ single page, ...

Web 2.0 ? development is all about…

!…js

…html …css

!none of it

!…jcp

…oracle … IBM

… backend

what is a GWT application?

a chunk of JS that does a lot of DOM manipulation to create web

applications

Widget t = new TextBox(); !

RootPanel.get().add(t);

UI component model

Browser Composite

Components

Architecture shift

Web applications

Model 2 web applications

Rich internet applications

+ testability!+ maintainance!+ product development

Browser Server

user action

full html response

full html response

full html response

user action

user action

classi

c web !

development

Browser Server

event

first request

full html response

data

data request

data

data request

event

event

event

RIA web

development

Web frameworks

low level, generic tools

let‘s build big things

TextBox t0 = new TextBox(); TextBox t1 = new TextBox(); TextBox t2 = new TextBox(); TextBox t3 = new TextBox(); TextBox t4 = new TextBox();

VerticalPanel... SplitPanel... ScrollPanel

RootPanel.get().add(mainPanel);

maintainance hell

MacGyverAll he needed was a ballpoint

pen and a paper clip

Ops

app-framework wizardry needed

‣GWT Development

‣Basics

‣Structuring the UI

DANGER GWT DEVELOPMENT IS

COMPLICATED HOT NEW STUFF.

NOT REALLY

GWT development

is not new, but different

WEB DEVELOPMENT IS NOT NEW...

THERE IS NOT A MOMENT TO LOOSETHERE IS NOT A MOMENT TO LOOSEJan 2000 Jan 2005

XHTML 1.0Jan 2000

HTML 4.0.1Dez 1999

CSS 2Mai 1998

HTML 4.0 updateApril 1998

XHTML 1.1Mai 2001

HTML 2.0November 1995

HTML 4.0Dezember 1997

Java EE 1.2Dez 1999

JDK 1.1Feb 1997

Internet Explorer 6Aug 2001

JDK 1.0Jan 1996

CSS 2.1Feb 2004 – Jun 2011

CSS level 2 revision 1, often referred to as "CSS 2.1", fixes errors in CSS 2, removes poorly supported or not fully interoperable features and adds already-implemented browser extensions to the specification. In order to comply with the W3C Process for standardizing technical specifications, CSS 2.1 went back and forth between Working Draft status and Candidate Recommendation status for many years.

J2SE 1.2Dez 1998

J2SE 1.3Mai 2000

CSS 1Dez 1996

HTML 3.2Januar 1997

RICH CLIENT DEVELOPMENT IS NOT NEW EITHER

nothing new here

nothing new here too

Jan 2007

YES! This is my code!

It’s all aboutsoftware engineering

Just a few tips

USE MVP!You will get used to it

event bus pleasehttp://jarrettws.blogspot.de/2010/05/public-transport.html

eventbus.fireEvent( NotificationEvent.info( "Daten wurden erfolgreich gespeichert"

) );

SINGLETON don‘t public static instance

BUT ON IE 6 IT IS SO SLOW!

BUT ON IE 7 IT IS SO SLOW!

BUT ON IE 8 IT IS SO SLOW!

BUT ON IE 9 IT IS SO SLOW!

DID ANYONE TEST ON IE / SURFACE?

browsers day to day job

too many HTTP requests

WTF?

> 2400 DOM elements

too many widgets

use large HTML chunks

too many widgets ain‘t good

a Widget is a JS thing holding a DOM element

<div />

CREATE CUSTOM WIDGETS

don‘t extend FlextTable

don‘t extend VerticalPanel

don‘t extend SimplePanel

CREATE CUSTOM EVENTS

extend composite!!!

if you can, do it in CSS

@-webkit-keyframes redPulse { from { box-shadow: 0px 0px 2px #ff0033; } 50% { box-shadow: 0px 0px 10px #ff0033; } to

{ box-shadow: 0px 0px 2px #ff0033; } }

use LayoutPanel

<g:LayoutPanel styleName="{B.style.mainContent}"> <g:layer left="0" right="340px" top="0" height="50%"> <g:SimpleLayoutPanel styleName="{B.style.mainWidget}" addStyleNames="{B.style.termineGlow}"> <ux:DashboardTermineDataGrid ui:field="terminetable" styleName="{B.style.mainWidgetContent}" /> </g:SimpleLayoutPanel> </g:layer> <g:layer right="0" width="340px" top="0" height="50%"> <g:SimpleLayoutPanel styleName="{B.style.mainWidget}" addStyleNames="{B.style.finanzenGlow}"> <ux:KWStatsDataGrid ui:field="statstable" styleName="{B.style.mainWidgetContent}" /> </g:SimpleLayoutPanel> </g:layer> <g:layer right="0" left="0" bottom="0" height="50%"> <g:SimpleLayoutPanel styleName="{B.style.mainWidget}" addStyleNames="{B.style.uebersichtGlow}"> <ux:WartelisteDataGrid ui:field="wartelistetable" styleName="{B.style.mainWidgetContent}" /> </g:SimpleLayoutPanel> </g:layer> </g:LayoutPanel>

Ray Ryan - lessons learned

‣GWT Development

‣Basics

‣Structuring the UI

„just do it“ pattern

„View A“

„View B“

mainPanel.setWiget( aWidget );

mainPanel.setWiget( bWidget );

some action

hard to maintain

history management

from day one! !

back button and refresh as a

feature (not a catastrophe)

keep it stupid simple

• use PLACES framework for main level navigation

• if you really need to, nest activities for a second level. try not to.

• use dialogs for user input, showing data. dialogs are easily reused.

Once upon a time, a good designer does

good a good looking design...

‣ he will be using photoshop or dreamweaver ‣ he will not use the

software ‣ he will not build the

software ‣ he will not maintain the

software

top menue bound to places framework

switching between places with fade in and out

teach user to wait until application is ready again

gives us enough time to load the required content

300ms out 500ms in

Components inside of

„activity“ fire non public,

custom events

datepicker sends WEEK

selected event

presenter may goto itself, view may be cached

#ashtag?!?

STATELESS VIEW !URL contains EVERYTHING needed to rebuild view

user hits reload

GWT apps starts, activity

gets fired

presenter loads data

from server

view is back again

some actions don‘t require PLACE navigation at all

use POPUPS/ DIALOGS to stay ABOVE navigation

let POPUPS/ DIALOGS move slowly into view

pin POPUPS to one side of the

window

Don‘t move your user away from his

„PLACE“ unless you have to.

Search DIALOG slides in from right side, stays on TOP

Navigation should not hurt

• The application shown uses only 3 levels of navigation, DOES NOT NEED MORE

• PLACES used for bookmarkable entry points/ back button navigation consistency

• Activities should be STATELESS, to survive page reloads

• Learn from OTHERS, lookout for hashtags…

BEFORE YOU ADD THE LOGO TO THE TOP

HOW MANY PIXELS DO YOUR USERS HAVE?

the designer or marketing guy

using photoshop is probably sitting in

front of a 27“ apple cinema

display

Thanks!