Apache Wicket: web applications with just Java Xavier Hanin JavaZone ‘07 Who is Xavier Hanin • Independent Java Consultant • Customers Renault • Open Source Agenda • • • • What is Wicket Core concepts of Wicket Developing a custom component Q&A Wicket in a Nutshell • • • • • Open Source (Apache Software Foundation) Component based Pure Java + Pure HTML Simple Enthusiastic community What is Wicket? • The technology: enabling componentoriented, programmatic manipulation of markup • The mission: bringing object oriented programming to the web application view layer • The reward: have a fun job and be good friends with your manager again Achieving these goals through • Keeping simple things simple • Utilizing an object-oriented component model where components are truly self contained • Re-applying the Model View Controller pattern on components instead of requests, with models as first class citizens • Having a clean separation of concerns between HTML and Java Achieving these goals through • Providing transparent, fully automated state management • Keeping configuration needs to the minimum • No more XML! • Making using & creating custom components easier than any framework out there Component versus ‘traditional’ • Traditional – Struts, WebWork, Spring MVC, etc. – Proven for web – A lot of web developers available • Components – JSF, Wicket, Tapestry, etc. – Traditional model for UI development on thick clients – A lot of developers available Features • Page composition – panels, borders and markup inheritance • Excellent localization and style support – template and resource loading (_be.html, .xml) – localized models (e.g. for labels) – sophisticated resource bundle lookup (composition & inheritance hierarchy) – automatic client capabilities detection Features • Integration – – – – – Spring Guice Hibernate JasperReports OSGi • Fancy components – sortable, filterable, pageable, data aware tables – date picker, rich text editor, Google Maps – tabbed panel, navigation, tree, wizard Features • State management – type safe sessions • clustering support • back button support • Double submit strategies – render redirect/ redirect to buffered response/ none • Testing support – JUnit testing • extensive logging and error reporting Features • Ajax support and components – Ajax without writing JavaScript, Dojo, Scriptaculous, ... • Header contribution – Javascript & CSS • URL mounting – pretty URLs • Component level security Agenda • • • • What is Wicket Core concepts of Wicket Developing a custom component Q&A Wicket’s concepts • • • • • • Application Session RequestCycle Components Behaviors Models Application • Main entry point for your web application • Configuration – Output Wicket specific tags? – Watch for markup changes every …? – Defines homepage • Factories for – Session – RequestCycle – Security –… Application • Configured in web.xml: <filter> <filter-name>wicket</servlet-name> <filter-class> org.apache.wicket.protocol.http.WicketFilter </filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value>example.MyApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> </filter> Wicket’s concepts • • • • • • Application Session RequestCycle Components Behaviors Models Session • Abstraction of a user session • Storage typically in HttpSession • Stores session specific data – Locale, Client info (browser vendor and version) – Your own data? • Logged in user • Shopping cart contents – Limited page history for back button support Session class MySession extends WebSession { private ShoppingCart cart; public ShoppingCart getCart() { … } public void setCart(ShoppingCart cart) { … } } mysession.setCart(new ShoppingCart()); … ShoppingCart cart = mysession.getCart(); cart.add(quantity, selectedProduct); Wicket’s concepts • • • • • • Application Session RequestCycle Components Behaviors Models RequestCycle • Steps in a request cycle: 1.Create request cycle object 2.Decode the request 3.Identify request target (page, component, …) 4.Process event (onClick, onSubmit, …) 5.Respond (page, component, image, pdf, …) 6.Clean up RequestCycle • Two types of requests: – Stateful • Tied to specific user session • Not bookmarkable – Stateless • Not necessarily tied to specific user session • Bookmarkable Wicket’s concepts • • • • • • Application Session RequestCycle Components Behaviors Models Components • encapsulate the programmatic manipulation of markup • can receive an event – onClick, onSubmit • know how and where to render itself Component • Ultimate super class wicket.Component – – – – – – – – – Label MultiLineLabel TextField PasswordTextField Image Link Tree BookmarkablePageLink JasperReports – – – – – – – – – ListView Loop PagingNavigator ImageMap Button Ajax… Sorting, paging repeaters Wizard DatePicker Components and markup • A component is identified in markup with wicket:id Html: <h1 wicket:id=“msg”>Gets replaced</h1> Java: new Label(“msg”, “Hello, World!”); Final (wicket tags can be stripped): <h1>Hello, World!</h1> Components and markup • Component can have its own markup file – Page – Panel – Border • Put java, markup and supporting files in same package on class path A page: Hello, World! Wicket’s concepts • • • • • • Application Session RequestCycle Components Behaviors Models Behaviors • Behaviors are plug-ins for Components • They can modify the components markup item.add(new AbstractBehavior() { public void onComponentTag( Component component, ComponentTag tag) { String css = (((Item)component).getIndex() % 2 == 0) ? "even" : "odd"; tag.put("class", css); } }); Output: <tr class=“odd”>…</tr> <tr class=“even”>…</tr> Behaviors • Change attributes of your component’s markup • Add javascript events • Add Ajax behavior component.add( new AjaxSelfUpdatingBehavior( Duration.seconds(1))); Wicket’s concepts • • • • • • Application Session RequestCycle Components Behaviors Models Models • Models bind your POJO’s to Wicket components Label(“name”, model) <<Person>> PropertyModel +name : String +city : String Models • Lazy binding in Java sucks – Doesn’t update: new TextField(“txt”, person.getName()) – Gives null pointers: new Label(“street”, person.getAddress().getStreet()) • Solution: OGNL/EL like expressions Models • PropertyModel: – new PropertyModel(person, “name”) – new PropertyModel(person, “address.street”) • Be aware for nulls when using updates: Person p = new Person(); new TextField(“street”, new PropertyModel(p, “address.street”)); Agenda • • • • What is Wicket Core concepts of Wicket Developing a custom component Q&A Why a custom component? • Eelco Hillenius: « Imagine being told that you can use Java as your programming language, but at the same time being told not to create your own classes. [...] I fail to understand why that has to be different for UI development, and Wicket proves it doesn't have to be so. » Custom components for all 464 pages 20 minutes Example: Password strength weak medium strong Components • Creating custom component is as easy as typing in ‘extends’ • Extends wicket.Component down the line • Available on application classpath Example: Password strength • Panels provide grouping – – – – Have own markup file Can be exchanged in pages for other components Can contribute to header Can contain any number of components, including panels Example: Password strength Example: Password strength Example: Password strength Components are reusable • Put them in a JAR • Package all necessary resources: – HTML, JavaScript, Images, CSS – class file • Put JAR on classpath • Ready for (re)use Conclusion • Smart component oriented web framework • Easy creation and use of custom components • Enthustiatic community Join in! http://wicket.apache.org/ users@wicket.apache.org Agenda • • • • What is Wicket Core concepts of Wicket Developing a custom component Q&A
© Copyright 2024