1 / 56

Apache Wicket

Apache Wicket. Gerolf Seitz. Web Development with just Java. and a little bit of HTML. Gerolf Seitz. Since Sept.07 Committer PMC MSc student (almost finished) Software Engineer at Software Competence Center Hagenberg GmbH , Upper Austria. Agenda. What is Wicket? Core Concepts

dick
Download Presentation

Apache Wicket

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Apache Wicket Gerolf Seitz

  2. Web Development withjust Java and a little bit of HTML

  3. Gerolf Seitz • Since Sept.07 • Committer • PMC • MSc student (almost finished) • Software Engineer at Software Competence Center Hagenberg GmbH, Upper Austria

  4. Agenda • What is Wicket? • Core Concepts • Developing a custom Component • Summary • Q&A

  5. Agenda • What is Wicket? • Core Concepts • Developing a custom Component • Summary • Q&A

  6. Wicket in a Nutshell • Open Source • Component oriented • Web application framework • Java + HTML

  7. Features • Everything in Java • State management • Safe URLs • Nice URLs (mounting) • OOTB support for • Clustering • Portlet

  8. Features • Reusable components • Nested forms • No more double submit of forms • Back-button-support • I18n • WicketTester

  9. Features • Ajax "without" JavaScript • Header Contributions • JavaScript & CSS • Component level security

  10. Hello, World! <h1 wicket:id="msg">[text goes here]</h1>

  11. Hello, World! <h1 wicket:id="msg">[text goes here]</h1> + add(new Label("msg", "Hello, World!"));

  12. Hello, World! <h1 wicket:id="msg">[text goes here]</h1> + add(new Label("msg", "Hello, World!")); = <h1>Hello, World!</h1>

  13. Hello, World! <h1 wicket:id="msg">[text goes here]</h1> + add(new Label("msg", "Hello, World!")); = <h1>Hello, World!</h1>

  14. Hello, World! <h1 wicket:id="msg">[text goes here]</h1> + add(new Label("msg", "Hello, World!")); = <h1>Hello, World!</h1>

  15. Brief History • 2004: The First Encounter • 2005: JavaOne'05 Smackdown • 2006: Incubation at ASF

  16. Brief History • 2007: Graduation • 2007: 1.3 released • 2007: WUGs start spawning Amsterdam meetup: 80 attendees

  17. Projects • core • extensions • ioc (spring, guice) • date/time • velocity • jmx

  18. Getting Wicket Current Release: 1.3.3 <dependency groupId="org.apache.wicket" artifactId="wicket" version="1.3.3" />

  19. Getting Wicket - Quickstart http://wicket.apache.org/quickstart.html

  20. Agenda • What is Wicket? • Core Concepts • Developing a custom Component • Summary • Q&A

  21. Core Concepts • Application • Session • RequestCycle • Components • Behaviors • Models

  22. Application • Main entry point • Initialization • Configuration • Factories • Homepage • Configured in web.xml

  23. Application <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>

  24. Core Concepts • Application • Session • RequestCycle • Components • Behaviors • Models

  25. Session • Abstraction of a user session • Stores session specific data • Strongly typed session attributes

  26. Core Concepts • Application • Session • RequestCycle • Components • Behaviors • Models

  27. RequestCycle • Stateful • Tied to specific user session • Not (typically) bookmarkable • Stateless • Not necessarily tied to specific user session • Bookmarkable

  28. Core Concepts • Application • Session • RequestCycle • Components • Behaviors • Models

  29. Components • Basic building blocks • Encapsulate the programmatic manipulation of markup • Render content • Receive events • onClick, onSubmit

  30. Components – lots of `em • Label, MultiLineLabel, TextField, PasswordTextField, Image, Link, AjaxLink, AjaxFallbackLink, Button, AjaxButton, DatePicker, ListView, RefreshingView, DataGrid, DataTable, Tree, GMap, Wizard, JasperReports, ...

  31. Components • Component has wicket:id • Same wicket:id in markup • Hierarchy must match <h1 wicket:id=„msg“>[gets replaced]</h1> new Label(„msg“, „Hello World!“);

  32. Component: Link <a href="#" wicket:id="link">Click</a> Link link = new Link("link"); add(link);

  33. Component: Link <a href="#" wicket:id="link">Click</a> Link link = new Link("link") { @Override public void onClick() { //do something setResponsePage(new NewPage()); } }; add(link);

  34. Component: AjaxLink <a wicket:id="link">Click</a> AjaxLink link = new AjaxLink("link") { public void onClick(AjaxRequestTarget t){ //do something } }; add(link);

  35. Component: AjaxLink <a wicket:id="link">Click</a> someComponent.setOutputMarkupId(true); AjaxLink link = new AjaxLink("link") { public void onClick(AjaxRequestTarget t){ //do something t.addComponent(someComponent); t.appendJavascript("Effects.fade('foo');"); } }; add(link);

  36. Components • Components with own markup • Page, Panel, Border • Java and markup files in same package on classpath

  37. Core Concepts • Application • Session • RequestCycle • Components • Behaviors • Models

  38. Behaviors • Plugins for components • Change attributes of your component‘s markup • Add Javascript events • Add Ajax behavior timeLabel.add( new AjaxSelfUpdatingTimerBehavior( Duration.seconds(5)));

  39. Behaviors link.add(new AbstractBehavior() { public void onComponentTag(Component component, ComponentTag tag) { tag.put("onclick", "return confirm('Are you sure?');"); } }); Output: <a href="..." onclick="return confirm('...');">...</a>

  40. Core Concepts • Application • Session • RequestCycle • Components • Behaviors • Models

  41. Models • Bind POJO's to Wicket components new Label("name", model) <<Person> +name: String +city: String Model

  42. Models • Lazy binding in Java sucks • Doesn't update: • new Label("name", person.getName()); • Null checks necessary • new Label("street", person.getAddress().getStreet()); • Solution: OGNL/EL like expressions

  43. Models • PropertyModel: • new PropertyModel(person, “name”) • new PropertyModel(person, “address.street”) • CompoundPropertyModel • setModel(new CompoundPropertyModel(p)); • add(new Label("name")); • add(new Label("address.street"));

  44. Agenda • What is Wicket? • Core Concepts • Developing a custom Component • Summary • Q&A

  45. Custom Components • 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. »

  46. PasswordStrenghIndicator <html> <head> <title>Insert title here</title> <wicket:head> <wicket:link> <link rel="stylesheet" type="text/css" href="res/PasswordField.css"/> </wicket:link> </wicket:head> </head> <body> <wicket:panel> <input wicket:id="password" type="password" /><span wicket:id="strength">[strengthbar]</span> </wicket:panel> <div> <hr/> Examples:<br/> <input type="password" /><span class="weak">&nbsp;</span> (weak)<br/> <input type="password" /><span class="medium">&nbsp;</span> (medium)<br/> <input type="password" /><span class="strong">&nbsp;</span> (strong)<br/> </div> </body> </html>

  47. PSI - Markup <wicket:head> <wicket:link> <link rel="stylesheet" type="text/css" href="res/PasswordField.css"/> </wicket:link> </wicket:head> <wicket:panel> <input wicket:id="password" type="password" /> <span wicket:id="strength">[strengthbar]</span> </wicket:panel>

  48. PSI - Java publicclass PasswordField extends Panel { publicfinalstatic String WEAK = "weak"; publicfinalstatic String MEDIUM = "medium"; publicfinalstatic String STRONG = "strong"; public PasswordField(String id, IModel model) { super(id, model); PasswordTextField passwordTextField = new PasswordTextField("password", model); add(passwordTextField); final Label strength = new Label("strength", ""); add(strength); strength.add(new AttributeModifier("class", true, new Model() { public Object getObject() { return getPasswordStrength(PasswordField.this.getModelObjectAsString()); } })); strength.setOutputMarkupId(true); passwordTextField.add(new OnKeyPausedAjaxBehavior() { protectedvoid onUpdate(AjaxRequestTarget target) { target.addComponent(strength); } }); }}

  49. PSI - TestPage publicclass TestPage extends WebPage { private String password; public TestPage() { Form form = new Form("form"); form.add(new PasswordField("password", new PropertyModel(this, "password"))); add(form); } }

  50. Agenda • What is Wicket? • Core Concepts • Developing a custom Component • Summary • Q&A

More Related