Change grid on "onSuccess"

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

Change grid on "onSuccess"

Morgan Hautman
Hi,

I'm trying to make a make grid update when submitting a form within the
same page.

Here is the code:
https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7

The page gets refreshed but the table/source doesn't seem to be updated.

Any help is greatly appreciated.

Regards,
Morgan
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Felix Gonschorek-4
Hi,

you have to store the results (or preferable the search parameters) because
tapestry redirects the browser after the form POST:

https://tapestry.apache.org/component-events-faq.html

To store the state you can add @Persist annotations to the fields that
store your search parameters and move the query logic to a seperate method
out of the form success event handler. (or you could persist the search
results, but that's generally not advisable).

@Property
@Persist
private Street street;

Another option to persist the state is to add the query parameters in the
page activation context, simply add @PageActivationContext annotation to
you fields that should be persisted with activation/passivation.

@Property
@PageActivationContext
private Street street;

The latter is generally better, because you don't need a session on the
server.
The first one stores the state of the search parmeters, even if you go to
another page and come back later.



hth,

Felix
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Nathan Quirynen
In reply to this post by Morgan Hautman
Hey,

By returning "this" in the onSuccess event, a redirect happens resulting
in a new request. If you want to preserve data between requests, you
will have to save it into the http session.
If you add http session persistence, the data will be available after a
new request. <http://tapestry.apache.org/persistent-page-data.html>

Simple example for your case:

@Persist
@Property
private Set<Street> streets;||


Be careful: in this case the whole streets set is saved into the http
session and will remain there until the end of the session (or until you
remove it manually).
You could also persist the form vaues instead and then in setupRender
event fill the trees set based on these values.
Also you can make use of PersistenceConstants.FLASH to let Tapestry
remove it from the session after first access automatically.
See more info: http://tapestry.apache.org/persistent-page-data.html||

Another option is making use of AJAX where the updated grid html is sent
back in the response and updated on the client side. If you want to
achieve this you'll need to add a Zone around the grid and make your
Form submit with AJAX.

Your case:

<t:form t:zone="zoneGrid">
     ...
     <t:zone t:id="zoneGrid" id="zoneGrid"
         <t:grid source="streets" row="street">
         </t:grid>
     </t:zone>
<t:form>

@Inject
private AjaxResponseRenderer ajax;
@InjectComponent
private Zone zoneGrid;

void onSuccess() {
     ...
     ajax.addRender(zoneGrid);
}

See more info: http://tapestry.apache.org/ajax-and-zones.html


Hope this helps u a bit.
Nathan

On 25/04/16 11:05, Morgan Hautman wrote:

> Hi,
>
> I'm trying to make a make grid update when submitting a form within the
> same page.
>
> Here is the code:
> https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7
>
> The page gets refreshed but the table/source doesn't seem to be updated.
>
> Any help is greatly appreciated.
>
> Regards,
> Morgan
>

Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Morgan Hautman
Hi,

Thank you guys.
I first tried the fix stated by Felix (@PageActivationContext) but it
doesn't work.
I then tried the ajax way Nathan provided and I have better results but my
grid shows 4 pages/links but I don't see any data.

I added

        <t:zone t:id="zoneGrid" id="zoneGrid">
            <div/>
            <t:grid source="streets" row="street">
            *[Grid here]*
            </t:grid>
        </t:zone>

but still no luck, any one has a pointer?

Regards,
Morgan

2016-04-25 12:07 GMT+02:00 Nathan Quirynen <[hidden email]>:

> Hey,
>
> By returning "this" in the onSuccess event, a redirect happens resulting
> in a new request. If you want to preserve data between requests, you will
> have to save it into the http session.
> If you add http session persistence, the data will be available after a
> new request. <http://tapestry.apache.org/persistent-page-data.html>
>
> Simple example for your case:
>
> @Persist
> @Property
> private Set<Street> streets;||
>
>
> Be careful: in this case the whole streets set is saved into the http
> session and will remain there until the end of the session (or until you
> remove it manually).
> You could also persist the form vaues instead and then in setupRender
> event fill the trees set based on these values.
> Also you can make use of PersistenceConstants.FLASH to let Tapestry remove
> it from the session after first access automatically.
> See more info: http://tapestry.apache.org/persistent-page-data.html||
>
> Another option is making use of AJAX where the updated grid html is sent
> back in the response and updated on the client side. If you want to achieve
> this you'll need to add a Zone around the grid and make your Form submit
> with AJAX.
>
> Your case:
>
> <t:form t:zone="zoneGrid">
>     ...
>     <t:zone t:id="zoneGrid" id="zoneGrid"
>         <t:grid source="streets" row="street">
>         </t:grid>
>     </t:zone>
> <t:form>
>
> @Inject
> private AjaxResponseRenderer ajax;
> @InjectComponent
> private Zone zoneGrid;
>
> void onSuccess() {
>     ...
>     ajax.addRender(zoneGrid);
> }
>
> See more info: http://tapestry.apache.org/ajax-and-zones.html
>
>
> Hope this helps u a bit.
> Nathan
>
>
> On 25/04/16 11:05, Morgan Hautman wrote:
>
>> Hi,
>>
>> I'm trying to make a make grid update when submitting a form within the
>> same page.
>>
>> Here is the code:
>> https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7
>>
>> The page gets refreshed but the table/source doesn't seem to be updated.
>>
>> Any help is greatly appreciated.
>>
>> Regards,
>> Morgan
>>
>>
>
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Barry Books-2
Use @pageactvation context and put what's in your onSucess method in
setupRender

On Monday, April 25, 2016, Morgan Hautman <[hidden email]> wrote:

> Hi,
>
> Thank you guys.
> I first tried the fix stated by Felix (@PageActivationContext) but it
> doesn't work.
> I then tried the ajax way Nathan provided and I have better results but my
> grid shows 4 pages/links but I don't see any data.
>
> I added
>
>         <t:zone t:id="zoneGrid" id="zoneGrid">
>             <div/>
>             <t:grid source="streets" row="street">
>             *[Grid here]*
>             </t:grid>
>         </t:zone>
>
> but still no luck, any one has a pointer?
>
> Regards,
> Morgan
>
> 2016-04-25 12:07 GMT+02:00 Nathan Quirynen <[hidden email]
> <javascript:;>>:
>
> > Hey,
> >
> > By returning "this" in the onSuccess event, a redirect happens resulting
> > in a new request. If you want to preserve data between requests, you will
> > have to save it into the http session.
> > If you add http session persistence, the data will be available after a
> > new request. <http://tapestry.apache.org/persistent-page-data.html>
> >
> > Simple example for your case:
> >
> > @Persist
> > @Property
> > private Set<Street> streets;||
> >
> >
> > Be careful: in this case the whole streets set is saved into the http
> > session and will remain there until the end of the session (or until you
> > remove it manually).
> > You could also persist the form vaues instead and then in setupRender
> > event fill the trees set based on these values.
> > Also you can make use of PersistenceConstants.FLASH to let Tapestry
> remove
> > it from the session after first access automatically.
> > See more info: http://tapestry.apache.org/persistent-page-data.html||
> >
> > Another option is making use of AJAX where the updated grid html is sent
> > back in the response and updated on the client side. If you want to
> achieve
> > this you'll need to add a Zone around the grid and make your Form submit
> > with AJAX.
> >
> > Your case:
> >
> > <t:form t:zone="zoneGrid">
> >     ...
> >     <t:zone t:id="zoneGrid" id="zoneGrid"
> >         <t:grid source="streets" row="street">
> >         </t:grid>
> >     </t:zone>
> > <t:form>
> >
> > @Inject
> > private AjaxResponseRenderer ajax;
> > @InjectComponent
> > private Zone zoneGrid;
> >
> > void onSuccess() {
> >     ...
> >     ajax.addRender(zoneGrid);
> > }
> >
> > See more info: http://tapestry.apache.org/ajax-and-zones.html
> >
> >
> > Hope this helps u a bit.
> > Nathan
> >
> >
> > On 25/04/16 11:05, Morgan Hautman wrote:
> >
> >> Hi,
> >>
> >> I'm trying to make a make grid update when submitting a form within the
> >> same page.
> >>
> >> Here is the code:
> >> https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7
> >>
> >> The page gets refreshed but the table/source doesn't seem to be updated.
> >>
> >> Any help is greatly appreciated.
> >>
> >> Regards,
> >> Morgan
> >>
> >>
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Morgan Hautman
Hi,

The problem was that I had no get/setters in my Bean I displayed..

Now it renders well on the first page but when I click on the second page I
have:

Caused by: org.apache.tapestry5.ioc.util.UnknownValueException: Could not
find a coercion from type java.lang.String to type java.util.Set.

I think this is because the url looks like this:
http://localhost:8090/***/searchstreet.grid.pager/2?t:ac=model.Street$0040141f225/model.Street$0040868971.
..

And Tapestry thinks "model.Street$0040141f225" is a String but it should be
a Bean.

I tried adding Serializable on my Street bean but it doesn't change the
error.

Any idea?

Regards,
Morgan


2016-04-25 16:05 GMT+02:00 Barry Books <[hidden email]>:

> Use @pageactvation context and put what's in your onSucess method in
> setupRender
>
> On Monday, April 25, 2016, Morgan Hautman <[hidden email]>
> wrote:
>
> > Hi,
> >
> > Thank you guys.
> > I first tried the fix stated by Felix (@PageActivationContext) but it
> > doesn't work.
> > I then tried the ajax way Nathan provided and I have better results but
> my
> > grid shows 4 pages/links but I don't see any data.
> >
> > I added
> >
> >         <t:zone t:id="zoneGrid" id="zoneGrid">
> >             <div/>
> >             <t:grid source="streets" row="street">
> >             *[Grid here]*
> >             </t:grid>
> >         </t:zone>
> >
> > but still no luck, any one has a pointer?
> >
> > Regards,
> > Morgan
> >
> > 2016-04-25 12:07 GMT+02:00 Nathan Quirynen <[hidden email]
> > <javascript:;>>:
> >
> > > Hey,
> > >
> > > By returning "this" in the onSuccess event, a redirect happens
> resulting
> > > in a new request. If you want to preserve data between requests, you
> will
> > > have to save it into the http session.
> > > If you add http session persistence, the data will be available after a
> > > new request. <http://tapestry.apache.org/persistent-page-data.html>
> > >
> > > Simple example for your case:
> > >
> > > @Persist
> > > @Property
> > > private Set<Street> streets;||
> > >
> > >
> > > Be careful: in this case the whole streets set is saved into the http
> > > session and will remain there until the end of the session (or until
> you
> > > remove it manually).
> > > You could also persist the form vaues instead and then in setupRender
> > > event fill the trees set based on these values.
> > > Also you can make use of PersistenceConstants.FLASH to let Tapestry
> > remove
> > > it from the session after first access automatically.
> > > See more info: http://tapestry.apache.org/persistent-page-data.html||
> > >
> > > Another option is making use of AJAX where the updated grid html is
> sent
> > > back in the response and updated on the client side. If you want to
> > achieve
> > > this you'll need to add a Zone around the grid and make your Form
> submit
> > > with AJAX.
> > >
> > > Your case:
> > >
> > > <t:form t:zone="zoneGrid">
> > >     ...
> > >     <t:zone t:id="zoneGrid" id="zoneGrid"
> > >         <t:grid source="streets" row="street">
> > >         </t:grid>
> > >     </t:zone>
> > > <t:form>
> > >
> > > @Inject
> > > private AjaxResponseRenderer ajax;
> > > @InjectComponent
> > > private Zone zoneGrid;
> > >
> > > void onSuccess() {
> > >     ...
> > >     ajax.addRender(zoneGrid);
> > > }
> > >
> > > See more info: http://tapestry.apache.org/ajax-and-zones.html
> > >
> > >
> > > Hope this helps u a bit.
> > > Nathan
> > >
> > >
> > > On 25/04/16 11:05, Morgan Hautman wrote:
> > >
> > >> Hi,
> > >>
> > >> I'm trying to make a make grid update when submitting a form within
> the
> > >> same page.
> > >>
> > >> Here is the code:
> > >> https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7
> > >>
> > >> The page gets refreshed but the table/source doesn't seem to be
> updated.
> > >>
> > >> Any help is greatly appreciated.
> > >>
> > >> Regards,
> > >> Morgan
> > >>
> > >>
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Barry Books-2
Sorry my previous response a bit short. I was on my phone. Something like
this hibernate example should work. It's better to store the query
parameters in the URL instead of the session. If you use the session
returning to the page will rerun the last query which seems a bit weird for
a web app. All the work is done in setupRender instead of onSuccess because
onSuccess ends with a redirect so no page is rendered.

@Property
List<User> users;

@Property
@ActivationRequestParameter
String lastName;

@Inject
Session session;

@SetupRender
void setupRender() {
      if ( lastName != null ) {
          users = session.createQuery(" from User where lastName =
:lastName").setParameter("lastName",lastName).list();
      }
}




On Tuesday, April 26, 2016, Morgan Hautman <[hidden email]> wrote:

> Hi,
>
> The problem was that I had no get/setters in my Bean I displayed..
>
> Now it renders well on the first page but when I click on the second page I
> have:
>
> Caused by: org.apache.tapestry5.ioc.util.UnknownValueException: Could not
> find a coercion from type java.lang.String to type java.util.Set.
>
> I think this is because the url looks like this:
>
> http://localhost:8090/***/searchstreet.grid.pager/2?t:ac=model.Street$0040141f225/model.Street$0040868971
> .
> ..
>
> And Tapestry thinks "model.Street$0040141f225" is a String but it should be
> a Bean.
>
> I tried adding Serializable on my Street bean but it doesn't change the
> error.
>
> Any idea?
>
> Regards,
> Morgan
>
>
> 2016-04-25 16:05 GMT+02:00 Barry Books <[hidden email] <javascript:;>>:
>
> > Use @pageactvation context and put what's in your onSucess method in
> > setupRender
> >
> > On Monday, April 25, 2016, Morgan Hautman <[hidden email]
> <javascript:;>>
> > wrote:
> >
> > > Hi,
> > >
> > > Thank you guys.
> > > I first tried the fix stated by Felix (@PageActivationContext) but it
> > > doesn't work.
> > > I then tried the ajax way Nathan provided and I have better results but
> > my
> > > grid shows 4 pages/links but I don't see any data.
> > >
> > > I added
> > >
> > >         <t:zone t:id="zoneGrid" id="zoneGrid">
> > >             <div/>
> > >             <t:grid source="streets" row="street">
> > >             *[Grid here]*
> > >             </t:grid>
> > >         </t:zone>
> > >
> > > but still no luck, any one has a pointer?
> > >
> > > Regards,
> > > Morgan
> > >
> > > 2016-04-25 12:07 GMT+02:00 Nathan Quirynen <
> [hidden email] <javascript:;>
> > > <javascript:;>>:
> > >
> > > > Hey,
> > > >
> > > > By returning "this" in the onSuccess event, a redirect happens
> > resulting
> > > > in a new request. If you want to preserve data between requests, you
> > will
> > > > have to save it into the http session.
> > > > If you add http session persistence, the data will be available
> after a
> > > > new request. <http://tapestry.apache.org/persistent-page-data.html>
> > > >
> > > > Simple example for your case:
> > > >
> > > > @Persist
> > > > @Property
> > > > private Set<Street> streets;||
> > > >
> > > >
> > > > Be careful: in this case the whole streets set is saved into the http
> > > > session and will remain there until the end of the session (or until
> > you
> > > > remove it manually).
> > > > You could also persist the form vaues instead and then in setupRender
> > > > event fill the trees set based on these values.
> > > > Also you can make use of PersistenceConstants.FLASH to let Tapestry
> > > remove
> > > > it from the session after first access automatically.
> > > > See more info:
> http://tapestry.apache.org/persistent-page-data.html||
> > > >
> > > > Another option is making use of AJAX where the updated grid html is
> > sent
> > > > back in the response and updated on the client side. If you want to
> > > achieve
> > > > this you'll need to add a Zone around the grid and make your Form
> > submit
> > > > with AJAX.
> > > >
> > > > Your case:
> > > >
> > > > <t:form t:zone="zoneGrid">
> > > >     ...
> > > >     <t:zone t:id="zoneGrid" id="zoneGrid"
> > > >         <t:grid source="streets" row="street">
> > > >         </t:grid>
> > > >     </t:zone>
> > > > <t:form>
> > > >
> > > > @Inject
> > > > private AjaxResponseRenderer ajax;
> > > > @InjectComponent
> > > > private Zone zoneGrid;
> > > >
> > > > void onSuccess() {
> > > >     ...
> > > >     ajax.addRender(zoneGrid);
> > > > }
> > > >
> > > > See more info: http://tapestry.apache.org/ajax-and-zones.html
> > > >
> > > >
> > > > Hope this helps u a bit.
> > > > Nathan
> > > >
> > > >
> > > > On 25/04/16 11:05, Morgan Hautman wrote:
> > > >
> > > >> Hi,
> > > >>
> > > >> I'm trying to make a make grid update when submitting a form within
> > the
> > > >> same page.
> > > >>
> > > >> Here is the code:
> > > >> https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7
> > > >>
> > > >> The page gets refreshed but the table/source doesn't seem to be
> > updated.
> > > >>
> > > >> Any help is greatly appreciated.
> > > >>
> > > >> Regards,
> > > >> Morgan
> > > >>
> > > >>
> > > >
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Morgan Hautman
Hi,

I didn't managed to get it work with @ActivationRequestParameter.
I tried everything out and the last try was with @Persist and it worked, so
I'm keeping that because nothing else works..

Thank you all.

Regards,
Morgan

2016-04-26 13:06 GMT+02:00 Barry Books <[hidden email]>:

> Sorry my previous response a bit short. I was on my phone. Something like
> this hibernate example should work. It's better to store the query
> parameters in the URL instead of the session. If you use the session
> returning to the page will rerun the last query which seems a bit weird for
> a web app. All the work is done in setupRender instead of onSuccess because
> onSuccess ends with a redirect so no page is rendered.
>
> @Property
> List<User> users;
>
> @Property
> @ActivationRequestParameter
> String lastName;
>
> @Inject
> Session session;
>
> @SetupRender
> void setupRender() {
>       if ( lastName != null ) {
>           users = session.createQuery(" from User where lastName =
> :lastName").setParameter("lastName",lastName).list();
>       }
> }
>
>
>
>
> On Tuesday, April 26, 2016, Morgan Hautman <[hidden email]>
> wrote:
>
> > Hi,
> >
> > The problem was that I had no get/setters in my Bean I displayed..
> >
> > Now it renders well on the first page but when I click on the second
> page I
> > have:
> >
> > Caused by: org.apache.tapestry5.ioc.util.UnknownValueException: Could not
> > find a coercion from type java.lang.String to type java.util.Set.
> >
> > I think this is because the url looks like this:
> >
> >
> http://localhost:8090/***/searchstreet.grid.pager/2?t:ac=model.Street$0040141f225/model.Street$0040868971
> > .
> > ..
> >
> > And Tapestry thinks "model.Street$0040141f225" is a String but it should
> be
> > a Bean.
> >
> > I tried adding Serializable on my Street bean but it doesn't change the
> > error.
> >
> > Any idea?
> >
> > Regards,
> > Morgan
> >
> >
> > 2016-04-25 16:05 GMT+02:00 Barry Books <[hidden email]
> <javascript:;>>:
> >
> > > Use @pageactvation context and put what's in your onSucess method in
> > > setupRender
> > >
> > > On Monday, April 25, 2016, Morgan Hautman <[hidden email]
> > <javascript:;>>
> > > wrote:
> > >
> > > > Hi,
> > > >
> > > > Thank you guys.
> > > > I first tried the fix stated by Felix (@PageActivationContext) but it
> > > > doesn't work.
> > > > I then tried the ajax way Nathan provided and I have better results
> but
> > > my
> > > > grid shows 4 pages/links but I don't see any data.
> > > >
> > > > I added
> > > >
> > > >         <t:zone t:id="zoneGrid" id="zoneGrid">
> > > >             <div/>
> > > >             <t:grid source="streets" row="street">
> > > >             *[Grid here]*
> > > >             </t:grid>
> > > >         </t:zone>
> > > >
> > > > but still no luck, any one has a pointer?
> > > >
> > > > Regards,
> > > > Morgan
> > > >
> > > > 2016-04-25 12:07 GMT+02:00 Nathan Quirynen <
> > [hidden email] <javascript:;>
> > > > <javascript:;>>:
> > > >
> > > > > Hey,
> > > > >
> > > > > By returning "this" in the onSuccess event, a redirect happens
> > > resulting
> > > > > in a new request. If you want to preserve data between requests,
> you
> > > will
> > > > > have to save it into the http session.
> > > > > If you add http session persistence, the data will be available
> > after a
> > > > > new request. <http://tapestry.apache.org/persistent-page-data.html
> >
> > > > >
> > > > > Simple example for your case:
> > > > >
> > > > > @Persist
> > > > > @Property
> > > > > private Set<Street> streets;||
> > > > >
> > > > >
> > > > > Be careful: in this case the whole streets set is saved into the
> http
> > > > > session and will remain there until the end of the session (or
> until
> > > you
> > > > > remove it manually).
> > > > > You could also persist the form vaues instead and then in
> setupRender
> > > > > event fill the trees set based on these values.
> > > > > Also you can make use of PersistenceConstants.FLASH to let Tapestry
> > > > remove
> > > > > it from the session after first access automatically.
> > > > > See more info:
> > http://tapestry.apache.org/persistent-page-data.html||
> > > > >
> > > > > Another option is making use of AJAX where the updated grid html is
> > > sent
> > > > > back in the response and updated on the client side. If you want to
> > > > achieve
> > > > > this you'll need to add a Zone around the grid and make your Form
> > > submit
> > > > > with AJAX.
> > > > >
> > > > > Your case:
> > > > >
> > > > > <t:form t:zone="zoneGrid">
> > > > >     ...
> > > > >     <t:zone t:id="zoneGrid" id="zoneGrid"
> > > > >         <t:grid source="streets" row="street">
> > > > >         </t:grid>
> > > > >     </t:zone>
> > > > > <t:form>
> > > > >
> > > > > @Inject
> > > > > private AjaxResponseRenderer ajax;
> > > > > @InjectComponent
> > > > > private Zone zoneGrid;
> > > > >
> > > > > void onSuccess() {
> > > > >     ...
> > > > >     ajax.addRender(zoneGrid);
> > > > > }
> > > > >
> > > > > See more info: http://tapestry.apache.org/ajax-and-zones.html
> > > > >
> > > > >
> > > > > Hope this helps u a bit.
> > > > > Nathan
> > > > >
> > > > >
> > > > > On 25/04/16 11:05, Morgan Hautman wrote:
> > > > >
> > > > >> Hi,
> > > > >>
> > > > >> I'm trying to make a make grid update when submitting a form
> within
> > > the
> > > > >> same page.
> > > > >>
> > > > >> Here is the code:
> > > > >> https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7
> > > > >>
> > > > >> The page gets refreshed but the table/source doesn't seem to be
> > > updated.
> > > > >>
> > > > >> Any help is greatly appreciated.
> > > > >>
> > > > >> Regards,
> > > > >> Morgan
> > > > >>
> > > > >>
> > > > >
> > > >
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Chris Poulsen
When you need to persist non-trivial state (and not want to put it in the
session, like standard @Persist does), you need to help tapestry figure out
how to map between a String and the persistent state.

There are some coercers for the most trivial types and projects like
tapestry-hibernate/jpa also automatically let tapestry know how to map
between String and Entity instances.

Some tapestry components allows you to register an encoder for the mapping
back and forth and on some pages you might need to perform the mapping
manually ( using activate/passivate )

Barry suggested a variation of this (because the parameter he passes is a
String which requires no further translation) and then you have the chance
to initialize "users" prior to rendering.

Beware that setupRender phase is not always executed; ajax requests, form
submissions etc. may bypass it - Activate is always performed - So one
should be careful about the amount of work performed during activation.


> And Tapestry thinks "model.Street$0040141f225" is a String but it should
be
> a Bean.
>
> I tried adding Serializable on my Street bean but it doesn't change the
> error.

As tapestry does not know how to map from your "Street"  instance to a
String, if attempts to use the ordinary Java toString(), probably resulting
in something like "Street@141f225" and when this string is passed back in,
it has no chance of getting back to the correct Street instance.

A ValueEncoder<Street> could probably do this for you automatically (you
have to let it know how to map from your instance to a String and back
again).

Another possibility is to remove the @Activation* parameters and perform
the mapping in the page activate/passivate methods.

HTH.

--
Chris



On Wed, Apr 27, 2016 at 8:20 AM, Morgan Hautman <[hidden email]>
wrote:

> Hi,
>
> I didn't managed to get it work with @ActivationRequestParameter.
> I tried everything out and the last try was with @Persist and it worked, so
> I'm keeping that because nothing else works..
>
> Thank you all.
>
> Regards,
> Morgan
>
> 2016-04-26 13:06 GMT+02:00 Barry Books <[hidden email]>:
>
> > Sorry my previous response a bit short. I was on my phone. Something like
> > this hibernate example should work. It's better to store the query
> > parameters in the URL instead of the session. If you use the session
> > returning to the page will rerun the last query which seems a bit weird
> for
> > a web app. All the work is done in setupRender instead of onSuccess
> because
> > onSuccess ends with a redirect so no page is rendered.
> >
> > @Property
> > List<User> users;
> >
> > @Property
> > @ActivationRequestParameter
> > String lastName;
> >
> > @Inject
> > Session session;
> >
> > @SetupRender
> > void setupRender() {
> >       if ( lastName != null ) {
> >           users = session.createQuery(" from User where lastName =
> > :lastName").setParameter("lastName",lastName).list();
> >       }
> > }
> >
> >
> >
> >
> > On Tuesday, April 26, 2016, Morgan Hautman <[hidden email]>
> > wrote:
> >
> > > Hi,
> > >
> > > The problem was that I had no get/setters in my Bean I displayed..
> > >
> > > Now it renders well on the first page but when I click on the second
> > page I
> > > have:
> > >
> > > Caused by: org.apache.tapestry5.ioc.util.UnknownValueException: Could
> not
> > > find a coercion from type java.lang.String to type java.util.Set.
> > >
> > > I think this is because the url looks like this:
> > >
> > >
> >
> http://localhost:8090/***/searchstreet.grid.pager/2?t:ac=model.Street$0040141f225/model.Street$0040868971
> > > .
> > > ..
> > >
> > > And Tapestry thinks "model.Street$0040141f225" is a String but it
> should
> > be
> > > a Bean.
> > >
> > > I tried adding Serializable on my Street bean but it doesn't change the
> > > error.
> > >
> > > Any idea?
> > >
> > > Regards,
> > > Morgan
> > >
> > >
> > > 2016-04-25 16:05 GMT+02:00 Barry Books <[hidden email]
> > <javascript:;>>:
> > >
> > > > Use @pageactvation context and put what's in your onSucess method in
> > > > setupRender
> > > >
> > > > On Monday, April 25, 2016, Morgan Hautman <[hidden email]
> > > <javascript:;>>
> > > > wrote:
> > > >
> > > > > Hi,
> > > > >
> > > > > Thank you guys.
> > > > > I first tried the fix stated by Felix (@PageActivationContext) but
> it
> > > > > doesn't work.
> > > > > I then tried the ajax way Nathan provided and I have better results
> > but
> > > > my
> > > > > grid shows 4 pages/links but I don't see any data.
> > > > >
> > > > > I added
> > > > >
> > > > >         <t:zone t:id="zoneGrid" id="zoneGrid">
> > > > >             <div/>
> > > > >             <t:grid source="streets" row="street">
> > > > >             *[Grid here]*
> > > > >             </t:grid>
> > > > >         </t:zone>
> > > > >
> > > > > but still no luck, any one has a pointer?
> > > > >
> > > > > Regards,
> > > > > Morgan
> > > > >
> > > > > 2016-04-25 12:07 GMT+02:00 Nathan Quirynen <
> > > [hidden email] <javascript:;>
> > > > > <javascript:;>>:
> > > > >
> > > > > > Hey,
> > > > > >
> > > > > > By returning "this" in the onSuccess event, a redirect happens
> > > > resulting
> > > > > > in a new request. If you want to preserve data between requests,
> > you
> > > > will
> > > > > > have to save it into the http session.
> > > > > > If you add http session persistence, the data will be available
> > > after a
> > > > > > new request. <
> http://tapestry.apache.org/persistent-page-data.html
> > >
> > > > > >
> > > > > > Simple example for your case:
> > > > > >
> > > > > > @Persist
> > > > > > @Property
> > > > > > private Set<Street> streets;||
> > > > > >
> > > > > >
> > > > > > Be careful: in this case the whole streets set is saved into the
> > http
> > > > > > session and will remain there until the end of the session (or
> > until
> > > > you
> > > > > > remove it manually).
> > > > > > You could also persist the form vaues instead and then in
> > setupRender
> > > > > > event fill the trees set based on these values.
> > > > > > Also you can make use of PersistenceConstants.FLASH to let
> Tapestry
> > > > > remove
> > > > > > it from the session after first access automatically.
> > > > > > See more info:
> > > http://tapestry.apache.org/persistent-page-data.html||
> > > > > >
> > > > > > Another option is making use of AJAX where the updated grid html
> is
> > > > sent
> > > > > > back in the response and updated on the client side. If you want
> to
> > > > > achieve
> > > > > > this you'll need to add a Zone around the grid and make your Form
> > > > submit
> > > > > > with AJAX.
> > > > > >
> > > > > > Your case:
> > > > > >
> > > > > > <t:form t:zone="zoneGrid">
> > > > > >     ...
> > > > > >     <t:zone t:id="zoneGrid" id="zoneGrid"
> > > > > >         <t:grid source="streets" row="street">
> > > > > >         </t:grid>
> > > > > >     </t:zone>
> > > > > > <t:form>
> > > > > >
> > > > > > @Inject
> > > > > > private AjaxResponseRenderer ajax;
> > > > > > @InjectComponent
> > > > > > private Zone zoneGrid;
> > > > > >
> > > > > > void onSuccess() {
> > > > > >     ...
> > > > > >     ajax.addRender(zoneGrid);
> > > > > > }
> > > > > >
> > > > > > See more info: http://tapestry.apache.org/ajax-and-zones.html
> > > > > >
> > > > > >
> > > > > > Hope this helps u a bit.
> > > > > > Nathan
> > > > > >
> > > > > >
> > > > > > On 25/04/16 11:05, Morgan Hautman wrote:
> > > > > >
> > > > > >> Hi,
> > > > > >>
> > > > > >> I'm trying to make a make grid update when submitting a form
> > within
> > > > the
> > > > > >> same page.
> > > > > >>
> > > > > >> Here is the code:
> > > > > >>
> https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7
> > > > > >>
> > > > > >> The page gets refreshed but the table/source doesn't seem to be
> > > > updated.
> > > > > >>
> > > > > >> Any help is greatly appreciated.
> > > > > >>
> > > > > >> Regards,
> > > > > >> Morgan
> > > > > >>
> > > > > >>
> > > > > >
> > > > >
> > > >
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Barry Books-2
Chris is correct you need some kind of type coachers to store Street in the
url but in this case I don't think you need street/streets in the url only
the variables in the form. I don't do much ajax so I like to use
setupRender but perhaps the best way to get the set of streets is with a
method like

@Cached
public Set<Street> getStreets() {
    Set<Street> streets = new HashSet();
   ...
   return streets;
}

This way it's created when needed and the @Chached will cache it during the
current request. This works for ajax/forms whatever.

Using @Persist on the streets field and doing the query in onSucess will
work but persists the query data in the session. If you do this a lot it
will eventually become a problem.



On Wednesday, April 27, 2016, Chris Poulsen <[hidden email]> wrote:

> When you need to persist non-trivial state (and not want to put it in the
> session, like standard @Persist does), you need to help tapestry figure out
> how to map between a String and the persistent state.
>
> There are some coercers for the most trivial types and projects like
> tapestry-hibernate/jpa also automatically let tapestry know how to map
> between String and Entity instances.
>
> Some tapestry components allows you to register an encoder for the mapping
> back and forth and on some pages you might need to perform the mapping
> manually ( using activate/passivate )
>
> Barry suggested a variation of this (because the parameter he passes is a
> String which requires no further translation) and then you have the chance
> to initialize "users" prior to rendering.
>
> Beware that setupRender phase is not always executed; ajax requests, form
> submissions etc. may bypass it - Activate is always performed - So one
> should be careful about the amount of work performed during activation.
>
>
> > And Tapestry thinks "model.Street$0040141f225" is a String but it should
> be
> > a Bean.
> >
> > I tried adding Serializable on my Street bean but it doesn't change the
> > error.
>
> As tapestry does not know how to map from your "Street"  instance to a
> String, if attempts to use the ordinary Java toString(), probably resulting
> in something like "Street@141f225" and when this string is passed back in,
> it has no chance of getting back to the correct Street instance.
>
> A ValueEncoder<Street> could probably do this for you automatically (you
> have to let it know how to map from your instance to a String and back
> again).
>
> Another possibility is to remove the @Activation* parameters and perform
> the mapping in the page activate/passivate methods.
>
> HTH.
>
> --
> Chris
>
>
>
> On Wed, Apr 27, 2016 at 8:20 AM, Morgan Hautman <[hidden email]
> <javascript:;>>
> wrote:
>
> > Hi,
> >
> > I didn't managed to get it work with @ActivationRequestParameter.
> > I tried everything out and the last try was with @Persist and it worked,
> so
> > I'm keeping that because nothing else works..
> >
> > Thank you all.
> >
> > Regards,
> > Morgan
> >
> > 2016-04-26 13:06 GMT+02:00 Barry Books <[hidden email] <javascript:;>
> >:
> >
> > > Sorry my previous response a bit short. I was on my phone. Something
> like
> > > this hibernate example should work. It's better to store the query
> > > parameters in the URL instead of the session. If you use the session
> > > returning to the page will rerun the last query which seems a bit weird
> > for
> > > a web app. All the work is done in setupRender instead of onSuccess
> > because
> > > onSuccess ends with a redirect so no page is rendered.
> > >
> > > @Property
> > > List<User> users;
> > >
> > > @Property
> > > @ActivationRequestParameter
> > > String lastName;
> > >
> > > @Inject
> > > Session session;
> > >
> > > @SetupRender
> > > void setupRender() {
> > >       if ( lastName != null ) {
> > >           users = session.createQuery(" from User where lastName =
> > > :lastName").setParameter("lastName",lastName).list();
> > >       }
> > > }
> > >
> > >
> > >
> > >
> > > On Tuesday, April 26, 2016, Morgan Hautman <[hidden email]
> <javascript:;>>
> > > wrote:
> > >
> > > > Hi,
> > > >
> > > > The problem was that I had no get/setters in my Bean I displayed..
> > > >
> > > > Now it renders well on the first page but when I click on the second
> > > page I
> > > > have:
> > > >
> > > > Caused by: org.apache.tapestry5.ioc.util.UnknownValueException: Could
> > not
> > > > find a coercion from type java.lang.String to type java.util.Set.
> > > >
> > > > I think this is because the url looks like this:
> > > >
> > > >
> > >
> >
> http://localhost:8090/***/searchstreet.grid.pager/2?t:ac=model.Street$0040141f225/model.Street$0040868971
> > > > .
> > > > ..
> > > >
> > > > And Tapestry thinks "model.Street$0040141f225" is a String but it
> > should
> > > be
> > > > a Bean.
> > > >
> > > > I tried adding Serializable on my Street bean but it doesn't change
> the
> > > > error.
> > > >
> > > > Any idea?
> > > >
> > > > Regards,
> > > > Morgan
> > > >
> > > >
> > > > 2016-04-25 16:05 GMT+02:00 Barry Books <[hidden email]
> <javascript:;>
> > > <javascript:;>>:
> > > >
> > > > > Use @pageactvation context and put what's in your onSucess method
> in
> > > > > setupRender
> > > > >
> > > > > On Monday, April 25, 2016, Morgan Hautman <
> [hidden email] <javascript:;>
> > > > <javascript:;>>
> > > > > wrote:
> > > > >
> > > > > > Hi,
> > > > > >
> > > > > > Thank you guys.
> > > > > > I first tried the fix stated by Felix (@PageActivationContext)
> but
> > it
> > > > > > doesn't work.
> > > > > > I then tried the ajax way Nathan provided and I have better
> results
> > > but
> > > > > my
> > > > > > grid shows 4 pages/links but I don't see any data.
> > > > > >
> > > > > > I added
> > > > > >
> > > > > >         <t:zone t:id="zoneGrid" id="zoneGrid">
> > > > > >             <div/>
> > > > > >             <t:grid source="streets" row="street">
> > > > > >             *[Grid here]*
> > > > > >             </t:grid>
> > > > > >         </t:zone>
> > > > > >
> > > > > > but still no luck, any one has a pointer?
> > > > > >
> > > > > > Regards,
> > > > > > Morgan
> > > > > >
> > > > > > 2016-04-25 12:07 GMT+02:00 Nathan Quirynen <
> > > > [hidden email] <javascript:;> <javascript:;>
> > > > > > <javascript:;>>:
> > > > > >
> > > > > > > Hey,
> > > > > > >
> > > > > > > By returning "this" in the onSuccess event, a redirect happens
> > > > > resulting
> > > > > > > in a new request. If you want to preserve data between
> requests,
> > > you
> > > > > will
> > > > > > > have to save it into the http session.
> > > > > > > If you add http session persistence, the data will be available
> > > > after a
> > > > > > > new request. <
> > http://tapestry.apache.org/persistent-page-data.html
> > > >
> > > > > > >
> > > > > > > Simple example for your case:
> > > > > > >
> > > > > > > @Persist
> > > > > > > @Property
> > > > > > > private Set<Street> streets;||
> > > > > > >
> > > > > > >
> > > > > > > Be careful: in this case the whole streets set is saved into
> the
> > > http
> > > > > > > session and will remain there until the end of the session (or
> > > until
> > > > > you
> > > > > > > remove it manually).
> > > > > > > You could also persist the form vaues instead and then in
> > > setupRender
> > > > > > > event fill the trees set based on these values.
> > > > > > > Also you can make use of PersistenceConstants.FLASH to let
> > Tapestry
> > > > > > remove
> > > > > > > it from the session after first access automatically.
> > > > > > > See more info:
> > > > http://tapestry.apache.org/persistent-page-data.html||
> > > > > > >
> > > > > > > Another option is making use of AJAX where the updated grid
> html
> > is
> > > > > sent
> > > > > > > back in the response and updated on the client side. If you
> want
> > to
> > > > > > achieve
> > > > > > > this you'll need to add a Zone around the grid and make your
> Form
> > > > > submit
> > > > > > > with AJAX.
> > > > > > >
> > > > > > > Your case:
> > > > > > >
> > > > > > > <t:form t:zone="zoneGrid">
> > > > > > >     ...
> > > > > > >     <t:zone t:id="zoneGrid" id="zoneGrid"
> > > > > > >         <t:grid source="streets" row="street">
> > > > > > >         </t:grid>
> > > > > > >     </t:zone>
> > > > > > > <t:form>
> > > > > > >
> > > > > > > @Inject
> > > > > > > private AjaxResponseRenderer ajax;
> > > > > > > @InjectComponent
> > > > > > > private Zone zoneGrid;
> > > > > > >
> > > > > > > void onSuccess() {
> > > > > > >     ...
> > > > > > >     ajax.addRender(zoneGrid);
> > > > > > > }
> > > > > > >
> > > > > > > See more info: http://tapestry.apache.org/ajax-and-zones.html
> > > > > > >
> > > > > > >
> > > > > > > Hope this helps u a bit.
> > > > > > > Nathan
> > > > > > >
> > > > > > >
> > > > > > > On 25/04/16 11:05, Morgan Hautman wrote:
> > > > > > >
> > > > > > >> Hi,
> > > > > > >>
> > > > > > >> I'm trying to make a make grid update when submitting a form
> > > within
> > > > > the
> > > > > > >> same page.
> > > > > > >>
> > > > > > >> Here is the code:
> > > > > > >>
> > https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7
> > > > > > >>
> > > > > > >> The page gets refreshed but the table/source doesn't seem to
> be
> > > > > updated.
> > > > > > >>
> > > > > > >> Any help is greatly appreciated.
> > > > > > >>
> > > > > > >> Regards,
> > > > > > >> Morgan
> > > > > > >>
> > > > > > >>
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Change grid on "onSuccess"

Thiago H. de Paula Figueiredo
In reply to this post by Nathan Quirynen
On Mon, 25 Apr 2016 07:07:48 -0300, Nathan Quirynen  
<[hidden email]> wrote:

> Hey,

Hi!

>
> By returning "this" in the onSuccess event, a redirect happens resulting
> in a new request. If you want to preserve data between requests, you
> will have to save it into the http session.
> If you add http session persistence, the data will be available after a
> new request. <http://tapestry.apache.org/persistent-page-data.html>
>
> Simple example for your case:
>
> @Persist
> @Property
> private Set<Street> streets;

Please don't store search results in the session. Your webapp RAM usage  
will be much larger. As Felix already suggested, store the search  
parameters instead.

> Also you can make use of PersistenceConstants.FLASH to let Tapestry
> remove it from the session after first access automatically.

+1

> Another option is making use of AJAX where the updated grid html is sent
> back in the response and updated on the client side. If you want to
> achieve this you'll need to add a Zone around the grid and make your
> Form submit with AJAX.

+1 again. :)

--
Thiago H. de Paula Figueiredo
Tapestry, Java and Hibernate consultant and developer
http://machina.com.br

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]