Im confused. Are we talking about making the page a singleton bounded by
session or application? If we are talking about making it bounded by
application, I don't like it as it makes it too easy to share state between
users when unintended. If we are talking about bounding it by session isn't
it easy to serialize a page into a session variable and then just use it as
a response page in a Link ?

-Igor


> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:wicket-develop-
> [EMAIL PROTECTED] On Behalf Of Johan Compagner
> Sent: Thursday, September 08, 2005 2:23 AM
> To: [email protected]
> Subject: Re: [wicket-Develop] Reusing pages and models
> 
> I still think that you just don't generate a bookmarkable link
> But a PageLink to you signin page. And that link you place on the other
> pages you are displaying
> And in that pageLink you can do anything at the moment a getPage() is
> asked for. (like reset)
> 
> with homepage you are right. I think we can maybe pool that one somehow.
> so if you access / then a homepage is created if not present
> if a homepage instance is there it is reused.
> this could be a application/pages setting like:
> 
> NEW_INSTANCE
> REUSE_INSTANCE
> 
> and when a reuse is used we always call a reused() method on page. So
> you can implement youre own logic there.
> 
> I don't like changing the way bookmarkable pages work.. Those are just
> entry points inside a application.
> Internally you should use use PageLinks to pages you want to keep state
> with.
> 
> johan
> 
> Michael Jouravlev wrote:
> > Reusing components and models
> >
> > If I understand correctly, currently Wicket creates a new Page
> > instance, if I request a BookmarkablePage. Take SignIn example:
> > * from examples list click on "signin"
> > * because user is not logged in, he is redirected from Home to SignIn
> > * new SignIn page is created and form is displayed
> > * If username is wrong, _same_ page is redisplayed with error message
> > (I turned versioning off)
> > * If I go back to the example list, and then forward, I will see the
> > same form. Good.
> > * But if i go back to the example list, and click on the "signin"
> > link, I will get a new instance of SignIn Page with empty model. This
> > is what I actively dislike.
> >
> > My main grief is that I want to retain model if I click the "signin"
> > link again. Also, reusing the Page object makes sense as well, it
> > decreases the load on the session.
> >
> > On the other hand, if the Page instance is preserved, and its model is
> > preserved, how do I clean the form fields? I need some kind of reset
> > request parameter for that.
> >
> > Here is what I have done just as a sketch, it works, but I am sure it
> > can be implemented more cleanly.
> >
> > (1) Initialization request parameter
> > ------------------------------------
> > The init parameter can be sent to a Page instance to signal that
> > Page's model should be cleaned. This parameter produces the same
> > effect as current Wicket behavior, when a new and clean instance is
> > created each time I click a link. Only in case of parameter, the
> > instance can be reused.
> >
> > Apparently, I have to create a custom Link type, which will be
> > rendered as url with init parameter. I have not done that, for now I
> > pass the parameter directly. I use "wicket-init" as parameter. I also
> > set it to 1 just because sometimes it is easier to search a request
> > parameter which has value. So, the request looks like:
> > http://localhost:8080/wicket-examples/signin?wicket-reset=1
> >
> > In WebRequestCycle.parseRequest() I check if parameter is passed. If
> > yes, I call responsePage.setMustReset(true). Methods setMustReset()
> > and reset() are defined in Page class. I have to set reset flag
> > instead of calling reset() directly, because I might be addressing to
> > one page like Home, but in the end be redirected to another, like
> > SignIn. So, I set a flag, which is then set again on the "real" page.
> >
> > (2) Reusing page instance
> > -------------------------
> > I am reusing instance of SignIn page, because originally it is created
> > in AuthenticatedWebPage.checkAccess() method, so it is easy to plug in
> > my own code. But the instance of the Home page itself seems to be
> > recreated each time, and I don't know yet how to reuse its instance.
> > The newPage() methods are not called from anywhere but
> > AuthenticatedWebPage, so I don't know yet how Wicket creates new
> > instance internally.
> >
> > Anyway, here is what I do to reuse SignIn instance. I defined
> > AuthenticatedWebPage.myNewPage() method which creates a new page.
> > Actually, I wanted to override Page.newPage() but it is final. In
> > myNewPage() method I check if the page to be created should have a
> > single instance. I created a static field:
> >   static protected boolean singleton;
> > which I set to true for Page classes which are supposed to have a
> > single instance. So, the myNewPage() method looks like this:
> >
> > public Page myNewPage(final Class c) {
> >   Page page = null;
> >   Field isSingletonField = c.getDeclaredField("singleton");
> >   boolean isSingleton = isSingletonField.getBoolean(null);
> >
> >   if (isSingleton) {
> >     // This map is defined in SignInSession class
> >     Map recentPages = getSignInSession().getRecentPages();
> >     if (recentPages != null) {
> >       page = (Page) recentPages.get(SignIn.class.getName());
> >     }
> >
> >     // Reset existing page, this is what we are after
> >     if (page != null && page.isMustReset()) {
> >       page.reset();
> >     }
> >
> >     // Singleton page not found, create and store
> >     if (page == null) {
> >       page = newPage(c);
> >       recentPages.put(c.getName(), page);
> >     }
> >
> >   // Page is not singleton, create unconditionally
> >   } else {
> >     page = newPage(c);
> >   }
> >   return page;
> > }
> >
> > SignInSession class contains page map:
> >
> >     protected Map recentPages = new HashMap();
> >     public Map getRecentPages() { return recentPages; }
> >
> > (3) How it works
> > ----------------
> >
> > I define all pages in SignIn example as nonversioned. SignIn page is
> > defined as singleton. When I access Home page using
> > http://localhost:8080/wicket-examples/signin link, the checkAccess()
> > method creates a new instance of SignIn page if it was not created
> > yet, or just reuses existing one. Therefore, I see the same data I
> > entered before.
> >
> > If I click http://localhost:8080/wicket-examples/signin?wicket-reset=1
> > link and SignIn instance exists, then Home.mustReset is set, then
> > SignIn.mustReset is set, then myNewPage is called and in the end it
> > calls SignIn.reset(), which has the following code:
> >
> > public void reset() {
> >   // This check is here because I think maybe
> >   // I want to call reset() from outside unconditionally
> >   if (isMustReset()) {
> >     MarkupContainer form = null;
> >     if (formId != null) {
> >       form = (MarkupContainer) get(formId);
> >     }
> >     // Resetting form model by removing
> >     // the corresponding objects altogether
> >     if (form != null) {
> >       properties.remove("username");
> >       properties.remove("password");
> >     }
> >   }
> > }
> >
> > So, the fields are cleared and a user sees an empty form.
> >
> > (4) TO-DO
> > ---------
> > Now I need to find out how to reuse Home page, and I need to wrap
> > reset parameter into a ResetLink class or something.
> >
> > I would like this functionality to be included in Wicket. I can clean
> > up and submit the code patches if this would be considered worthwhile.
> >
> > Michael.
> >
> >
> > -------------------------------------------------------
> > SF.Net email is Sponsored by the Better Software Conference & EXPO
> > September 19-22, 2005 * San Francisco, CA * Development Lifecycle
> Practices
> > Agile & Plan-Driven Development * Managing Projects & Teams * Testing &
> QA
> > Security * Process Improvement & Measurement *
> http://www.sqe.com/bsce5sf
> > _______________________________________________
> > Wicket-develop mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/wicket-develop
> >
> >
> 
> 
> -------------------------------------------------------
> SF.Net email is Sponsored by the Better Software Conference & EXPO
> September 19-22, 2005 * San Francisco, CA * Development Lifecycle
> Practices
> Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
> Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
> _______________________________________________
> Wicket-develop mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/wicket-develop
> 





-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
Wicket-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-develop

Reply via email to