Hi,

I've just begin to work on my presentation on Wicket for JavaZone (I'm
replacing Eelco), and I'd like to get some feedback about the agenda I
plan to follow. The description of the talk is the following:
"In this session, I will show you how you can use Apache Wicket to
develop web applications with Just Java and Just HTML. I'll talk a bit
about Wicket's philosophy and why it's developers believe it is
important to take a novel approach. And then, because only code really
talks, we'll take a deep dive to look at how to develop some custom,
reusable components."

Hence here's the agenda I'm considering:
 •Introduction 5 min
 •What is Wicket   10 min
 •Core concepts of Wicket 15 min
 •Developing a custom component 20 min
 •Q&A       10 min

For the two first topic I'll take inspiration from Martjin's
presentation at TSSJS europe last year, but in a much more condensed
way to keep enough time to talk about developing custom components
with real world example and demo.

About the custom components, I think I will only demonstrate one
example, since 20 minutes is very short. My idea is to demonstrate how
to create a password field with a password strength indicator, where
the password strength is computed on the server by an Ajax call when
the user stop typing (the event will be triggered by a behavior
inspired by Nathan work in databinder, I don't plan to explain it).

Here's the Java code for the component:
--------------8<---------------------
public class PasswordField extends Panel {
    public final static String WEAK = "weak";
    public final static String MEDIUM = "medium";
    public final static String STRONG = "strong";

    public PasswordField(String id, IModel/*<String>*/ 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((String)PasswordField.this.getModelObject());
            }
        }));

        strength.setOutputMarkupId(true);
        passwordTextField.add(new OnKeyPausedAjaxBehavior() {
            protected void onUpdate(AjaxRequestTarget target) {
                target.addComponent(strength);
            }
        });
    }

    /**
     * Returns a String representing the strength of a password.
     * <p>
     * The String returned is one of:
     * <ul>
     * <li>[EMAIL PROTECTED] #WEAK}</li>
     * <li>[EMAIL PROTECTED] #MEDIUM}</li>
     * <li>[EMAIL PROTECTED] #STRONG}</li>
     * </ul>
     *
     * @param password the password to evaluate
     * @return a String representing the evaluated password strength
     */
    protected String getPasswordStrength(String password) {
        // this could involve some complex calculation based on a
dictionary for instance
        // here for simplicity reason we only use the password length
        if (password == null || password.length() <= 3) {
            return WEAK;
        }
        if (password.length() <= 5) {
            return MEDIUM;
        }
        return STRONG;
    }

}
--------------8<---------------------

And here is the html:
--------------8<---------------------
<html>
        <head>
                <wicket:head>
                <wicket:link>
                        <link rel="stylesheet" type="text/css" 
href="PasswordField.css"/>
                </wicket:link>
                </wicket:head>
        </head>
        <body>
                <wicket:panel>
                        <input wicket:id="password" type="password" /> <span
wicket:id="strength"></span>
                </wicket:panel>
                <hr/>
                Examples:<br/>
                <input type="password" /> <span class="weak"></span> (weak)<br/>
                <input type="password" /> <span class="medium"></span> 
(medium)<br/>
                <input type="password" /> <span class="strong"></span> 
(strong)<br/>
        </body>
</html>
--------------8<---------------------

A css is used to change the background image of the password strength
meter depending on the span class set by the attribute modifier.

So, what do you think about the agenda? Do you think the time planned
for each item is well thought? And about the custom component, do you
think it's a good example? Do you have some suggestions to make for
the code? Any feedback is appreciated!

Xavier
-- 
Xavier Hanin - Independent Java Consultant
http://xhab.blogspot.com/
http://incubator.apache.org/ivy/
http://www.xoocode.org/

Reply via email to