On 3/15/08, Matej Knopp <[EMAIL PROTECTED]> wrote:
> Not wit url like http://localhost:8080/. That's a homepage URL. It
>  doesn't contain any information about page instance, etc. so wicket
>  has to create new page instance.
>
>  Transparent back button support is about something else. Wicket tracks
>  certain changes to page, i.e. adding or removing components which
>  triggers new page version. But in order to revert to previos page
>  version the URL must be either a listener interface url
>  (?wicket:interface=...) or a hybrid URL. So you can try to mount your
>  home page using HybridUrlCodingStrategy. Also just incrementing a
>  property will not trigger new page version. Wicket can't introspect
>  every property in your component hierarachy to determine that a new
>  page version should be created, that would be way too slow.
>
>  To get wicket to create new page version when you increment your
>  counter you might want to call label.modelChanging() on your link
>  click handler. (You need to do this because you are just incrementing
>  a property, not changing component hierarchy or something else that
>  wicket can detect).
>
>  When new page version is created you should see a version number
>  incrementing in your url. On back button the URL should contain
>  previous version number.
>

Ok, I've followed your instructions.  Here's my new Application class:

public class WicketApplication extends WebApplication
{
    protected void init()
    {
        mount(new HybridUrlCodingStrategy("/Home.page", HomePage.class));
    }

        public Class getHomePage()
        {
                return HomePage.class;
        }
}

Here's my HomePage class:

public class HomePage extends WebPage
{
    private static final long serialVersionUID = 1L;
    private static final Logger log = LoggerFactory.getLogger(HomePage.class);

    private int counter;

    public HomePage()
    {
        log.info("I'm (identity " + System.identityHashCode(this) + ")
being instantiated." );
        final Label label = new Label("message", new LoadableDetachableModel()
        {
            protected Object load()
            {
                return "I've been called " + counter + " times.";
            }
        });
        add(label);
        add(new Link("refreshLink")
        {
            public void onClick()
            {
                counter++;
                log.info("I'm being called on object with identity " +
System.identityHashCode(HomePage.this));
                label.modelChanging();
            }
        });
    }

    protected Object writeReplace() throws ObjectStreamException
    {
        final Object replacement = super.writeReplace();
        log.info("I'm (identity " + System.identityHashCode(this) + ")
being write replaced by object " + replacement);
        return replacement;
    }
}

When I go to http://localhost:8080/, it redirects me to
http://localhost:8080/Home.page.0 and that generates the following
HTML:

<html>
    <head>
        <title>Wicket Quickstart Archetype Homepage</title>
    </head>
    <body>
        <strong>Wicket Quickstart Archetype Homepage</strong>
        <br/><br/>
        <span wicket:id="message">I&#039;ve been called 0 times.</span>
    <p>
        Click <a
href="?wicket:interface=:0:refreshLink::ILinkListener::"
wicket:id="refreshLink">here
</a> to refresh me!
    </p>
    </body>
</html>

Now, when I click the link, the URL changes to
http://localhost:8080/Home.page.0.1.  So, the back button works and
shows me exactly what I wanted to see!  Thank you for all your help!

By the way, modelChanged() and modelChanging() do two completely
different things!  It doesn't work if I try modelChanged(), but it
does work if I do modelChanging().  It's not completely obvious what
the distinction is from the Javadocs (when do you call one vs. the
other).  We might want to explain it a bit better.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to