gwt architectures and lessons learned (wjax 2013)
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!