Cool, I was hoping this would work :-)
I suggest we try to incorporate this solution and others in a strategy
pattern, and make it configurable through the application using a
factory. This will always be a matter of taste, need and architecture.
There is no one size fits all solution here.
Martijn
Johan Compagner wrote:
> We always do clientside redirects. So developer don't always take this
> into account.
> Like setResponsePage(new Page(myHibernateObject))
> then myHibernateObject uses a wrong HibernateSession.
>
> ClientSide redirect do fix a number of problems so we like to keep this.
>
> Now i made a hybrid solution.
> We do use a clientside redirect put the responsepage is rendered as it
> was a serverside redirect...
>
> Changed 2 classes/methods:
>
> WebRequestCycle.redirectTo(final Page page)
> {
> String redirectUrl = page.urlFor(page, IRedirectListener.class);
> // create the redirect response.
> Response previous = getResponse();
> RedirectResponse rr = new RedirectResponse(redirectUrl);
> setResponse(rr);
> page.request();
> setResponse(previous);
> Map map =
> (Map)getWebRequest().getHttpServletRequest().getSession(true).getAttribute("wicket-redirect");
>
> if(map == null)
> {
> map = new HashMap(3);
>
> getWebRequest().getHttpServletRequest().getSession(true).setAttribute("wicket-redirect",map);
>
>
> }
> map.put(redirectUrl,rr);
> // Redirect to the url for the page
> response.redirect(redirectUrl);
> }
>
> So when we redirect the page is first rendered (page.request()) in a
> buffered response object.
> this object is stored in the httpsession.
> Then the redirect is done.
>
> in:
>
> WicketServlet.doGet(final HttpServletRequest servletRequest,
> final HttpServletResponse servletResponse) throws
> ServletException, IOException
> {
> // try to see if this is a redirect that is already stored in
> the wicket-redirect map of its session.
> Map redirectMap =
> (Map)servletRequest.getSession(true).getAttribute("wicket-redirect");
> if(redirectMap != null)
> {
> RedirectResponse rr =
> (RedirectResponse)redirectMap.remove(servletRequest.getRequestURI() +
> "?" + servletRequest.getQueryString());
> if(rr != null)
> {
> PrintWriter pw = servletResponse.getWriter();
> servletResponse.setContentLength(rr.getContentLength());
> servletResponse.setContentType(rr.getContentType());
> pw.write(rr.toString());
> pw.close();
> return;
> }
> }
> // Get session for request
> final WebSession session =
> webApplication.getSession(servletRequest);
>
> I first test if there is a redirect response item in the redirect map.
> If this is the case then that redirect object is removed from the map
> and the redirect is written to the directly written to the response.
>
> the drawback:
> There is a complete page in mem of the server for a very short time.
>
> plus:
> the redirect is very very fast. And doesn't take almost no memory, no
> hibernate session need to be created nothing needs to be loaded.
>
>
> Any objections for this approach?
> We could make it optional or something
>
> johan
>
>
> -------------------------------------------------------
> SF.Net email is sponsored by: Tell us your software development plans!
> Take this survey and enter to win a one-year sub to SourceForge.net
> Plus IDC's 2005 look-ahead and a copy of this survey
> Click here to start! http://www.idcswdc.com/cgi-bin/survey?id=105hix
> _______________________________________________
> Wicket-develop mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/wicket-develop
>
-------------------------------------------------------
SF.Net email is sponsored by: Tell us your software development plans!
Take this survey and enter to win a one-year sub to SourceForge.net
Plus IDC's 2005 look-ahead and a copy of this survey
Click here to start! http://www.idcswdc.com/cgi-bin/survey?id=105hix
_______________________________________________
Wicket-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-develop