Hi,

The pattern suggested by Bernard felt like something I wanted to implement,
so I decided to give it a shot using friendly URL:s. But, as far as I can
tell, with Tapestry 4.0, RedirectException doesn't quite do the trick unless
you have an absolute URL. I got sent to the right page, but hitting F5 means
that the browser tries to send another POST request, indicating that no
redirect response was sent when I used the following method:

-------------
        public void doSubmit() {
                getEntityLister().add(getEntity()); // from a 'create new'
page, so this stores the new entity
                
                RedirectException e = new RedirectException("ListAll.page");
                
                e.printStackTrace(); // just to see where in the Tapestry
framework I was...
                
                throw e;
        }
-------------

I traced it down to this method in ServletWebRequest:

-------------
    public void forward(String URL)
    {
        if (HiveMind.isBlank(URL))
        {
            performForward("/");
            return;
        }

        boolean internal = !(URL.startsWith("/") || URL.indexOf("://") > 0);

        if (internal)
            performForward("/" + URL);
        else
            sendRedirect(URL);
    }
-------------

So if you specify an absolute URL, Tapestry's behaviour when throwing a
RedirectException changes, so the following method appears to work:

-------------
        public void doSubmit(IRequestCycle cycle) {
                getEntityLister().add(getEntity());
                
                throw new
RedirectException(cycle.getAbsoluteURL("ListAll.page"));
        }
-------------

Much easier than implementing a RedirectException of your own, but perhaps a
little bit non-obvious that the semantics of throwing a RedirectException
depends on the URL. Hence this post, if someone else wants to do something
similar.

/ Petter

> Geoff Callender wrote:
> > And if you spot any poor Tapestry practises in the code 
> then please let 
> > me know ASAP! I'd hate to be responsible for spreading bad 
> techniques.
> 
> I would suggest adding redirect-after-POST pattern
>
<http://www.theserverside.com/tt/articles/article.tss?l=RedirectAfterPost>,
> to circumvent subsequent form submissions.
> 
> It is especially desirable for the login screen form , because at
> present it is unsafe. (please check the following sequence: login ->
> logout -> back button -> refresh : voilla! your account was stolen)
> 
> As far as tapestry 3.x is concerned PageRedirectException 
> DOES NOT make
> a trick, use RedirectException or a convenient wrapper like
> TapestryRedirectException (code below, someone posted it here 
> long time
> ago).
> 
> Regards,
> Bernard


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

Reply via email to