Trifork Group Ag · OMXCOP:TRIFOR
Trifork — Technical Presentation (2010)
29 slides from Trifork's technical presentation, Sep 23, 2010
Slide 1: Apache Wicket
Apache Wicket Niels Sthen Hansen Trifork Projects Copenhagen A/S nsh@trifork.com
Slide 2: Apache Wicket
Apache Wicket ● The Wicket approach ● Brief tour of key Wicket concepts ● Lots of code examples! ● Hello World'ish snippets ● Samples from a reallife Wicket app ● Thoughts on modelling & design, productivity and maintainability
Slide 3: About Us
About Us ● Trifork A/S ● Finance ● Public ● Academy ● 110+ employees in Århus, Copenhagen & Zürich ● Niels Sthen Hansen ● Java technology since 2002 ● Trifork Projects Copenhagen A/S
Slide 4: Todays Real-life Wicket App
Todays Reallife Wicket App ● The Lessor Portal ● Allows employees to register payrollrelated data online and to access personal information ● Integrates to 5 (and counting) payrollsystems ● Denmark, Norway and Germany ● Lessor A/S ● Payroll and HR systems ● Large and growing market share
Slide 5: Example
Example ● The Lessor Portal ● Absence registration approval
Slide 6: Web Applications
Web Applications ● More mission critical than ever ● Timetomarket is crucial ● ... and so is maintainability ● Users have come to expect more from wepapps ● More functionality ● More responsive (less page reloads) ● Why can't all webapps be like, say, gmail ?
Slide 7: Web Application Frameworks
Web Application Frameworks Echo Cocoon Millstone OXF Struts SOFIA Tapestry WebWork RIFE Spring MVCCanyamo Maverick JPublish JATO Folium Jucas Verge Niggle Bishop Barracuda Action Framework Shocks TeaServlet wingS Expresso Bento jStatemachine jZonic OpenEmcee Turbine Scope WarfareJWAA Jaffa Jacquard
Slide 8: Wicket Design Goals
Wicket Design Goals ● Easy (simple / consistent / obvious) ● Reusable ● Nonintrusive ● Safe ● Efficient / scalable ● Complete
Slide 9: Goal: Simple/Consistent/Obvious
Goal: Simple/Consistent/Obvious ● POJOcentric ● All code written in Java ala Swing ● Avoid overuse of XML configuration files ● Fully solve back button problem ● Easy to create bookmarkable pages ● Maximum type safety, compiletime diagnosis ● Maximum diagnosis of runtime problem
Slide 10: Goal: Non-intrusive
Goal: Nonintrusive ● HTML or other markup not polluted with programming semantics ● Only one simple tagging construct in markup ● Compatible with any ordinary HTML editor ● Easy for graphics designers to recognize and avoid framework tagging ● Easy to add tagging back to HTML if designers accidenta
Slide 11: Goal: Safe, Efficient/Scalable
Goal: Safe, Efficient/Scalable ● Only explicitly bookmarkable links can expose state in the page or URL ● All logic in Java with maximum type safety ● Easy to integrate with Java security ● Efficient & lightweight, but not at the expense of other goals ● Clustering through sticky sessions preferred
Slide 12: Example: Hello Wicket World
Example: Hello Wicket World mvn archetype:create DarchetypeGroupId=org.apache.wicket DarchetypeArtifactId=wicketarchetypequickstart DarchetypeVersion=1.4.8 DgroupId=com.trifork DartifactId=hello import import org.apache.wicket.markup.html.WebPage; org.apache.wicket.markup.html.WebPage; import
Slide 13: Wicket Application & Life-cycle
Wicket Application & Lifecycle ● Application ● Defines (surprise) applicationwide settings ● Wicket Session ● Are created on first request and exists for the duration of the HTTP session ● Can be subclassed (Example: PortalSession) ● RequestCycle ● Handles request, holds information on HTTP reques
Slide 14: Wicket Components
Wicket Components public public abstract abstract class class Component Component implements implements ... ... {{ ... ... protected protected final final void void renderComponentTag(ComponentTag renderComponentTag(ComponentTag tag) tag) {{ ... ... }} protected protected final final void void repla
Slide 15: Wicket Components
Wicket Components ● Are Java classes ● Extends other components and can be extended themselves ● Defines HTML markup ● In file ComponentClassName.html ● ... or inherit from superclass ● ... or both!
Slide 16: Wicket MarkupContainers
Wicket MarkupContainers ● A class hierachy of Components ● Can contain other components ● Also other containers ● When rendered, all childcomponents are also rendered ● Example: ● Panels
Slide 17: EJB & Spring Integration
EJB & Spring Integration ● @SpringBean ● @EJB ● Example: ● Spring
Slide 18: Localization
Localization ● StringResourceModel ● Looks up in resource files ondemand ● It is possible to override resource lookup ● Example: Lessor Portal Localization
Slide 19: Some HTML Tags & Attributes
Some HTML Tags & Attributes ● Attribute wicket:id ● Attribute wicket:message="attr:resource_id" ● <input type="submit" wicket:message="value:page.search"/> ● <wicket:link> ● <wicket:panel> ● <wicket:extend> and <wicket:child> ● <wicket:remove> ● <wicket:enclosure>
Slide 20: RepeatingViews and ListViews
RepeatingViews and ListViews ● Names are pretty selfexplanatory ● For table rows, bullet lists etc. etc. ... ● ListView when a list is available ● RepeatingView just needs a loop ● Examples: Calendar
Slide 21: Wicket Pages
Wicket Pages ● Pages are Components ● Pages are also MarkupContainers ● Wicket keeps pages in a PageMap ● To handle that annoying backbutton ● Watch your session size! ● Certain default pages can be specified ● Home page ● Error page ● Page to show when session is expired
Slide 22: Behaviors
Behaviors ● Implements IBehavior ● Are added to Components ● Modifies the Components .. well, behavior ● Add or modify attributes on Component tag ● Require elements in HTML header ● Ajax events ● Example: ● Tooltip header contributor
Slide 23: Wicket models
Wicket models ● Implements IModel<T> ● Encapsulates data ● The value (model object) can be ● A constant ● Calculated on request ● Fetched for rendering and then discarded to minimize session size (LoadableDetachableModel) ● Components have a default model ● And may define more
Slide 24: Wicket Models
Wicket Models ● Example ● LoadableDetachableModel
Slide 25: Wicket and Ajax
Wicket and Ajax ● Ajax Behaviors can be added to components ● The AjaxRequestTarget ● Produces an Ajax response envelope ● When Components are added to the AjaxRequestTarget with .addComponent() ● The Component will be rendered ● The resulting markup will be included in the ajax response ● .. and in
Slide 26: Examples
Examples ● A simple AjaxEventBehavior ● Portal ● CRUDForm.formSaved – refresh grid ● Absence approval revisited – advanced ajax
Slide 27: Working with Wicket
Working with Wicket ● Nice things ● Navigating and understanding model and behavior made easy by type safety ● Subclassing facilitates a consisten UI – maps well to the users perception of the application ● Simple things are easy, difficult things are possible ● However, all this also means ... ● ..
Slide 28: Working with Wicket
Working with Wicket ● The Lessor Portal ● Project started from scratch September 2008 ● Appr. 2 developers at any given time ● In production May 2009 (pilotscale) ● One year after ● Entire HTML layout changed August 2009 ● Still a clear vision of design ● Lots of refactoring
Slide 29: Thank you!
Thank you! ● Questions & Discussion ● Niels Sthen Hansen, Trifork ● nsh@trifork.com ● Product placement ● Trifork Wicket courses! ● Remember JAOO (http://jaoo.dk)