You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Mark <li...@mark-arnold.net> on 2006/04/10 00:47:51 UTC

Page Reload / Browser Refresh problem

Hi,

I just searched for a solution for this problem in the archive, but did 
not find anything that seemed to work:

Assume I have a request that adds or deletes a record to/from the 
database. The request gets executed, record gets added or deleted and a 
comfirmation is displayed.
If the user now hits the F5 key or the "Reload" or "Refresh" button of 
the browser, the request is sent to the server again, causing the record 
to be added or deleted (which will of course fail since the record is 
already gone) again.

I did find a number of posts regarding this, but most of them ended in 
the recommendation to use a RedirectException in the add/delete page 
after the add/delete has been performed. However, I do not see how this 
would help, since the RedirectException is executed internally by 
Tapestry, not by the Browser.

This post here describes how to reproduce the problem using the VLib 
project that comes with Tapestry:
http://article.gmane.org/gmane.comp.java.tapestry.user/7224/match=browser+refresh

This post seems to have a solution, but it is quite complex and outdated 
(from 2003), so I am wondering if T4 has a better solution in the meantime?
http://article.gmane.org/gmane.comp.java.tapestry.user/3580/match=contribute+action+link

Thanks,

MARK

---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org


Re: Page Reload / Browser Refresh problem

Posted by Mark <li...@mark-arnold.net>.
Another stupid question: there is no getPageService() in T4's BasePage...
Where do I get the ILink from?

Thanks,

MARK


Martin Strand wrote:
> Hi Mark.
> If you make your form listener return an ILink, tapestry will redirect 
> the client to the new URL and any subsequent "refresh" will only 
> reload that page, not submit the form again.
> Simple example:
>
> public ILink submit()
> {
>     addStuffToDatabase();
>
>     return getPageService().getLink(false, "YourResultPage");
> }
>
> @InjectObject("engine-service:page")
> public abstract IEngineService getPageService();
>
>
>
> You can also throw a RedirectException if you want, it sends a HTTP 
> redirect to the client. You're thinking of a PageRedirectException, 
> which is handled internally.
>
> Martin
>
> On Mon, 10 Apr 2006 01:47:51 +0300, Mark <li...@mark-arnold.net> wrote:
>
>> Hi,
>>
>> I just searched for a solution for this problem in the archive, but 
>> did not find anything that seemed to work:
>>
>> Assume I have a request that adds or deletes a record to/from the 
>> database. The request gets executed, record gets added or deleted and 
>> a comfirmation is displayed.
>> If the user now hits the F5 key or the "Reload" or "Refresh" button 
>> of the browser, the request is sent to the server again, causing the 
>> record to be added or deleted (which will of course fail since the 
>> record is already gone) again.
>>
>> I did find a number of posts regarding this, but most of them ended 
>> in the recommendation to use a RedirectException in the add/delete 
>> page after the add/delete has been performed. However, I do not see 
>> how this would help, since the RedirectException is executed 
>> internally by Tapestry, not by the Browser.
>>
>> This post here describes how to reproduce the problem using the VLib 
>> project that comes with Tapestry:
>> http://article.gmane.org/gmane.comp.java.tapestry.user/7224/match=browser+refresh 
>>
>>
>> This post seems to have a solution, but it is quite complex and 
>> outdated (from 2003), so I am wondering if T4 has a better solution 
>> in the meantime?
>> http://article.gmane.org/gmane.comp.java.tapestry.user/3580/match=contribute+action+link 
>>
>>
>> Thanks,
>>
>> MARK
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
>> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>>
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org


Re: Page Reload / Browser Refresh problem

Posted by Martin Strand <ma...@entcap.se>.
I don't think there's any easy way of doing it programmatically, but you  
can replace those two annotations with xml in your .page file.

instead of @InjectObject, use <inject .../>:
http://jakarta.apache.org/tapestry/UsersGuide/spec.html#spec.inject

instead of @Persist, use <property persist="client" .../> (or  
persist="session")
http://jakarta.apache.org/tapestry/UsersGuide/spec.html#spec.property

Martin

On Mon, 10 Apr 2006 05:44:02 +0300, Mark <li...@mark-arnold.net> wrote:

> Thanks for the help.
>
> What's the easiest way to get these two things done programmatically  
> without annotations?
>
> MARK
>
>
>
>> I guess you could do that, but if you only need the objects on the  
>> result page, you should probably just use @Persist on their  
>> corresponding getters in your page class:
>> http://jakarta.apache.org/tapestry/tapestry-annotations/index.html#Persist  
>> Tapestry will then encode the object in the redirect url and make sure  
>> it's recreated on the next request.
>>
>>
>> getPageService() doesn't exist anywhere, I added it in my example code:
>>
>> @InjectObject("engine-service:page")
>> public abstract IEngineService getPageService();
>>
>> This tells Tapestry to make sure that when you call getPageService(),  
>> you will get the engine service called "page", which happens to be the  
>> engine service that handles normal page requests. :) You then call  
>> getLink(...) on that service to get a link to the page called  
>> "YourResultPage".
>>
>> Martin
>>
>> On Mon, 10 Apr 2006 04:47:31 +0300, Mark <li...@mark-arnold.net> wrote:
>>
>>> Hi Martin,
>>>
>>> thanks for the response. So if during saving, I create a bunch of  
>>> objects that I need to render the result page, for example some  
>>> messages, etc; do I have to put these in the Visit/Session and then  
>>> get them back out in the next page that I redirect to?
>>>
>>> Thanks,
>>>
>>> MARK
>>>
>>>
>>>> Hi Mark.
>>>> If you make your form listener return an ILink, tapestry will  
>>>> redirect the client to the new URL and any subsequent "refresh" will  
>>>> only reload that page, not submit the form again.
>>>> Simple example:
>>>>
>>>> public ILink submit()
>>>> {
>>>>     addStuffToDatabase();
>>>>
>>>>     return getPageService().getLink(false, "YourResultPage");
>>>> }
>>>>
>>>> @InjectObject("engine-service:page")
>>>> public abstract IEngineService getPageService();
>>>>
>>>>
>>>>
>>>> You can also throw a RedirectException if you want, it sends a HTTP  
>>>> redirect to the client. You're thinking of a PageRedirectException,  
>>>> which is handled internally.
>>>>
>>>> Martin
>>>>
>>>> On Mon, 10 Apr 2006 01:47:51 +0300, Mark <li...@mark-arnold.net>  
>>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I just searched for a solution for this problem in the archive, but  
>>>>> did not find anything that seemed to work:
>>>>>
>>>>> Assume I have a request that adds or deletes a record to/from the  
>>>>> database. The request gets executed, record gets added or deleted  
>>>>> and a comfirmation is displayed.
>>>>> If the user now hits the F5 key or the "Reload" or "Refresh" button  
>>>>> of the browser, the request is sent to the server again, causing the  
>>>>> record to be added or deleted (which will of course fail since the  
>>>>> record is already gone) again.
>>>>>
>>>>> I did find a number of posts regarding this, but most of them ended  
>>>>> in the recommendation to use a RedirectException in the add/delete  
>>>>> page after the add/delete has been performed. However, I do not see  
>>>>> how this would help, since the RedirectException is executed  
>>>>> internally by Tapestry, not by the Browser.
>>>>>
>>>>> This post here describes how to reproduce the problem using the VLib  
>>>>> project that comes with Tapestry:
>>>>> http://article.gmane.org/gmane.comp.java.tapestry.user/7224/match=browser+refresh  
>>>>> This post seems to have a solution, but it is quite complex and  
>>>>> outdated (from 2003), so I am wondering if T4 has a better solution  
>>>>> in the meantime?
>>>>> http://article.gmane.org/gmane.comp.java.tapestry.user/3580/match=contribute+action+link  
>>>>> Thanks,
>>>>>
>>>>> MARK
>>



---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org


Re: Page Reload / Browser Refresh problem

Posted by Mark <li...@mark-arnold.net>.
Thanks for the help.

What's the easiest way to get these two things done programmatically 
without annotations?

MARK



> I guess you could do that, but if you only need the objects on the 
> result page, you should probably just use @Persist on their 
> corresponding getters in your page class:
> http://jakarta.apache.org/tapestry/tapestry-annotations/index.html#Persist 
>
> Tapestry will then encode the object in the redirect url and make sure 
> it's recreated on the next request.
>
>
> getPageService() doesn't exist anywhere, I added it in my example code:
>
> @InjectObject("engine-service:page")
> public abstract IEngineService getPageService();
>
> This tells Tapestry to make sure that when you call getPageService(), 
> you will get the engine service called "page", which happens to be the 
> engine service that handles normal page requests. :) You then call 
> getLink(...) on that service to get a link to the page called 
> "YourResultPage".
>
> Martin
>
> On Mon, 10 Apr 2006 04:47:31 +0300, Mark <li...@mark-arnold.net> wrote:
>
>> Hi Martin,
>>
>> thanks for the response. So if during saving, I create a bunch of 
>> objects that I need to render the result page, for example some 
>> messages, etc; do I have to put these in the Visit/Session and then 
>> get them back out in the next page that I redirect to?
>>
>> Thanks,
>>
>> MARK
>>
>>
>>> Hi Mark.
>>> If you make your form listener return an ILink, tapestry will 
>>> redirect the client to the new URL and any subsequent "refresh" will 
>>> only reload that page, not submit the form again.
>>> Simple example:
>>>
>>> public ILink submit()
>>> {
>>>     addStuffToDatabase();
>>>
>>>     return getPageService().getLink(false, "YourResultPage");
>>> }
>>>
>>> @InjectObject("engine-service:page")
>>> public abstract IEngineService getPageService();
>>>
>>>
>>>
>>> You can also throw a RedirectException if you want, it sends a HTTP 
>>> redirect to the client. You're thinking of a PageRedirectException, 
>>> which is handled internally.
>>>
>>> Martin
>>>
>>> On Mon, 10 Apr 2006 01:47:51 +0300, Mark <li...@mark-arnold.net> wrote:
>>>
>>>> Hi,
>>>>
>>>> I just searched for a solution for this problem in the archive, but 
>>>> did not find anything that seemed to work:
>>>>
>>>> Assume I have a request that adds or deletes a record to/from the 
>>>> database. The request gets executed, record gets added or deleted 
>>>> and a comfirmation is displayed.
>>>> If the user now hits the F5 key or the "Reload" or "Refresh" button 
>>>> of the browser, the request is sent to the server again, causing 
>>>> the record to be added or deleted (which will of course fail since 
>>>> the record is already gone) again.
>>>>
>>>> I did find a number of posts regarding this, but most of them ended 
>>>> in the recommendation to use a RedirectException in the add/delete 
>>>> page after the add/delete has been performed. However, I do not see 
>>>> how this would help, since the RedirectException is executed 
>>>> internally by Tapestry, not by the Browser.
>>>>
>>>> This post here describes how to reproduce the problem using the 
>>>> VLib project that comes with Tapestry:
>>>> http://article.gmane.org/gmane.comp.java.tapestry.user/7224/match=browser+refresh 
>>>> This post seems to have a solution, but it is quite complex and 
>>>> outdated (from 2003), so I am wondering if T4 has a better solution 
>>>> in the meantime?
>>>> http://article.gmane.org/gmane.comp.java.tapestry.user/3580/match=contribute+action+link 
>>>> Thanks,
>>>>
>>>> MARK
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org


Re: Page Reload / Browser Refresh problem

Posted by Martin Strand <ma...@entcap.se>.
I guess you could do that, but if you only need the objects on the result  
page, you should probably just use @Persist on their corresponding getters  
in your page class:
http://jakarta.apache.org/tapestry/tapestry-annotations/index.html#Persist
Tapestry will then encode the object in the redirect url and make sure  
it's recreated on the next request.


getPageService() doesn't exist anywhere, I added it in my example code:

@InjectObject("engine-service:page")
public abstract IEngineService getPageService();

This tells Tapestry to make sure that when you call getPageService(), you  
will get the engine service called "page", which happens to be the engine  
service that handles normal page requests. :) You then call getLink(...)  
on that service to get a link to the page called "YourResultPage".

Martin

On Mon, 10 Apr 2006 04:47:31 +0300, Mark <li...@mark-arnold.net> wrote:

> Hi Martin,
>
> thanks for the response. So if during saving, I create a bunch of  
> objects that I need to render the result page, for example some  
> messages, etc; do I have to put these in the Visit/Session and then get  
> them back out in the next page that I redirect to?
>
> Thanks,
>
> MARK
>
>
>> Hi Mark.
>> If you make your form listener return an ILink, tapestry will redirect  
>> the client to the new URL and any subsequent "refresh" will only reload  
>> that page, not submit the form again.
>> Simple example:
>>
>> public ILink submit()
>> {
>>     addStuffToDatabase();
>>
>>     return getPageService().getLink(false, "YourResultPage");
>> }
>>
>> @InjectObject("engine-service:page")
>> public abstract IEngineService getPageService();
>>
>>
>>
>> You can also throw a RedirectException if you want, it sends a HTTP  
>> redirect to the client. You're thinking of a PageRedirectException,  
>> which is handled internally.
>>
>> Martin
>>
>> On Mon, 10 Apr 2006 01:47:51 +0300, Mark <li...@mark-arnold.net> wrote:
>>
>>> Hi,
>>>
>>> I just searched for a solution for this problem in the archive, but  
>>> did not find anything that seemed to work:
>>>
>>> Assume I have a request that adds or deletes a record to/from the  
>>> database. The request gets executed, record gets added or deleted and  
>>> a comfirmation is displayed.
>>> If the user now hits the F5 key or the "Reload" or "Refresh" button of  
>>> the browser, the request is sent to the server again, causing the  
>>> record to be added or deleted (which will of course fail since the  
>>> record is already gone) again.
>>>
>>> I did find a number of posts regarding this, but most of them ended in  
>>> the recommendation to use a RedirectException in the add/delete page  
>>> after the add/delete has been performed. However, I do not see how  
>>> this would help, since the RedirectException is executed internally by  
>>> Tapestry, not by the Browser.
>>>
>>> This post here describes how to reproduce the problem using the VLib  
>>> project that comes with Tapestry:
>>> http://article.gmane.org/gmane.comp.java.tapestry.user/7224/match=browser+refresh  
>>> This post seems to have a solution, but it is quite complex and  
>>> outdated (from 2003), so I am wondering if T4 has a better solution in  
>>> the meantime?
>>> http://article.gmane.org/gmane.comp.java.tapestry.user/3580/match=contribute+action+link  
>>> Thanks,
>>>
>>> MARK


---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org


Re: Page Reload / Browser Refresh problem

Posted by Mark <li...@mark-arnold.net>.
Hi Martin,

thanks for the response. So if during saving, I create a bunch of 
objects that I need to render the result page, for example some 
messages, etc; do I have to put these in the Visit/Session and then get 
them back out in the next page that I redirect to?

Thanks,

MARK


> Hi Mark.
> If you make your form listener return an ILink, tapestry will redirect 
> the client to the new URL and any subsequent "refresh" will only 
> reload that page, not submit the form again.
> Simple example:
>
> public ILink submit()
> {
>     addStuffToDatabase();
>
>     return getPageService().getLink(false, "YourResultPage");
> }
>
> @InjectObject("engine-service:page")
> public abstract IEngineService getPageService();
>
>
>
> You can also throw a RedirectException if you want, it sends a HTTP 
> redirect to the client. You're thinking of a PageRedirectException, 
> which is handled internally.
>
> Martin
>
> On Mon, 10 Apr 2006 01:47:51 +0300, Mark <li...@mark-arnold.net> wrote:
>
>> Hi,
>>
>> I just searched for a solution for this problem in the archive, but 
>> did not find anything that seemed to work:
>>
>> Assume I have a request that adds or deletes a record to/from the 
>> database. The request gets executed, record gets added or deleted and 
>> a comfirmation is displayed.
>> If the user now hits the F5 key or the "Reload" or "Refresh" button 
>> of the browser, the request is sent to the server again, causing the 
>> record to be added or deleted (which will of course fail since the 
>> record is already gone) again.
>>
>> I did find a number of posts regarding this, but most of them ended 
>> in the recommendation to use a RedirectException in the add/delete 
>> page after the add/delete has been performed. However, I do not see 
>> how this would help, since the RedirectException is executed 
>> internally by Tapestry, not by the Browser.
>>
>> This post here describes how to reproduce the problem using the VLib 
>> project that comes with Tapestry:
>> http://article.gmane.org/gmane.comp.java.tapestry.user/7224/match=browser+refresh 
>>
>>
>> This post seems to have a solution, but it is quite complex and 
>> outdated (from 2003), so I am wondering if T4 has a better solution 
>> in the meantime?
>> http://article.gmane.org/gmane.comp.java.tapestry.user/3580/match=contribute+action+link 
>>
>>
>> Thanks,
>>
>> MARK
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
>> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>>
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org


Re: Page Reload / Browser Refresh problem

Posted by Martin Strand <ma...@entcap.se>.
Hi Mark.
If you make your form listener return an ILink, tapestry will redirect the  
client to the new URL and any subsequent "refresh" will only reload that  
page, not submit the form again.
Simple example:

public ILink submit()
{
	addStuffToDatabase();

	return getPageService().getLink(false, "YourResultPage");
}

@InjectObject("engine-service:page")
public abstract IEngineService getPageService();



You can also throw a RedirectException if you want, it sends a HTTP  
redirect to the client. You're thinking of a PageRedirectException, which  
is handled internally.

Martin

On Mon, 10 Apr 2006 01:47:51 +0300, Mark <li...@mark-arnold.net> wrote:

> Hi,
>
> I just searched for a solution for this problem in the archive, but did  
> not find anything that seemed to work:
>
> Assume I have a request that adds or deletes a record to/from the  
> database. The request gets executed, record gets added or deleted and a  
> comfirmation is displayed.
> If the user now hits the F5 key or the "Reload" or "Refresh" button of  
> the browser, the request is sent to the server again, causing the record  
> to be added or deleted (which will of course fail since the record is  
> already gone) again.
>
> I did find a number of posts regarding this, but most of them ended in  
> the recommendation to use a RedirectException in the add/delete page  
> after the add/delete has been performed. However, I do not see how this  
> would help, since the RedirectException is executed internally by  
> Tapestry, not by the Browser.
>
> This post here describes how to reproduce the problem using the VLib  
> project that comes with Tapestry:
> http://article.gmane.org/gmane.comp.java.tapestry.user/7224/match=browser+refresh
>
> This post seems to have a solution, but it is quite complex and outdated  
> (from 2003), so I am wondering if T4 has a better solution in the  
> meantime?
> http://article.gmane.org/gmane.comp.java.tapestry.user/3580/match=contribute+action+link
>
> Thanks,
>
> MARK
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org